Радиомодуль RRD_102v 2.0 на чипе RDA5807M + ИК-модуль VS1838B (Arduino)

На странице 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
}

Comments

  1. добрый вечер,я иак понял запоминается всего 10 станций?,а есть возможность запоминать больше станций? для двух диапазонов укв и fm 10 станций критически мало.пробовал в скетче найти где это прописано ,не нашел,нашел как менять шаг настройки и все ….если можно ткните носом где поправить,заранее спасибо

Добавить комментарий

Войти с помощью: