Re: Радио RDA5807M
меню 3 не заметил ..подстройка ,работает добавляется по 0,1.сохраняет все четко,крутить только долго при переходе от укв до фм
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
forum.rcl-radio.ru → Тестирование скетчей → Радио RDA5807M
меню 3 не заметил ..подстройка ,работает добавляется по 0,1.сохраняет все четко,крутить только долго при переходе от укв до фм
Я код поправил
#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;}
Сегодня-завтра напишу статью для сайта и буду менять скетч под Вас
Как я понял меню громкости Вам не нужно, просто фиксированное значение громкости
Далее параметр:
#define RSS 25
меняет чувствительность поиска, увеличьте значение до 27-29 чтобы отбросить при поиске плохие каналы
Кнопку входа в меню поиска и подстройки убрать, переход по меню по кругу - громкость > автопоиск > подстройка - при помощи кнопки энкодера. Убрать режим STANDBY и кнопку POWER
Добавить RDS
При неактивности органов управления переходить в меню громкости через 10 секунд
Добавить IR, мне нужно знать сколько кнопок и что они будут делать.
проверил обновленную прошивку ,все работает ,автоскан, подстройка в норме,громкость работает,переключение по меню работает нормально.
по моим хотелкам,режим STANDBY и кнопка POWER не нужна.громкость на максимум вроде эта команда radio.setVolume,вместо шкалы громкости пустить RDS
управление с энкодера по кругу + IR ,с пульта управление , кнопки повторяют энкодер вправо влево ,кнопка ok (sw),если не трудно то использовать номерные кнопки пульта для прямого вкл каналов,отдельная кнопка для гашения экрана тюнера (только с пульта, если муторно то не надо )и при подстройке сделать автопоиск до следующего канала ,а не переключение по 0,1 МГЦ ....а то крутить замаешься, так вроде было сделано в варианте с IR и 1602,хотя....настраивать не так часто надо ....в общем на ваше усмотрение ....вот в общем то и все
по моим хотелкам,режим STANDBY и кнопка POWER не нужна.громкость на максимум вроде эта команда radio.setVolume,вместо шкалы громкости пустить RDS
Меню громкости не будет, RDS будет выводится в неню выбора канала
Будет 3 меню
Выбор канала
Авто поиск
Ручная настройка канала
Кнопки выбора каналов 12345676890 можно сделать, но тогда я не смогу увеличить число каналов.
Предварительный тест
Для запуска автопоиска повернуть ручку энкодера
#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);}
Кнопки выбора каналов 12345676890 можно сделать, но тогда я не смогу увеличить число каналов.
тогда не надо ....пусть лучше больше каналов будет
Тестирование 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);}
упс уже новое ...потестил прошивку ,все работает нормально,сканирование начинается по повороту энкодера,подстройка тоже все хорошо ,уровень звука выставил на 5 ,поправил надпись "пресс бутон" на "ротате энкодер",считал и выставил коды пульта.команды пульта ардуино видит,каналов все так же 10 штук.кнопки из прошивки удалил,ну они и не работают .
потестил 20 каналов настраивается и запоминается ......сбылась моя хотелка ,спасибо
Радио 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);}
добрый вечер ,рдс действительно не выводит ,да и фиг с ним ...я тут посидел посмотрел на муз центре,из 18 радиостанций передают рдс всего 6 ,да и то либо реклама с номером телефона либо просто название станции еще и с большими промежутками между пакетами инфы...так что похоже рдс нафик не нужен, там смотреть нечего,поставил прошивку без рдс ,нашелся глюк при нажатии на энкодер не переходит в режим настройки,моргнет на автотюнинг и обратно,энкодером вправо влево покрутишь тогда переключится,с пульта нормально переключается,после переключения с пульта работает один круг менюшек доходит до 1 меню и опять не хочет
на прошивке с рдс то же самое ,моргает ,покрутишь переключается до первого меню и опять моргает
Перегруз по памяти, немного оптимизировал скетч
#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 "));
}
не помогло все также моргает
счас попробую на мегу 2560 залить там памяти завались
Не торопитесь я нашел ошибку
#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 "));
}
во ....все хорошо глюк ушел ....но на мегу я успел залить )))))) все вроде нормально, энкодер только не работает
огромное СПАСИБО !!!
Еще заметил ошибку - в режиме MUTE можно перейти в меню
Поправил
У меня на 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 "));
}
я муте не использую ,так что пофиг,но прошивку обновлю как с работы вернусь вечером
блин ...как на меге 2560 энкодер заставить работать? пример загружаю в мониторе порта вижу цифры больше меньше ,на тех же пинах радио не работает,в радио по другому организовано считывание энкодера? уперся в объём памяти на уно,а хочется и шрифты русские поставить то се.... красивости не влазят (((( ну ладно ...фиг с ними с красивостями .....и так нормально
К сожалению 2560 у меня нет. Но должно работать. Шина I2C у 2560 другие (20,21 SDA SCL). Может библиотеки не все поддерживают 2560.
К сожалению 2560 у меня нет. Но должно работать. Шина I2C у 2560 другие (20,21 SDA SCL). Может библиотеки не все поддерживают 2560.
да лежит у меня запасная для 3д принтера мега вот ее и пробую ,про i2c я в курсе пробовал и так и так, на другие пины,от стандартного примера работает на любых цифровых пинах ,но там же простейшай случай,в скетче радио там с прерываниями вроде работает ....а в меге что то по другому работает,и мне просто интересно ... я уже форумы курю сижу...не получится ну и фиг с ним .....слишком жирно на меге радио собирать
forum.rcl-radio.ru → Тестирование скетчей → Радио RDA5807M
Форум работает на PunBB, при поддержке Informer Technologies, Inc
|