На странице http://rcl-radio.ru/?p=53149 был представлен пример работы радиомодуля RRD_102v 2.0 на чипе RDA5807M совместно с Arduino Nano. На этой странице приведен пример использования ИК-модуля VS1838B для управления работой радиомодуля RRD_102v 2.0, регулировка громкости, выбор каналов, автопоиск и др. будет осуществляться при помощи пульта управления.
На рисунке показано изображения пульта под команды которого написан скетч, но пульт можно применить другой, при этом коды кнопок будут соответственно другие. Даже если Вы будете использовать такой же пульт, то вероятней всего коды кнопок будут отличатся. Но в мониторе порта Вы сможете посмотреть коды кнопок и вписать в скетч свои значения.
Технические характеристики ИК-модуля VS1838B:
- Потребляемый ток: 0,5 мА
- Рабочая частота: 38 КГц
- Расстояние приема сигнала: 20 м
- Эффективный угол приема сигнала: 90˚
- Рабочее напряжение (приемник): 2,7 — 5,5 В
- Рабочее напряжение (модуль): 2,7 — 5,5 В
В меню четыре раздела, первый раздел «Громкость», в нем можно регулировать громкость (кнопки < и >) которая имеет 16 уровней, на экран выводится индикатор громкости, при не активности ИК-модуля через 10 сек выводится информация о канале и RDS канала (RDS «Radio Data System» — радиовещательная система для передачи на ультракоротких волнах вместе со звуковым сигналом небольшого количества цифровой информации).
Переход по разделам осуществляется при помощи кнопок «вверх» и «низ».
Второй раздел меню позволяет переключать каналы (кнопки < и >), которые предварительно были занесены в память при помощи третьего раздела меню — «автосканирование». Так же каналы можно переключать при помощи кнопок пульта 0-9.
Раздел «автосканирование» позволяет отсканировать весь диапазон и автоматически выбрать каналы которые имеют достаточно большой уровень сигнала. Для запуска сканирования необходимо нажать кнопку «ОК».
Последний четвертый раздел позволяет в ручном режиме изменить частоту канала, при этом если частота канала была изменена, то через 10 секунд (при не активности ИК-модуля) произойдет сохранение частоты канала в энергонезависимую память.
Все частоты каналов (10 каналов), текущий канал и уровень громкости сохраняются в энергонезависимой памяти через 60 секунд после не активности ИК-модуля.
Кнопка «#» позволяет перейти в раздел «Громкость» из любого раздела, кнопка «*» включает режим MUTE.
#include <IRremote.h> #include <Wire.h> #include <radio.h> #include <RDA5807M.h> #include <LiquidCrystal.h> #include <EEPROM.h>//#include <EEPROMex.h> #include <RDSParser.h> LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 byte a1[8]={0b00000,0b11011,0b11011,0b11011,0b11011,0b11011,0b11011,0b00000}; #define FIX_BAND RADIO_BAND_FM IRrecv irrecv(9); // указываем вывод модуля IR приемника decode_results ir; RDA5807M radio; RADIO_INFO info; RDSParser rds; char s[12]; int menu,k,f_scan[10],f,i1=8700; byte vol,bass,z,w,start,start1,g1,g2,gk1,gk2,gp1,gp2,mute,t; unsigned long time; void DisplayServiceName(char *name){lcd.setCursor(0,1);lcd.print(" ");lcd.print(name);lcd.print(" ");} void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {rds.processData(block1, block2, block3, block4);} void setup() { vol=EEPROM.read(0); for(int c=0;c<10;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);} k=EEPROM.read(3); f=EEPROM.read(1)*100+EEPROM.read(2);start=0; lcd.begin(16, 2); Serial.begin(9600); irrecv.enableIRIn(); // запускаем модуль IR radio.init(); radio.debugEnable(); lcd.createChar(0,a1); radio.setBandFrequency(FIX_BAND, f); radio.setVolume(vol); radio.setMono(false); radio.setMute(mute); radio.attachReceiveRDS(RDS_process); rds.attachServicenNameCallback(DisplayServiceName); delay(400); } void loop() { radio.formatFrequency(s, sizeof(s)); if ( irrecv.decode( &ir )) {delay(200);Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();}// IR приемник if(ir.value==0xFF18E7){menu++;radio.getRadioInfo(&info);cl();if(menu>3){menu=0;}}// меню кнопка вверх 0xFF18E7 if(ir.value==0xFF4AB5){menu--;radio.getRadioInfo(&info);cl();if(menu<0){menu=3;}}// меню кнопка вниз 0xFF4AB5 if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(400);radio.getRadioInfo(&info);start=1;} if(menu==0){// ГРОМКОСТЬ kan(); if(ir.value==0xFF5AA5){vol++;g1=1;g2=0;if(vol>15){vol=15;}radio.setVolume(vol);cl2();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and g1==1){vol++;g2=0;if(vol>15){vol=15;}radio.setVolume(vol);cl2();}// кнопка >>>>>> if(ir.value==0xFF10EF){vol--;g1=0;g2=1;if(vol>16){vol=0;}radio.setVolume(vol);cl2();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and g2==1){vol--;g1=0;if(vol>16){vol=0;}radio.setVolume(vol);cl2();}// кнопка <<<<<< lcd.setCursor(0,0);lcd.print(" ");lcd.print(s); lcd.setCursor(0,1); if(millis()-time<5000){for(z=0;z<=vol;z++){lcd.setCursor(z,1);lcd.write((uint8_t)0);}} if(millis()-time>5000 and millis()-time<10000){ lcd.print(info.tuned ? " TUNED" : " -----"); lcd.print(info.stereo ? " STEREO " : " MONO ");} if(millis()-time>10000){radio.checkRDS();} // RDS } if(menu==1){// КАНАЛЫ if(ir.value==0xFF5AA5){k++;gk1=1;gk2=0;if(k>9){k=9;}f=f_scan[k];cl();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and gk1==1){k++;gk2=0;if(k>9){k=9;}f=f_scan[k];cl();}// кнопка >>>>>> if(ir.value==0xFF10EF){k--;gk1=0;gk2=1;if(k<0){k=0;}f=f_scan[k];cl();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and gk2==1){k--;gk1=0;if(k>9){k=9;}f=f_scan[k];cl();}// кнопка <<<<<< if(start1==0){f=f_scan[k];start=0;start1=1;} lcd.setCursor(0,0);lcd.print("K");lcd.print(k); if(f_scan[k]!=0){lcd.print(" ");lcd.print((float)f_scan[k]/100);lcd.print(" MHz ");}else{lcd.print(" N/A ");} radio.getRadioInfo(&info); lcd.setCursor(0,1);lcd.print(info.tuned ? "TUNED" : "-----"); lcd.print(" SIGNAL ");lcd.print(info.rssi); } if(menu==2){// АВТО ПОИСК КАНАЛОВ lcd.setCursor(0,0);lcd.print("AUTOSCAN"); if(ir.value==0xFF38C7){// кнопка OK 0xFF38C7 ir.value=0; for(int i=0;i<10;i++){ for(i1;i1<=10800;i1=i1+10){ radio.setBandFrequency(FIX_BAND, i1);delay(300); radio.getRadioInfo(&info);delay(500); if(info.tuned==1 and info.rssi>26){f_scan[i]=i1;i1=f_scan[i]+10;if(i1>=10800){f_scan[i]=0;}break;} lcd.setCursor(9,0); lcd.print((float)i1/100); } lcd.setCursor(0,1);lcd.print(i);lcd.print(" ");lcd.print((float)f_scan[i]/100);lcd.print(" MHz "); }delay(1000);time=millis();i1=8700;eeprom();k=0;start1=0;menu=1;}} if(menu==3){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА if(ir.value==0xFF5AA5){gp1=1;gp2=0;f=f+10;if(f<8700){f=8700;}t=1;cl1();}// кнопка > 0xFF5AA5 if(ir.value==0xFFFFFFFF and gp1==1){gp2=0;f=f+10;if(f<8700){f=8700;}t=1;cl1();}// кнопка >>>>>> if(ir.value==0xFF10EF){gp1=0;gp2=1;f=f-10;if(f>10800){f=10800;}t=1;cl1();}// кнопка < 0xFF10EF if(ir.value==0xFFFFFFFF and gp2==1){gp1=0;f=f-10;if(f>10800){f=10800;}t=1;cl1();}// кнопка <<<<<< lcd.setCursor(0,0);lcd.print("< ");lcd.print((float)f/100);lcd.print(" MHz >"); radio.getRadioInfo(&info); lcd.setCursor(0,1);lcd.print(info.tuned ? "TUNED" : "-----"); lcd.print(" SIGNAL ");lcd.print(info.rssi); if(millis()-time>10000 and t==1){f_scan[k]=f;t=0;EEPROM.update(10+k,f_scan[k]/100);EEPROM.update(100+k,f_scan[k]-(f_scan[k]/100)*100); if(millis()-time<11000){lcd.setCursor(0,1);lcd.print(" SAVE ");delay(1000);}} } if(millis()-time>60000 && w==1){EEPROM.update(0,vol);EEPROM.update(3,k);EEPROM.update(1,f_scan[k]/100);EEPROM.update(2,f_scan[k]-(f_scan[k]/100)*100);w=0;} if(millis()-time>10000 and menu==1){menu=0;time=millis();lcd.clear();} if(ir.value==0xFFB04F){ir.value=0;menu=0;time=millis();lcd.clear();}// кнопка # 0xFFB04F if(ir.value==0xFF6897){mute++;ir.value=0;delay(200);// кнопка * 0xFF6897 if(mute>1){mute=0;menu=0;start=0;time=millis();lcd.clear();} if(mute==1){menu=-1;radio.setMute(mute);lcd.clear();lcd.setCursor(6,0);lcd.print("MUTE");}} } // LOOP void eeprom(){for(int b=0;b<10;b++){EEPROM.update(10+b,f_scan[b]/100);EEPROM.update(100+b,f_scan[b]-(f_scan[b]/100)*100);}} void kan1(){ir.value=0;delay(200);f=f_scan[k];w=1;time=millis();start=0;lcd.clear();} void cl(){ir.value=0;time=millis();start=0;w=1;delay(200);lcd.clear();} void cl1(){ir.value=0;time=millis();start=0;w=1;delay(200);} void cl2(){ir.value=0;time=millis();w=1;delay(200);lcd.clear();} void kan(){ if(ir.value==0xFF9867){k=0;kan1();}// канал 0 кнопка 0 0xFF9867 if(ir.value==0xFFA25D){k=1;kan1();}// канал 1 кнопка 1 0xFFA25D if(ir.value==0xFF629D){k=2;kan1();}// канал 2 кнопка 2 0xFF629D if(ir.value==0xFFE21D){k=3;kan1();}// канал 3 кнопка 3 0xFFE21D if(ir.value==0xFF22DD){k=4;kan1();}// канал 4 кнопка 4 0xFF22DD if(ir.value==0xFF02FD){k=5;kan1();}// канал 5 кнопка 5 0xFF02FD if(ir.value==0xFFC23D){k=6;kan1();}// канал 6 кнопка 6 0xFFC23D if(ir.value==0xFFE01F){k=7;kan1();}// канал 7 кнопка 7 0xFFE01F if(ir.value==0xFFA857){k=8;kan1();}// канал 8 кнопка 8 0xFFA857 if(ir.value==0xFF906F){k=9;kan1();}// канал 9 кнопка 9 0xFF906F }
добрый вечер,я иак понял запоминается всего 10 станций?,а есть возможность запоминать больше станций? для двух диапазонов укв и fm 10 станций критически мало.пробовал в скетче найти где это прописано ,не нашел,нашел как менять шаг настройки и все ….если можно ткните носом где поправить,заранее спасибо
нашел где при сканировании меняет for(int i=0;i<15;i++){//кол-во каналов
но при переключении кнопкой вправо доходит до 9 и все
нашел где при сканировании меняет for(int i=0;i<15;i++){//кол-во каналов
но при переключении кнопкой вправо доходит до 9 и все
все разобрался ….спасибо ))))
блин …..не запоминает станции больше 9 канала
Строку EEPROM тоже править надо
void eeprom(){for(int b=0;b<10;b++){EEPROM.update(10+b,f_scan[b]/100);EEPROM.update(100+b,f_scan[b]-(f_scan[b]/100)*100);}}
спасибо попробую