26

Re: Радио RDA5807M

меню 3 не заметил ..подстройка ,работает добавляется по 0,1.сохраняет все четко,крутить только долго при переходе от укв до фм

27

Re: Радио RDA5807M

Я код поправил

#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <RDSParser.h>         // >> radio.h
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>

RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK

int v_pos,menu,vol,f0,f_scan[10],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t, power;
byte start1,start;
int z;


void setup(){
  delay(300);
  Wire.begin();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(vol);
  radio.setMono(false);
  radio.setMute(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,"RDA5807M");
  u8g.drawStr(40,50,"RADIO FM");
  } 
  while( u8g.nextPage() );
  delay(1000);
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
//////////////////////////////////////////////////////////////////////////////////////////////////  
  if(digitalRead(10)==LOW && menu<2){menu++;if(menu>1){menu=0;}w=1;w2=1;delay(200);}
  if(digitalRead(2)==LOW && menu<2){menu=2;times=millis();w=1;w2=1;delay(200);}
  if(digitalRead(2)==LOW && menu==2){menu=3;times=millis();times1=millis()-10000;w=1;w2=1;delay(200);}
  if(digitalRead(2)==LOW && menu==3){menu=0;times=millis();w=1;w2=1;delay(200);}

  if(digitalRead(3)==LOW && power==0){power=1;radio.setMute(true);digitalWrite(4,LOW);
    u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(40,30,"POWER OFF");}
    while( u8g.nextPage() );menu=100;delay(1000);u8g.firstPage();do {} while( u8g.nextPage() );}
  if(digitalRead(3)==LOW && power==1){power=0;radio.setMute(false);menu=0;digitalWrite(4,HIGH);delay(200);}
  
//////////////////////////////////////////////////////////////////////////////////////////////////   
  if(menu==0){ // ГРОМКОСТЬ
   if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
    vol=vol+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(vol>15){vol=15;}if(vol<0){vol=0;}radio.setVolume(vol);Serial.println(vol);}
 
    u8g.firstPage();do {
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    u8g.drawStr(0,40,"VOLUME");for(int v_pos=0; v_pos<vol*4+1;v_pos+=4){u8g.drawBox(v_pos+53,32, 2, 8);}
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    }
  while( u8g.nextPage() );
    }
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==1){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(k>9){k=9;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,"CHANNEL");u8g.setPrintPos(80, 40);u8g.print(k+1); 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    }
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==2){// АВТО ПОИСК КАНАЛОВ
     if(digitalRead(10)==LOW){
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<10;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<10;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=1;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,"AUTOSCAN");
    u8g.drawStr(30,40,"PRESS BUTTON");
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==3){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,"SAVE");}
      else{u8g.drawStr(15,40,"FREQUENCY TUNING");}
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>5000 && 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;}
 }  
 
void to_Timer(){newPosition = myEnc.read()/4;} 

28

Re: Радио RDA5807M

Сегодня-завтра напишу статью для сайта и буду менять скетч под Вас

Как я понял меню громкости Вам не нужно, просто фиксированное значение громкости

Далее параметр:
#define RSS 25 
меняет чувствительность поиска, увеличьте значение до 27-29 чтобы отбросить при поиске плохие каналы

Кнопку входа в меню поиска и подстройки убрать, переход по меню по кругу - громкость > автопоиск > подстройка - при помощи кнопки энкодера. Убрать режим STANDBY и кнопку POWER

Добавить RDS

При неактивности органов управления переходить в меню громкости через 10 секунд

Добавить IR, мне нужно знать сколько кнопок и что они будут делать.

29 (2023-08-25 22:41:20 отредактировано Hromas2006)

Re: Радио RDA5807M

проверил обновленную прошивку ,все работает ,автоскан, подстройка в норме,громкость работает,переключение по меню работает нормально.
по моим хотелкам,режим STANDBY и кнопка POWER не нужна.громкость на максимум вроде эта команда radio.setVolume,вместо шкалы громкости пустить RDS
управление с энкодера по кругу + IR ,с пульта управление , кнопки повторяют энкодер вправо влево ,кнопка ok (sw),если не трудно то использовать номерные кнопки пульта для прямого вкл каналов,отдельная кнопка для гашения экрана тюнера (только с пульта, если муторно то не надо )и при подстройке сделать автопоиск до следующего канала ,а не переключение по  0,1 МГЦ ....а то крутить замаешься, так вроде было сделано в варианте с IR и 1602,хотя....настраивать не так часто надо ....в общем на ваше усмотрение ....вот в общем то и все

30

Re: Радио RDA5807M

по моим хотелкам,режим STANDBY и кнопка POWER не нужна.громкость на максимум вроде эта команда radio.setVolume,вместо шкалы громкости пустить RDS

Меню громкости не будет, RDS будет выводится в неню выбора канала

Будет 3 меню

Выбор канала
Авто поиск
Ручная настройка канала

Кнопки выбора каналов 12345676890 можно сделать, но тогда я не смогу увеличить число каналов.

31

Re: Радио RDA5807M

Предварительный тест

Для запуска автопоиска повернуть ручку энкодера

#define MENU    0x33B820DF 
#define UP      0x33B8946B 
#define DW      0x33B810EF 


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <RDSParser.h>         // >> radio.h
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 

RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[10],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t,gr1,gr2;
byte start1,start;
int z;


void setup(){
  delay(300);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  radio.setMute(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,"RDA5807M");
  u8g.drawStr(40,50,"RADIO FM");
  } 
  while( u8g.nextPage() );
  delay(1000);
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW){menu++;if(menu>2){menu=0;}w=1;w2=1;times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
  
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(k>9){k=9;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,"CHANNEL");u8g.setPrintPos(80, 40);u8g.print(k+1); 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    }
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0){newPosition=0;
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<10;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<10;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,"AUTOSCAN");
    u8g.drawStr(30,40,"PRESS BUTTON");
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,"SAVE");}
      else{u8g.drawStr(15,40,"FREQUENCY TUNING");}
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>5000 && 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;}
 }  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}

32

Re: Радио RDA5807M

Кнопки выбора каналов 12345676890 можно сделать, но тогда я не смогу увеличить число каналов.

тогда не надо ....пусть лучше больше каналов будет

33

Re: Радио RDA5807M

Тестирование 20 каналов

#define MENU    0x33B820DF 
#define UP      0x33B8946B 
#define DW      0x33B810EF 


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <RDSParser.h>         // >> radio.h
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
 

RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t,gr1,gr2;
byte start1,start;
int z;


void setup(){
  delay(300);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  radio.setMute(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,"RDA5807M");
  u8g.drawStr(40,50,"RADIO FM");
  } 
  while( u8g.nextPage() );
  delay(1000);
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW){menu++;if(menu>2){menu=0;}w=1;w2=1;times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;times1=millis();}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   
  
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;times=millis();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,"CHANNEL");u8g.setPrintPos(80, 40);u8g.print(k+1); 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    }
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0){newPosition=0;
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,"AUTOSCAN");
    u8g.drawStr(30,40,"PRESS BUTTON");
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,"SAVE");}
      else{u8g.drawStr(15,40,"FREQUENCY TUNING");}
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>5000 && 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;}
 }  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}

34 (2023-08-27 12:54:22 отредактировано Hromas2006)

Re: Радио RDA5807M

упс уже новое ...потестил прошивку ,все работает нормально,сканирование начинается по повороту энкодера,подстройка тоже все хорошо ,уровень звука выставил на 5 ,поправил надпись "пресс бутон" на "ротате энкодер",считал и выставил коды пульта.команды пульта ардуино видит,каналов все так же 10 штук.кнопки из прошивки удалил,ну они и не работают .

35

Re: Радио RDA5807M

потестил 20 каналов настраивается и запоминается ......сбылась моя хотелка ,спасибо

36

Re: Радио RDA5807M

Радио RDS наверное не получится, тестовый скетч выводит RDS, но скетч с дисплеем и другими уст-вами RDS не выводит.

Вот скетч с RDS, должен выводиться в первом меню внизу, я меня не выводится. Загрузите , может у Вас заработает, а то у меня толком ни чего не ловит, только 2 станции.

#define MENU    0xD2A29631 
#define UP      0xD59EDB7F 
#define DW      0xF002CFC4
#define MUTE    0x52E6CBFC


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <RDSParser.h>         // >> radio.h
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1, times_rds;
bool w,w2,t,gr1,gr2,mute;
byte start1,start;
int z;

void DisplayServiceName(char *name){u8g.drawStr(40,60,name);} 
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {
  rds.processData(block1, block2, block3, block4);
}

void setup(){
  delay(300);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,"RDA5807M");
  u8g.drawStr(40,50,"RADIO FM");
  } 
  while( u8g.nextPage() );
  delay(1000);
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW || ir.value==MENU){menu++;cl();if(menu>2){menu=0;}w=1;w2=1;times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   

   if(ir.value==MUTE && mute==0){mute=1;radio.setMute(true);gr1=1;gr2=0;cl();menu=100;
      u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if(ir.value==MUTE && mute==1){mute=0;radio.setMute(false);gr1=1;gr2=0;cl();menu=0;}   
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}

    if(ir.value==UP){k++;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка > 
    if(ir.value==DW){k--;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка < 
    
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,"CHANNEL");u8g.setPrintPos(80, 40);u8g.print(k+1); 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
    radio.checkRDS();
 /*
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");     }
*/    }
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0 || ir.value==UP || ir.value==DW){newPosition=0;cl();
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,"AUTOSCAN");
    u8g.drawStr(25,40,"ROTARY ENCODER");
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}

    if(ir.value==UP){f+=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка > 
    if(ir.value==DW){f-=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка < 
      
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,"SAVE");}
      else{u8g.drawStr(15,40,"FREQUENCY TUNING");}
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>10000 && w==1 && mute==0){menu=0;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;}
 }  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}

Вот скетч без RDS
Пульт добавлен, коды кнопок укажите в скетче

#define MENU    0xD2A29631 
#define UP      0xD59EDB7F 
#define DW      0xF002CFC4
#define MUTE    0x52E6CBFC


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <RDSParser.h>         // >> radio.h
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
RDA5807M radio; 
RADIO_INFO info;
RDSParser rds;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1, times_rds;
bool w,w2,t,gr1,gr2,mute;
byte start1,start;
int z;

void DisplayServiceName(char *name){u8g.drawStr(40,60,name);} 
void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {
  rds.processData(block1, block2, block3, block4);
}

void setup(){
  delay(300);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  radio.debugEnable();
  radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachServicenNameCallback(DisplayServiceName);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,"RDA5807M");
  u8g.drawStr(40,50,"RADIO FM");
  } 
  while( u8g.nextPage() );
  delay(1000);
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW || ir.value==MENU){menu++;cl();if(menu>2){menu=0;}w=1;w2=1;times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   

   if(ir.value==MUTE && mute==0){mute=1;radio.setMute(true);gr1=1;gr2=0;cl();menu=100;
      u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,"MUTE");} while( u8g.nextPage() );}
   if(ir.value==MUTE && mute==1){mute=0;radio.setMute(false);gr1=1;gr2=0;cl();menu=0;}   
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}

    if(ir.value==UP){k++;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка > 
    if(ir.value==DW){k--;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка < 
    
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,"CHANNEL");u8g.setPrintPos(80, 40);u8g.print(k+1); 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);
   // radio.checkRDS();
 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");     }
   
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0 || ir.value==UP || ir.value==DW){newPosition=0;cl();
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,"AUTOSCAN");
    u8g.drawStr(25,40,"ROTARY ENCODER");
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}

    if(ir.value==UP){f+=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка > 
    if(ir.value==DW){f-=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка < 
      
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"MHz"); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,"SAVE");}
      else{u8g.drawStr(15,40,"FREQUENCY TUNING");}
    u8g.drawLine(0, 46, 128, 46); 
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,"dBm |");
    u8g.drawStr(50,60,info.tuned  ? "TUNED"  : "-----");
    u8g.drawStr(80,60,info.stereo ? " STEREO  " : "  MONO   ");
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>10000 && w==1 && mute==0){menu=0;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;}
 }  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}

37

Re: Радио RDA5807M

добрый вечер ,рдс действительно не выводит ,да и фиг с ним ...я тут посидел посмотрел на муз центре,из 18 радиостанций передают рдс всего 6 ,да и то либо реклама с номером телефона либо просто название станции еще и с большими промежутками между пакетами инфы...так что похоже рдс нафик не нужен, там смотреть нечего,поставил прошивку без рдс ,нашелся глюк при нажатии на энкодер не переходит в режим настройки,моргнет на автотюнинг и обратно,энкодером вправо влево покрутишь тогда переключится,с пульта нормально переключается,после переключения с пульта работает один круг менюшек доходит до 1 меню и опять не хочет

38

Re: Радио RDA5807M

на прошивке с рдс то же самое ,моргает ,покрутишь переключается до первого меню и опять моргает

39

Re: Радио RDA5807M

Перегруз по памяти, немного оптимизировал скетч

#define MENU    0xD2A29631 
#define UP      0xD59EDB7F 
#define DW      0xF002CFC4
#define MUTE    0x52E6CBFC


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t,gr1,gr2,mute;
byte start1,start;
int z;

void setup(){
  delay(1000);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  //radio.debugEnable();
  radio.setMute(false);
  //radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,F("RDA5807M"));
  u8g.drawStr(40,50,F("RADIO FM"));
  } 
  while( u8g.nextPage() );
  delay(1000);
  
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW || ir.value==MENU){menu++;cl();if(menu>2){menu=0;}w=1;w2=1;times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   

   if(ir.value==MUTE && mute==0){mute=1;radio.setMute(true);gr1=1;gr2=0;cl();menu=100;
      u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,F("MUTE"));} while( u8g.nextPage() );}
   if(ir.value==MUTE && mute==1){mute=0;radio.setMute(false);gr1=1;gr2=0;cl();menu=0;}   
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}

    if(ir.value==UP){k++;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка > 
    if(ir.value==DW){k--;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка < 
    
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz"));}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,F("CHANNEL"));u8g.setPrintPos(80, 40);u8g.print(k+1); 
    info_();    }
   
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0 || ir.value==UP || ir.value==DW){newPosition=0;cl();
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"F(MHz)");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    info_();
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,F("AUTOSCAN"));
    u8g.drawStr(25,40,F("ROTARY ENCODER"));
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}

    if(ir.value==UP){f+=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка > 
    if(ir.value==DW){f-=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка < 
      
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz")); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,F("SAVE"));}
      else{u8g.drawStr(15,40,F("FREQUENCY TUNING"));}
    info_();
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>10000 && w==1 && mute==0){menu=0;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;}
}  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}
void info_(){ 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);   
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,F("dBm |"));
    u8g.drawStr(50,60,info.tuned  ? F("TUNED")  : F("-----"));
    u8g.drawStr(80,60,info.stereo ? F(" STEREO  ") : F("  MONO   "));
    }

40

Re: Радио RDA5807M

не помогло sad  все также моргает

41

Re: Радио RDA5807M

счас попробую на мегу 2560 залить там памяти завались

42

Re: Радио RDA5807M

Не торопитесь я нашел ошибку

43

Re: Радио RDA5807M

#define MENU    0xD2A29631 
#define UP      0xD59EDB7F 
#define DW      0xF002CFC4
#define MUTE    0x52E6CBFC


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t,gr1,gr2,mute;
byte start1,start;
int z;

void setup(){
  delay(1000);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  //radio.debugEnable();
  radio.setMute(false);
  //radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,F("RDA5807M"));
  u8g.drawStr(40,50,F("RADIO FM"));
  } 
  while( u8g.nextPage() );
  delay(1000);
  
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if(digitalRead(10)==LOW || ir.value==MENU){menu++;cl();if(menu>2){menu=0;}w=1;w2=1;times=millis();times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   

   if(ir.value==MUTE && mute==0){mute=1;radio.setMute(true);gr1=1;gr2=0;cl();menu=100;
      u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,F("MUTE"));} while( u8g.nextPage() );}
   if(ir.value==MUTE && mute==1){mute=0;radio.setMute(false);gr1=1;gr2=0;cl();menu=0;}   
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}

    if(ir.value==UP){k++;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка > 
    if(ir.value==DW){k--;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка < 
    
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz"));}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,F("CHANNEL"));u8g.setPrintPos(80, 40);u8g.print(k+1); 
    info_();    }
   
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0 || ir.value==UP || ir.value==DW){newPosition=0;cl();
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"F(MHz)");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    info_();
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,F("AUTOSCAN"));
    u8g.drawStr(25,40,F("ROTARY ENCODER"));
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}

    if(ir.value==UP){f+=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка > 
    if(ir.value==DW){f-=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка < 
      
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz")); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,F("SAVE"));}
      else{u8g.drawStr(15,40,F("FREQUENCY TUNING"));}
    info_();
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>10000 && w==1 && mute==0){menu=0;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;}
}  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}
void info_(){ 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);   
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,F("dBm |"));
    u8g.drawStr(50,60,info.tuned  ? F("TUNED")  : F("-----"));
    u8g.drawStr(80,60,info.stereo ? F(" STEREO  ") : F("  MONO   "));
    }

44 (2023-08-27 21:42:23 отредактировано Hromas2006)

Re: Радио RDA5807M

во ....все хорошо глюк ушел smile ....но на мегу я успел залить )))))) все вроде нормально, энкодер только не работает
огромное СПАСИБО !!!

45

Re: Радио RDA5807M

Еще заметил ошибку - в режиме MUTE можно перейти в меню

46

Re: Радио RDA5807M

Поправил

У меня на NANO вроде все работает нормально

#define MENU    0xD2A29631 
#define UP      0xD59EDB7F 
#define DW      0xF002CFC4
#define MUTE    0x52E6CBFC


#define FIX_BAND    RADIO_BAND_FM  
#define RSS 25
#define DELAY_CH 500
#define VOLUME 1

#include <Wire.h>
#include <radio.h>             // http://rcl-radio.ru/wp-content/uploads/2023/08/radio.zip
#include <RDA5807M.h>          // http://rcl-radio.ru/wp-content/uploads/2023/08/RDA5807-master.zip
#include <MsTimer2.h>          // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>           // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h>            // https://github.com/olikraus/u8glib/
#include <EEPROM.h>
#include <boarddefs.h>         // входит в состав библиотеки IRremote
#include <IRremote.h>          // http://rcl-radio.ru/wp-content/uploads/2019/06/IRremote.zip
RDA5807M radio; 
RADIO_INFO info;
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
Encoder myEnc(9, 8);// DT, CLK
IRrecv irrecv(12); // указываем вывод модуля IR приемника
decode_results ir; 

int v_pos,menu,vol,f0,f_scan[20],k,i1=8700,i;
float f;
long oldPosition  = -999,newPosition, times, times1;
bool w,w2,t,gr1,gr2,mute;
byte start1,start;
int z;

void setup(){
  delay(1000);
  Wire.begin();
  irrecv.enableIRIn();
  if(EEPROM.read(300)!=0){for(int i=0;i<301;i++){EEPROM.update(i,0);}}
  vol=EEPROM.read(0);
  for(int c=0;c<20;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;
  pinMode(10,INPUT);        // encoder SW
  pinMode(2,INPUT_PULLUP); // КНОПКА SET 
  pinMode(3,INPUT_PULLUP); // КНОПКА POWER  
  pinMode(4,OUTPUT);       // OUT STANDBY
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  Serial.begin(9600);
  radio.init();
  //radio.debugEnable();
  radio.setMute(false);
  //radio.setBandFrequency(FIX_BAND, f);
  radio.setVolume(VOLUME);
  radio.setMono(false);
  u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);
  u8g.drawStr(40,20,F("RDA5807M"));
  u8g.drawStr(40,50,F("RADIO FM"));
  } 
  while( u8g.nextPage() );
  delay(1000);
  
  }

void loop(){
  if(start==0){radio.setBandFrequency(FIX_BAND, f);delay(100);radio.getRadioInfo(&info);start=1;}
  
  if((digitalRead(10)==LOW || ir.value==MENU)&&mute==0){menu++;cl();if(menu>2){menu=0;}w=1;w2=1;times=millis();times1=millis()-10000;delay(200);}
/// IR ////////////////////////////////////////
   if ( irrecv.decode( &ir )) {Serial.print("0x");Serial.println( ir.value,HEX);irrecv.resume();times=millis();w=1;w2=1;}// IR приемник - чтение, в мониторе порта отображаются коды кнопок
   if(ir.value==0){gr1=0;gr2=0;}// запрет нажатий не активных кнопок пульта   

   if(ir.value==MUTE && mute==0){mute=1;radio.setMute(true);gr1=1;gr2=0;cl();menu=100;
      u8g.firstPage();do {u8g.setFont(u8g_font_profont12r);u8g.drawStr(53,30,F("MUTE"));} while( u8g.nextPage() );}
   if(ir.value==MUTE && mute==1){mute=0;radio.setMute(false);gr1=1;gr2=0;cl();menu=0;}   
////////////////////////////////////////////////////////////////////////////////////////
   if(menu==0){ // КАНАЛЫ 
    if(start1==0){f=f_scan[k];start=0;start1=1;radio.setBandFrequency(FIX_BAND, f);}

    if(ir.value==UP){k++;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка > 
    if(ir.value==DW){k--;gr1=1;gr2=0;cl();w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}// кнопка < 
    
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      k=k+newPosition;myEnc.write(0);newPosition=0;w=1;w2=1;if(k>19){k=19;}if(k<0){k=0;}times=millis();start=0;f=f_scan[k];}
    
    u8g.firstPage();do { 
    if(f_scan[k]!=0){u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)f_scan[k]/100); 
      u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz"));}
        else{u8g.setFont(u8g_font_profont17r);u8g.drawStr(45, 18,"N/A");}
    u8g.drawLine(0, 25, 128, 25);  u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(0,40,F("CHANNEL"));u8g.setPrintPos(80, 40);u8g.print(k+1); 
    info_();    }
   
  while( u8g.nextPage() );
   }   
/////////////////////////////////////////////////////////////////////////////////////////
    if(menu==1){// АВТО ПОИСК КАНАЛОВ
     if(newPosition != oldPosition){oldPosition = newPosition;;myEnc.write(0);}
     if(newPosition!=0 || ir.value==UP || ir.value==DW){newPosition=0;cl();
     for(int i=10;i<301;i++){EEPROM.update(i,0);}
     for(int c=0;c<20;c++){f_scan[c]=EEPROM.read(10+c)*100+EEPROM.read(100+c);}
     for(i=0;i<20;i++){
     for(i1;i1<=10800;i1=i1+10){
      radio.setBandFrequency(FIX_BAND, i1);delay(DELAY_CH);
      radio.getRadioInfo(&info);
    if(info.tuned==1 and info.rssi>RSS){f_scan[i]=i1;f0=f_scan[i];i1=f_scan[i]+10;
    EEPROM.update(10+i,f_scan[i]/100);EEPROM.update(100+i,f_scan[i]-(f_scan[i]/100)*100);
    if(i1>=10800){f_scan[i]=0;}break;}  
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print((float)i1/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,"F(MHz)");
    u8g.drawLine(0, 25, 128, 25);
    u8g.drawStr(5,40,"CH");u8g.setPrintPos(20, 40);u8g.print(i); 
    u8g.setFont(u8g_font_profont12r);u8g.setPrintPos(50, 40);u8g.print((float)f0/100);u8g.drawStr(110,40,"MHz");
    info_();
      }
 while( u8g.nextPage() );
  }}
 delay(1000);times=millis();i1=8700;k=0;start1=0;menu=0;}
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont12r);
    u8g.drawStr(40,20,F("AUTOSCAN"));
    u8g.drawStr(25,40,F("ROTARY ENCODER"));
    }while( u8g.nextPage() );
}     
////////////////////////////////////////////////////////////////////////////////////////// 
 if(menu==2){// ПОДСТРОЙКА ЧАСТОТЫ КАНАЛА
    if(newPosition != oldPosition){oldPosition = newPosition;if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}
      f=f+newPosition*10;myEnc.write(0);newPosition=0;times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}

    if(ir.value==UP){f+=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка > 
    if(ir.value==DW){f-=10;gr1=1;gr2=0;cl();times=millis();t=1;w=1;w2=1;if(f<8700){f=8700;}if(f>10800){f=10800;}times1=millis();start=0;}// кнопка < 
      
    u8g.firstPage();do {  
    u8g.setFont(u8g_font_profont29r);u8g.setPrintPos(5, 20);u8g.print(f/100);  
    u8g.setFont(u8g_font_profont12r);u8g.drawStr(110,20,F("MHz")); 
    u8g.drawLine(0, 25, 128, 25);  
    if(millis()-times1<1000){u8g.drawStr(50,40,F("SAVE"));}
      else{u8g.drawStr(15,40,F("FREQUENCY TUNING"));}
    info_();
    if(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);}
      }
 while( u8g.nextPage() );
  }
  
 delay(10);
 if(millis()-times>10000 && w==1 && mute==0){menu=0;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;}
}  
 
void to_Timer(){newPosition = myEnc.read()/4;} 
void cl(){ir.value=0;delay(100);}
void info_(){ 
    u8g.drawLine(0, 46, 128, 46); 
    radio.getRadioInfo(&info);   
    u8g.setPrintPos(0, 60);u8g.print(info.rssi);u8g.drawStr(15,60,F("dBm |"));
    u8g.drawStr(50,60,info.tuned  ? F("TUNED")  : F("-----"));
    u8g.drawStr(80,60,info.stereo ? F(" STEREO  ") : F("  MONO   "));
    }

47

Re: Радио RDA5807M

я муте не использую ,так что пофиг,но прошивку обновлю как с работы вернусь вечером

48 (2023-08-28 22:18:43 отредактировано Hromas2006)

Re: Радио RDA5807M

блин ...как на меге 2560 энкодер заставить работать? пример загружаю в мониторе порта вижу цифры больше меньше ,на тех же пинах радио не работает,в радио по другому организовано считывание энкодера? уперся в объём памяти на уно,а хочется и шрифты русские поставить то се.... красивости не влазят ((((   ну ладно ...фиг с ними с красивостями .....и так нормально

49

Re: Радио RDA5807M

К сожалению 2560 у меня нет. Но должно работать. Шина I2C у 2560 другие (20,21 SDA SCL). Может библиотеки не все поддерживают 2560.

50

Re: Радио RDA5807M

liman324 пишет:

К сожалению 2560 у меня нет. Но должно работать. Шина I2C у 2560 другие (20,21 SDA SCL). Может библиотеки не все поддерживают 2560.

да лежит у меня запасная для 3д принтера мега вот ее и пробую ,про i2c я в курсе пробовал и так и так, на другие пины,от стандартного примера работает на любых цифровых пинах ,но там же простейшай случай,в скетче радио там с прерываниями вроде работает ....а в меге что то по другому работает,и мне просто интересно ... я уже форумы курю сижу...не получится ну и фиг с ним .....слишком жирно на меге радио собирать