| Ваш IP: 34.228.42.25 | Online(50) - гости: 18, боты: 32 | Загрузка сервера: 1.64 ::::::::::::

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

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

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

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

Случайные статьи

  • Источник опорного напряжения

    Источник опорного напряжения

    На рисунке показана схема источника опорного напряжение, который может работать от двух батареек AA в течении 18 месяцев. Дрейф напряжения не более 5,5 мкВ  / ° С. Выходное напряжение источника 1,23 В при 25 ° C. Регулировка выхода опорного напряжения не более чем на 120мВ.Подробнее...
  • BA5417 стерео-усилитель 2*5Вт

    BA5417 стерео-усилитель 2*5Вт

    Усилитель на базе ВА5417 имеет выходную мощность 5 Вт на канал при 4 ом нагрузке, питание 12В (от 6 до 15В) постоянного напряжения. Усилитель на BA5417 имеет отличное качество звука и низкий коэффициент нелинейных искажений, не более 0,1% на частоте 1 кГц при Рвых=0, 5Вт. SA1 — включение режима ОЖИДАНИЕ …Подробнее...
  • Термометр на PIC16F628A (-55…+125 гр. Цельсия)

    Термометр на PIC16F628A (-55…+125 гр. Цельсия)

    На рисунке показана схема термометра выполненного на основе микроконтроллера PIC16F628A, в качестве датчика используется цифровой датчик температуры DS18B20. Индикатор термометра состоит из 4-х разрадного семисегментного индикатора. Диапазон измеряемой температуры от -55 до + 125 градусов Цельсия. Температура считывается каждые 15 секунд, время считывания можно изменить в коде.   Напряжение питания термометра 5В, …Подробнее...
  • Высокоточный стабилизатор

    Высокоточный стабилизатор

    Можно добиться суммарной нестабильности вызванной изменением нагрузки, входного напряжения и температуры менее 0,01% применив схему показанную на рисунке. R4 определяет ток через стабилитрон, ток стабилитрона определяет температурный дрейф. R2 и R3 высокоточные резисторы. Литература — Джеймс Уитсон — 500 практических схем на ИСПодробнее...
  • Медный обмоточный провод

    В табл. представлены обмоточные провода ПЭВ-1 ПЭВ-2, они одножильные с винифлексовой изоляцией(лак). ПЭВ- 1-однослойная изоляция 2-двухслойная. Провода рассчитаны на работу при температуре от -60 до 105 градусов Цельсия. Ресурс провода при макс. температуре 20000 часов.Подробнее...