Карманное FM Радио на RDA5807, IIC Oled 0.96" и Arduino Pro Mini
- Войдите на сайт для отправки комментариев
Здравствуйте Форумчане. Как-то на глаза попался маленький фм модуль RDA5807 и решил я замутить проект, так как радио слушаю практически постоянно, да и руки "набивать" в программировании и фоторезисте нужно. Облазил весь форум в поиске подобных проектов, но кроме пары тем в "аппаратных вопросах" ничего не нашел. На других форумах таких проектов много. Непорядок, нужно заполнить пробел. Динамики с усилком решил не прикручивать - миниджек универсальнее. Ну и устройство должно быть более-менее компактным.
Плату развел в SprintLayout 6.0.
Oled дисплей выбрал в связи с его компактностью да и их у меня уже несколько штук из Китая. Компоненты для компактности использовал SMD. Дисплей запитал от DC-ВС преобразователя для удобства разводки на плате.
Плату зарядки тупо приклеил сверху платы под дисплеем (заизолировал скотчем от дисплея).
1.Выключатель: https://belchip.by/product/?selected_product=04189
2. DC-DC преобразователь такой:https://belchip.by/product/?selected_product=30792
3. Миниджек: https://belchip.by/product/?selected_product=09201
4. Конденсаторы что-то типа таких: https://belchip.by/product/?selected_product=05329
5. Индуктивности: https://belchip.by/product/?selected_product=17151
Звучание в наушниках очень понравилось - в разы лучше, чем в телефоне. Да и ловит сигнал он гораздо лучше телефона и плеера.
Написал два скетча. В первом забиваются все станции на русском языке и меню текстовое. Во втором больше графических элементов, есть индикатор, если уровень сигнала хороший. Потом можно еще что-нибудь придумать.
1.
//FM Radio OLED Copyright by GhostLion v1.3 #include <EEPROM.h> #include <radio.h> #include <RDA5807M.h> #include "U8glib.h" #include "rus6x10.h" #include "rus10x20.h" #define Pin_DOWN 4 // левая кнопка #define Pin_UP 2 // правая кнопка #define Pin_SET 3 // центральная кнопка #define FIX_BAND 1 const unsigned char Bat1 [] = { 0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat2 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat3 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat4 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat5 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat6 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat7 [] = { 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9, 0x80, 0x02, 0x7F, 0xFC}; byte v,v2,k,k2,m,m2,flag1=1,flag2=0,flag3=0; int Voltage,s,s2; boolean b,b2,ms,ms2,flag=1,MODE=1; long TimeOut; U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); RDA5807M radio; void setup() { pinMode(Pin_DOWN,INPUT_PULLUP); pinMode(Pin_UP,INPUT_PULLUP); pinMode(Pin_SET,INPUT_PULLUP); Inicial(); } void loop() { Parsing(); Menu(); Energy(); } //============================================== void Inicial() { u8g.firstPage(); do { u8g.setFont(rus10x20); u8g.setPrintPos(25,14); u8g.print(F("ФМ РАДИО")); u8g.setFont(rus6x10); u8g.setPrintPos(36,28);u8g.print(F("v 1.3 Rus")); u8g.setPrintPos(40,40);u8g.print(F("03.11.18")); u8g.setPrintPos(25,52);u8g.print(F("By GhostLion")); u8g.setPrintPos(40,62);u8g.print(F("STANDART")); } while( u8g.nextPage() ); delay(3000); v = EEPROM[1]; k = EEPROM[2]; m = EEPROM[3]; b = EEPROM[4]; ms = EEPROM[5]; s = EEPROM[6]*100+EEPROM[7]; v2=v; k2=k; m2=m; b2=b; ms2=ms; s2=s; radio.init(); radio.setBandFrequency(FIX_BAND, s); radio.setVolume(v); radio.setMono(ms); radio.setMute(false); radio.setBassBoost(b); readVcc(); } //================================================ void Parsing() { boolean SET=digitalRead(Pin_SET); boolean UP=digitalRead(Pin_UP); boolean DOWN=digitalRead(Pin_DOWN); if(SET==HIGH && flag1==0) { flag1=1; } if(SET==LOW && flag1==1) { flag1=0; TimeOut=millis(); if(MODE==1) {m++; if(m>5) m=1; flag=1;} } if(UP==LOW && flag2==1) { flag2=0; } if(UP==HIGH && flag2==0) { if(MODE==1) { switch(m) { case 1:{ (v==15?0:v++); radio.setVolume(v); break; } case 2:{ b = !b; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; } case 3:{ radio.seekUp(true); delay(4000); s = radio.getFrequency(); radio.setBandFrequency(FIX_BAND,s); break; } case 4:{ s=s+10; if (s > 10800) s = 8700; radio.setBandFrequency(FIX_BAND,s); break; } case 5:{ k++; if (k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s);break;} } flag=1; TimeOut=millis(); } else {(v==15?0:v++);radio.setVolume(v);} flag2=1; } if(DOWN==LOW && flag3==1) { flag3=0; } if(DOWN==HIGH && flag3==0) { if(MODE==1) { switch(m) { case 1:{ (v==0?15:v--); radio.setVolume(v); break; } case 2:{ ms = !ms; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; } case 3:{ radio.seekDown(true); delay(4000); s=radio.getFrequency(); radio.setBandFrequency(FIX_BAND,s); break; } case 4:{ s=s-10; if (s<8700) s=10800; radio.setBandFrequency(FIX_BAND,s); break; } case 5:{ k--; if (k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s);break;} } flag=1; TimeOut=millis(); } else {(v==0?15:v--);radio.setVolume(v);} flag3=1; } } //================================================ void Menu() { float ch; if(flag==1 && MODE==1) { ch=float(s)/100; u8g.firstPage(); do { u8g.setFont(rus6x10); u8g.setDefaultForegroundColor(); u8g.setPrintPos(40,10);u8g.print(F("ФМ РАДИО")); u8g.setPrintPos(8,23);u8g.print(F("Громкость:"));u8g.setPrintPos(85,23);u8g.print(v); u8g.setPrintPos(8,33);u8g.print(F("Стерео/Басс:"));u8g.setPrintPos(85,33); if(b==1){if(ms==0)u8g.print(F("ДА/ДА")); else u8g.print(F("НЕТ/ДА"));} if(b==0){if(ms==0)u8g.print(F("ДА/НЕТ")); else u8g.print(F("НЕТ/НЕТ"));} u8g.setPrintPos(8,43);u8g.print(F("Автопоиск:"));u8g.setPrintPos(85,43);u8g.print(F("<.>")); u8g.setPrintPos(8,53);u8g.print(F("Частота:"));u8g.setPrintPos(85,53);u8g.print(ch,1); u8g.setPrintPos(8,63);Kanal(); int x = 10*m; u8g.drawTriangle(0,13+x,0,5+x,4,9+x); if(Voltage>85) u8g.drawBitmap (0, 0, 2, 8, Bat7); else if(Voltage>70) u8g.drawBitmap (0, 0, 2, 8, Bat6); else if(Voltage>55) u8g.drawBitmap (0, 0, 2, 8, Bat5); else if(Voltage>40) u8g.drawBitmap (0, 0, 2, 8, Bat4); else if(Voltage>25) u8g.drawBitmap (0, 0, 2, 8, Bat3); else if(Voltage>10) u8g.drawBitmap (0, 0, 2, 8, Bat2); else u8g.drawBitmap (0, 0, 2, 8, Bat1); } while( u8g.nextPage() ); flag=0; } } //================================================ void Kanal() { switch (s) { case 8750 : k=1;break; case 9240 : k=2;break; case 9370 : k=3;break; case 9410 : k=4;break; case 9620 : k=5;break; case 9740 : k=6;break; case 9800 : k=7;break; case 9840 : k=8;break; case 9890 : k=9;break; case 9950 : k=10;break; case 10040: k=11;break; case 10120: k=12;break; case 10170: k=13;break; case 10210: k=14;break; case 10250: k=15;break; case 10290: k=16;break; case 10370: k=17;break; case 10460: k=18;break; case 10510: k=19;break; case 10570: k=20;break; case 10620: k=21;break; case 10710: k=22;break; case 10790: k=23;break; default: k=0; } switch(k) { case 0 :{u8g.print(F("Нет Данных..."));break;} case 1 :{u8g.print(F("Релакс ФМ"));break;} case 2 :{u8g.print(F("Радио Минск"));break;} case 3 :{u8g.print(F("Юмор ФМ"));break;} case 4 :{u8g.print(F("Легенды ФМ"));break;} case 5 :{u8g.print(F("Мелодии Века"));break;} case 6 :{u8g.print(F("Минская Волна"));break;} case 7 :{u8g.print(F("АвтоРадио"));break;} case 8 :{u8g.print(F("Новое Радио"));break;} case 9 :{u8g.print(F("Русское Радио"));break;} case 10 :{u8g.print(F("Радио Юнистар"));break;} case 11 :{u8g.print(F("Радио Хит"));break;} case 12 :{u8g.print(F("Пилот ФМ"));break;} case 13 :{u8g.print(F("Радио ОНТ"));break;} case 14 :{u8g.print(F("Радио Рокс"));break;} case 15 :{u8g.print(F("Народное Радио"));break;} case 16 :{u8g.print(F("Радио Культура"));break;} case 17 :{u8g.print(F("Радиус ФМ"));break;} case 18 :{u8g.print(F("Радио Би-Эй"));break;} case 19 :{u8g.print(F("Радио Столица"));break;} case 20 :{u8g.print(F("Душевное Радио"));break;} case 21 :{u8g.print(F("Первый Канал"));break;} case 22 :{u8g.print(F("Радио Мир"));break;} case 23 :{u8g.print(F("Альфа Радио"));break;} } } //======================================================== void Frequency() { switch(k) { case 1 :{s=8750;break;} case 2 :{s=9370;break;} case 3 :{s=8750;break;} case 4 :{s=9410;break;} case 5 :{s=9620;break;} case 6 :{s=9740;break;} case 7 :{s=9800;break;} case 8 :{s=9840;break;} case 9 :{s=9890;break;} case 10 :{s=9950;break;} case 11 :{s=10040;break;} case 12 :{s=10120;break;} case 13 :{s=10170;break;} case 14 :{s=10210;break;} case 15 :{s=10250;break;} case 16 :{s=10290;break;} case 17 :{s=10370;break;} case 18 :{s=10460;break;} case 19 :{s=10510;break;} case 20 :{s=10570;break;} case 21 :{s=10620;break;} case 22 :{s=10710;break;} case 23 :{s=10790;break;} } } //======================================================= void Energy() { if(MODE==1 && millis()-TimeOut>8000) { u8g.sleepOn(); MODE=0; if(v2!=v){v2=v; EEPROM[1] = v;} if(k2!=k){k2=k; EEPROM[2] = k;} if(m2!=m){m2=m; EEPROM[3] = m;} if(b2!=b){b2=b; EEPROM[4] = b;} if(ms2!=ms){ms2=ms; EEPROM[5] = ms;} if(s2!=s){s2=s; EEPROM[6] = int(s/100); EEPROM[7] = s%100;} } if(MODE==0 && millis()-TimeOut<500) { u8g.sleepOff(); readVcc(); MODE=1;flag=1; } } //=================================================== void readVcc() { #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1.080 * 1023 * 1000 / result; // расчёт реального VCC Voltage = int(result); Voltage = map(Voltage, 3200, 4200, 0, 100); Voltage = constrain(Voltage, 0, 100); }
Дисплей для сохранения отключается через 8 секунд. Когда дисплей выключен кнопками регулируется громкость. Когда дисплей выключается измененные настройки сохраняются в EEPROM.
2.
//FM Radio OLED Copyright by GhostLion v1.4 #include <EEPROM.h> #include <radio.h> #include <RDA5807M.h> #include "U8glib.h" #include "rus6x10.h" #include "rus10x20.h" #define Pin_DOWN 4 // левая кнопка #define Pin_UP 2 // правая кнопка #define Pin_SET 3 // центральная кнопка #define FIX_BAND 1 const unsigned char Volume [] = {0x7E, 0x42, 0x81, 0x81, 0x81, 0x81, 0xE7, 0xE7, 0x66, 0x66}; const unsigned char Bass [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0x8D, 0xA2, 0x51, 0xA3, 0x91, 0x9A, 0x4D, 0x8A, 0x45, 0xB3, 0x99,0x80, 0x01, 0x7F, 0xFE}; const unsigned char FM [] = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x98, 0xA9, 0x90, 0xA9, 0x90, 0x89,0x80, 0x01, 0x7F, 0xFE}; const unsigned char Stereo [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0xB9, 0xA1, 0x25, 0xA1, 0x39, 0x99, 0x31, 0x89, 0x29, 0xB1, 0x25,0x80, 0x01, 0x7F, 0xFE}; const unsigned char Bat1 [] = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat2 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat3 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat4 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat5 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat6 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Bat7 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC}; const unsigned char Vol1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x60, 0x00, 0x60, 0x00}; const unsigned char Vol2 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00,0x6C, 0x00, 0x6C, 0x00}; const unsigned char Vol3 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x0D, 0x80, 0x0D, 0x80,0x6D, 0x80, 0x6D, 0x80}; const unsigned char Vol4 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x01, 0xB0, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0xB0,0x6D, 0xB0, 0x6D, 0xB0}; const unsigned char Vol5 [] = {0x00, 0x06, 0x00, 0x06, 0x00, 0x36, 0x00, 0x36, 0x01, 0xB6, 0x01, 0xB6, 0x0D, 0xB6, 0x0D, 0xB6,0x6D, 0xB6, 0x6D, 0xB6}; byte v,v2,k,k2,m,m2,rs, flag1=1,flag2=0,flag3=0; int Voltage,s,s2; boolean b,b2,ms,ms2,flag=1,MODE=1; long TimeOut; U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); RDA5807M radio; void setup() { pinMode(Pin_DOWN,INPUT_PULLUP); pinMode(Pin_UP,INPUT_PULLUP); pinMode(Pin_SET,INPUT_PULLUP); Inicial(); } void loop() { Parsing(); Menu(); Energy(); } //============================================== void Inicial() { u8g.firstPage(); do { u8g.setFont(rus10x20); u8g.setPrintPos(25,14); u8g.print(F("ФМ РАДИО")); u8g.setFont(rus6x10); u8g.setPrintPos(36,28);u8g.print(F("v 1.4 Rus")); u8g.setPrintPos(40,40);u8g.print(F("18.11.18")); u8g.setPrintPos(25,52);u8g.print(F("By GhostLion")); u8g.setPrintPos(40,62);u8g.print(F("EXTENDED")); } while( u8g.nextPage() ); delay(2000); v = EEPROM[1]; k = EEPROM[2]; m = EEPROM[3]; b = EEPROM[4]; ms = EEPROM[5]; s = EEPROM[6]*100+EEPROM[7]; v2=v; k2=k; m2=m; b2=b; ms2=ms; s2=s; radio.init(); radio.setBandFrequency(FIX_BAND, s); radio.setVolume(v); radio.setMono(ms); radio.setMute(false); radio.setBassBoost(b); readVcc(); } //================================================ void Parsing() { boolean SET=digitalRead(Pin_SET); boolean UP=digitalRead(Pin_UP); boolean DOWN=digitalRead(Pin_DOWN); if(SET==HIGH && flag1==0) { flag1=1; } if(SET==LOW && flag1==1) { flag1=0; TimeOut=millis(); if(MODE==1) {m++; if(m>6) m=1; flag=1;} } if(UP==LOW && flag2==1) { flag2=0; } if(UP==HIGH && flag2==0) { if(MODE==1) { switch(m) { case 1:{ (v==15?0:v++); radio.setVolume(v); break; } case 2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; } case 3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; } case 4:{ radio.seekUp(true); delay(3000); s = radio.getFrequency(); Kanal(); break; } case 5:{ s=s+10; if (s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal(); break; } case 6:{ k++; if (k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s);break;} } flag=1; TimeOut=millis(); } else {(v==15?0:v++);radio.setVolume(v);} flag2=1; } if(DOWN==LOW && flag3==1) { flag3=0; } if(DOWN==HIGH && flag3==0) { if(MODE==1) { switch(m) { case 1:{ (v==0?15:v--); radio.setVolume(v); break; } case 2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break; } case 3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break; } case 4:{ radio.seekDown(true); delay(3000); s=radio.getFrequency(); Kanal(); break; } case 5:{ s=s-10; if (s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal(); break; } case 6:{ k--; if (k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s); break;} } flag=1; TimeOut=millis(); } else {(v==0?15:v--);radio.setVolume(v);} flag3=1; } } //================================================ void Menu() { float ch; if(flag==1 && MODE==1) { rs = radio.getRSSI(); ch=float(s)/100; u8g.firstPage(); do { u8g.setDefaultForegroundColor(); if(Voltage>85) u8g.drawBitmap (110, 0, 2, 10, Bat7); else if(Voltage>70) u8g.drawBitmap (110, 0, 2, 10, Bat6); else if(Voltage>55) u8g.drawBitmap (110, 0, 2, 10, Bat5); else if(Voltage>40) u8g.drawBitmap (110, 0, 2, 10, Bat4); else if(Voltage>25) u8g.drawBitmap (110, 0, 2, 10, Bat3); else if(Voltage>10) u8g.drawBitmap (110, 0, 2, 10, Bat2); else u8g.drawBitmap (110, 0, 2, 10, Bat1); u8g.drawBitmap (0, 0, 1, 10, Volume); if(v<3) u8g.drawBitmap (13, 0, 2, 10, Vol1); else if(v<7) u8g.drawBitmap (13, 0, 2, 10, Vol2); else if(v<10) u8g.drawBitmap (13, 0, 2, 10, Vol3); else if(v<13) u8g.drawBitmap (13, 0, 2, 10, Vol4); else u8g.drawBitmap (13, 0, 2, 10, Vol5); if(ms==0) u8g.drawBitmap (68, 0, 2, 10, Stereo); if(b==1) u8g.drawBitmap (88, 0, 2, 10, Bass); if (rs>40) u8g.drawBitmap (32, 0, 2, 10, FM); u8g.setFont(rus10x20); if(ch<100) u8g.setPrintPos(40,35); else u8g.setPrintPos(36,35); u8g.print(ch,1); u8g.setFont(rus6x10); u8g.print(" MHz"); if(k!=0){ u8g.drawRFrame (0,22,18,13,2); u8g.setPrintPos(3,32); if(k<10) u8g.print("0"); u8g.print(k); } u8g.drawRFrame (0,51,127,12,3); u8g.setPrintPos(13,61); switch(m) { case 1: {u8g.print(F("- < ГРОМКОСТЬ > +"));break;} case 2: {u8g.print(F(" НЕТ < БАСС > ДА"));break;} case 3: {u8g.print(F("НЕТ < СТЕРЕО > ДА"));break;} case 4: {u8g.print(F(" < АВТОПОИСК >"));break;} case 5: {u8g.print(F("< РУЧ. ПОИСК >"));break;} case 6: {u8g.print(F(" < КАНАЛЫ >"));break;} } } while( u8g.nextPage() ); flag=0; } } //================================================ void Energy() { if(MODE==1 && millis()-TimeOut>2000) flag=1; if(MODE==1 && millis()-TimeOut>8000) { u8g.sleepOn(); MODE=0; if(v2!=v){v2=v; EEPROM[1] = v;} if(k2!=k){k2=k; EEPROM[2] = k;} if(m2!=m){m2=m; EEPROM[3] = m;} if(b2!=b){b2=b; EEPROM[4] = b;} if(ms2!=ms){ms2=ms; EEPROM[5] = ms;} if(s2!=s){s2=s; EEPROM[6] = int(s/100); EEPROM[7] = s%100;} } if(MODE==0 && millis()-TimeOut<500) { u8g.sleepOff(); readVcc(); MODE=1;flag=1; } } //=================================================== void readVcc() { #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1.080 * 1023 * 1000 / result; // расчёт реального VCC Voltage = int(result); Voltage = map(Voltage, 3200, 4200, 0, 100); Voltage = constrain(Voltage, 0, 100); } //======================================================= void Kanal() { switch (s) { case 8750 : k=1;break; case 9240 : k=2;break; case 9370 : k=3;break; case 9410 : k=4;break; case 9620 : k=5;break; case 9740 : k=6;break; case 9800 : k=7;break; case 9840 : k=8;break; case 9890 : k=9;break; case 9950 : k=10;break; case 10040: k=11;break; case 10120: k=12;break; case 10170: k=13;break; case 10210: k=14;break; case 10250: k=15;break; case 10290: k=16;break; case 10370: k=17;break; case 10460: k=18;break; case 10510: k=19;break; case 10570: k=20;break; case 10620: k=21;break; case 10710: k=22;break; case 10790: k=23;break; default: k=0; } } //========================================================== void Frequency() { switch(k) { case 1 :{s=8750;break;} case 2 :{s=9370;break;} case 3 :{s=8750;break;} case 4 :{s=9410;break;} case 5 :{s=9620;break;} case 6 :{s=9740;break;} case 7 :{s=9800;break;} case 8 :{s=9840;break;} case 9 :{s=9890;break;} case 10 :{s=9950;break;} case 11 :{s=10040;break;} case 12 :{s=10120;break;} case 13 :{s=10170;break;} case 14 :{s=10210;break;} case 15 :{s=10250;break;} case 16 :{s=10290;break;} case 17 :{s=10370;break;} case 18 :{s=10460;break;} case 19 :{s=10510;break;} case 20 :{s=10570;break;} case 21 :{s=10620;break;} case 22 :{s=10710;break;} case 23 :{s=10790;break;} } }
Все данные по пректу в архиве:https://yadi.sk/d/S678nWJY8EChPw
А от дисплея помехи есть?я делал подобное,дисплей мешал приему...
И можно ли частоту чуть крупнее шрифт?
Помех не замечал. Шрифта, крупнее 10х20 для библиотеки u8glib у меня нет. Была идея нарисовать квадратик и из него как из "кирпичиков" сделать свои цифры. Может потом займусь...
Понятно,на будущее ничего не планируете добавить?
У меня есть почти такой,попробую переделать под свою схему (у меня только кнопки к другим портам и все)
http://img.radiokot.ru/files/111886/medium/1k9jhfm54j.jpg
Помех не замечал. Шрифта, крупнее 10х20 для библиотеки u8glib у меня нет. Была идея нарисовать квадратик и из него как из "кирпичиков" сделать свои цифры. Может потом займусь...
Может интересно будет? http://arduino.ru/forum/programmirovanie/krivye-beze?page=1#comment-403069
Ну и видео обзор не помешает.
Нашел на просторах интернета чисто цифровой большой шрифт. https://yadi.sk/d/7zwsvuiwqzFbZA Закинуть в папку со скетчем, подключить в начале скетча и заменить строки 182-183:
Версия 1.5 - выбросил шрифт 10х20, добавил функцию SoftMute.
Зря травил/паял,не получается скомпилировать,ошибка компиляции
У меня версия Arduino IDE 1.8.5. У вас проблема с бибилотекой Wire.h - попробуйте скачать последнюю версию.
Спасибо!получилось
Прошивка 1.4
Вручном ежима непонятно-одна станция у нас 98,3,ставлю 98,0 и нажимаю плюс-станция принимается на 98,5,нажимаю дальше-станция пропадает,частота 98,6,теперь нажимаю минус и станция принимается на правильной частоте 98,3
Тоже самое радио "Шансон",частота 99,6-при переключении вверх принимается на 99,8,при переключении вниз принимается правильно-99,6
Это в режиме автопоиска или ручном? В ручном должно по 0.1 Мгц добавляться.
В ручном,до по 0,1 МГц,настраиваюсь на дорожное радио 98,3 начиная с 98,0-нажимаю-частота 98,1,еще нажимаю-98,2,еще нажимаю частота 98,3 (станция еле пробивается),потом 98,4 (станцияс шумом но сильнее),нажимаю-98,5-станция принимается замечательно,и так со всеми станциями (99,6, 100,2 ,100,6, 1011 и т д)-все принимаются на 0,2 МГц выше
Если вручную уменьшать частоты то все станции на своих частотах
Перепрошивал-то же самое
Программа ваша у меня только кнопки на другие порты и частоты свои
Возможно у вас какая-то проблема с модулем RDA5807 - так как это по всей видимости не программная ошибка. У меня все работает идеально, все станции на своих частотах.
С модулем все замечательно-стоял в другом радио,при переключении по каналам все отлично,автопоиск тоже отлично,только при ручной перестройке вверх такая байда,так то ручная не очень нужна-забил в память и слушай!
Программа занимает 20 кб памяти-непозволительная роскошь...
Память не бензин - в ведро не сольешь. А если честно: библиотека модуля и дисплея в основном и "кушают" её.
Ну это понятно,знал бы как передавать по и2с в ардуино переписал бы обращение к 5807,там ничего сложного,там наверно полно всякой ненужности,поищу инфу по и2с...
автопоиск странноватый-правильнее наверно включать автопоиск и ждать пока не установится флаг STC
Можно покопаться в файлах библиотеки и посмотреть что как работает...В даташите модуля копался, но у меня пока не тот уровень, чтобы все понимать.
Там ничего сложного нет,вот http://cxem.net/tuner/files/tuner84_RDA5807M_datasheet_v1.pdf даташит хороший,есть на русском на каткаткат
например регулировка громкости на баском авр-
Вот здесь посмотрите листинг программы:http://full-chip.net/arduino-proekty/97-cifrovoy-fm-priemnik-na-arduino-i-module-rda5807-s-graficheskim-displeem-i-funkciey-rds.html Там все сделано без библиотек модуля и дисплея (Nokia 5110). Только библиотека Wire.h
Там вообще все мудрено,вот начал-все работает
Финальная версия радио. С каналами не стал морочиться - сделал, поигрался, но через программу забивать удобнее. Короче, оставил все как было, только внёс некоторые правки.
.

https://yadi.sk/d/_8VCmTGt4vO5vw
У меня небольшая проблемка ))) дисплей развел вверх-тормашкой,реально перевернуть картинку?
Попробуйте вот это:
setRot90
setRot180
setRot270
C++ Prototype void U8GLIB::setRot90() void U8GLIB::setRot180() void U8GLIB::setRot270()
C Prototype void u8g_SetRot90(u8g_t *u8g) void u8g_SetRot180(u8g_t *u8g) void u8g_SetRot270(u8g_t *u8g)
Описание
По часовой стрелке поворачивается экран дисплея на 90, 180 или 270 градусов. Для большинства устройств отображения пейзаж - режим по умолчанию. Вращение на 90 или 270 градусов приведет к отображению дисплея в портретном режиме. Обратите внимание, что эта функция уменьшит производительность U8glib.
Аргументы:
u8g: Указатель на структуру u8g (только для интерфейса C).
Использование:
Внешний контур изображения. Окружающая среда Arduino. Рекомендуется использовать эту процедуру в процедуре setup ().
Все,решил,извините...
Одновременно писали-я и поставил u8g.setRot180();,просто сначала ставил lcd.setRot180();
Финальная версия радио. С каналами не стал морочиться - сделал, поигрался, но через программу забивать удобнее. Короче, оставил все как было, только внёс некоторые правки.
.

https://yadi.sk/d/_8VCmTGt4vO5vw
Вы из Беларуси ?
Да.
Да.
Я из Могилева, делаю проект по вашей схеме. Можно ваш мейл или вк ?
Да.
ronixx, пришлите фотки проблемы и куски кода, который меняли.
p.s. Письмо на ваш mail.ru не хочет доставлять.
ronixx, пришлите фотки проблемы и куски кода, который меняли.
p.s. Письмо на ваш mail.ru не хочет доставлять.
На днях отправлю, artur.gromyko@yandex.ru
Заинтересовал данный приемник,вопрос по унч-есть модули PAM8403,стоит ли их использовать? а то в инете пишут что он сильно забивает эфир
GhostLion, здравствуйте! Как я понял в скетче (прошивка Голд) перед заливкой надо свои радиостанции прописывать?
Да.
Спасибо. Плюсанул. Ручная подстройка частоты предусмотрена? Катаюсь много, поволжье, урал.
GhostLion, править строки 321-343 и 289-311?
Да, и в строках 144,168 изменить количество каналов (23)
а чо б в EEPROM не засунуть любимые радиастанцыи?
Да, и в строках 144,168 изменить количество каналов (23)
Сколько максимально?
255 (переменная k типа byte)
Да, правильно.
GhostLion, доброго дня! Собрал на макетке, 51 радиостанцию внес в скетч, залил, все работает. Теперь буду засовывать все в корпус сгоревшей БТ колонки Оклик ОК-10 (аудио вход джек умудрился попасть в фазу пилота на столе).
Предела совершенству не существует, и я попросил бы Вас создать скетч PLATINUM 1.7, внесением в v1.6 индикацию уровня сигнала (антенка вместо наушников). Сам слаб в програмировании, а вот готовый скетч с такой функцией имеется.
Сделал индикацию уровня сигнала , правда не антенка , а цифры.
как переделать код под TEA5767
Заинтересовал приемник,есть ли обновления?
заработал скетч под tea5767. вот моя версия с московскими радиостанциями.
хочется запилить туда RDS......
заработал скетч под tea5767.
хочется запилить туда RDS.....
Забуть, у 5767 нет RDS, тока у 5807 есть
заработал скетч под tea5767. вот моя версия с московскими радиостанциями.
хочется запилить туда RDS......
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
если код по строкам продавать, как индусы, то так дороже выходит. :)
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
не нравится код? а покажи свой " правильный"
тогда и посмотрим чей код лучше....авторский код работает...а вот Ваш....под вопросом пока
просто аффтар - махровый непрофессионал или индус.