Здравствуйте Форумчане. Как-то на глаза попался маленький фм модуль 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.

009 | #define Pin_DOWN 4 // левая кнопка |
010 | #define Pin_UP 2 // правая кнопка |
011 | #define Pin_SET 3 // центральная кнопка |
014 | const unsigned char Bat1 [] = { |
015 | 0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x02, 0x7F, 0xFC}; |
016 | const unsigned char Bat2 [] = { |
017 | 0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0x80, 0x02, 0x7F, 0xFC}; |
018 | const unsigned char Bat3 [] = { |
019 | 0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0x80, 0x02, 0x7F, 0xFC}; |
020 | const unsigned char Bat4 [] = { |
021 | 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0x80, 0x02, 0x7F, 0xFC}; |
022 | const unsigned char Bat5 [] = { |
023 | 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0x80, 0x02, 0x7F, 0xFC}; |
024 | const unsigned char Bat6 [] = { |
025 | 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0x80, 0x02, 0x7F, 0xFC}; |
026 | const unsigned char Bat7 [] = { |
027 | 0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9, 0x80, 0x02, 0x7F, 0xFC}; |
029 | byte v,v2,k,k2,m,m2,flag1=1,flag2=0,flag3=0; |
031 | boolean b,b2,ms,ms2,flag=1,MODE=1; |
034 | U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); |
039 | pinMode(Pin_DOWN,INPUT_PULLUP); |
040 | pinMode(Pin_UP,INPUT_PULLUP); |
041 | pinMode(Pin_SET,INPUT_PULLUP); |
057 | u8g.setFont(rus10x20); |
058 | u8g.setPrintPos(25,14); |
059 | u8g.print(F( "ФМ РАДИО" )); |
060 | u8g.setFont(rus6x10); |
061 | u8g.setPrintPos(36,28);u8g.print(F( "v 1.3 Rus" )); |
062 | u8g.setPrintPos(40,40);u8g.print(F( "03.11.18" )); |
063 | u8g.setPrintPos(25,52);u8g.print(F( "By GhostLion" )); |
064 | u8g.setPrintPos(40,62);u8g.print(F( "STANDART" )); |
066 | while ( u8g.nextPage() ); |
073 | s = EEPROM[6]*100+EEPROM[7]; |
074 | v2=v; k2=k; m2=m; b2=b; ms2=ms; s2=s; |
076 | radio.setBandFrequency(FIX_BAND, s); |
080 | radio.setBassBoost(b); |
086 | boolean SET=digitalRead(Pin_SET); |
087 | boolean UP=digitalRead(Pin_UP); |
088 | boolean DOWN=digitalRead(Pin_DOWN); |
090 | if (SET==HIGH && flag1==0) |
094 | if (SET==LOW && flag1==1) |
098 | if (MODE==1) {m++; if (m>5) m=1; flag=1;} |
101 | if (UP==LOW && flag2==1) |
105 | if (UP==HIGH && flag2==0) |
111 | case 1:{ (v==15?0:v++); radio.setVolume(v); break ; } |
112 | case 2:{ b = !b; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break ; } |
113 | case 3:{ radio.seekUp( true ); delay(4000); s = radio.getFrequency(); radio.setBandFrequency(FIX_BAND,s); break ; } |
114 | case 4:{ s=s+10; if (s > 10800) s = 8700; radio.setBandFrequency(FIX_BAND,s); break ; } |
115 | case 5:{ k++; if (k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s); break ;} |
120 | else {(v==15?0:v++);radio.setVolume(v);} |
123 | if (DOWN==LOW && flag3==1) |
127 | if (DOWN==HIGH && flag3==0) |
133 | case 1:{ (v==0?15:v--); radio.setVolume(v); break ; } |
134 | case 2:{ ms = !ms; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break ; } |
135 | case 3:{ radio.seekDown( true ); delay(4000); s=radio.getFrequency(); radio.setBandFrequency(FIX_BAND,s); break ; } |
136 | case 4:{ s=s-10; if (s<8700) s=10800; radio.setBandFrequency(FIX_BAND,s); break ; } |
137 | case 5:{ k--; if (k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s); break ;} |
142 | else {(v==0?15:v--);radio.setVolume(v);} |
150 | if (flag==1 && MODE==1) |
156 | u8g.setDefaultForegroundColor(); |
157 | u8g.setPrintPos(40,10);u8g.print(F( "ФМ РАДИО" )); |
158 | u8g.setPrintPos(8,23);u8g.print(F( "Громкость:" ));u8g.setPrintPos(85,23);u8g.print(v); |
159 | u8g.setPrintPos(8,33);u8g.print(F( "Стерео/Басс:" ));u8g.setPrintPos(85,33); |
160 | if (b==1){ if (ms==0)u8g.print(F( "ДА/ДА" )); else u8g.print(F( "НЕТ/ДА" ));} |
161 | if (b==0){ if (ms==0)u8g.print(F( "ДА/НЕТ" )); else u8g.print(F( "НЕТ/НЕТ" ));} |
162 | u8g.setPrintPos(8,43);u8g.print(F( "Автопоиск:" ));u8g.setPrintPos(85,43);u8g.print(F( "<.>" )); |
163 | u8g.setPrintPos(8,53);u8g.print(F( "Частота:" ));u8g.setPrintPos(85,53);u8g.print(ch,1); |
164 | u8g.setPrintPos(8,63);Kanal(); |
166 | u8g.drawTriangle(0,13+x,0,5+x,4,9+x); |
168 | if (Voltage>85) u8g.drawBitmap (0, 0, 2, 8, Bat7); |
169 | else if (Voltage>70) u8g.drawBitmap (0, 0, 2, 8, Bat6); |
170 | else if (Voltage>55) u8g.drawBitmap (0, 0, 2, 8, Bat5); |
171 | else if (Voltage>40) u8g.drawBitmap (0, 0, 2, 8, Bat4); |
172 | else if (Voltage>25) u8g.drawBitmap (0, 0, 2, 8, Bat3); |
173 | else if (Voltage>10) u8g.drawBitmap (0, 0, 2, 8, Bat2); |
174 | else u8g.drawBitmap (0, 0, 2, 8, Bat1); |
176 | while ( u8g.nextPage() ); |
185 | case 8750 : k=1; break ; |
186 | case 9240 : k=2; break ; |
187 | case 9370 : k=3; break ; |
188 | case 9410 : k=4; break ; |
189 | case 9620 : k=5; break ; |
190 | case 9740 : k=6; break ; |
191 | case 9800 : k=7; break ; |
192 | case 9840 : k=8; break ; |
193 | case 9890 : k=9; break ; |
194 | case 9950 : k=10; break ; |
195 | case 10040: k=11; break ; |
196 | case 10120: k=12; break ; |
197 | case 10170: k=13; break ; |
198 | case 10210: k=14; break ; |
199 | case 10250: k=15; break ; |
200 | case 10290: k=16; break ; |
201 | case 10370: k=17; break ; |
202 | case 10460: k=18; break ; |
203 | case 10510: k=19; break ; |
204 | case 10570: k=20; break ; |
205 | case 10620: k=21; break ; |
206 | case 10710: k=22; break ; |
207 | case 10790: k=23; break ; |
213 | case 0 :{u8g.print(F( "Нет Данных..." )); break ;} |
214 | case 1 :{u8g.print(F( "Релакс ФМ" )); break ;} |
215 | case 2 :{u8g.print(F( "Радио Минск" )); break ;} |
216 | case 3 :{u8g.print(F( "Юмор ФМ" )); break ;} |
217 | case 4 :{u8g.print(F( "Легенды ФМ" )); break ;} |
218 | case 5 :{u8g.print(F( "Мелодии Века" )); break ;} |
219 | case 6 :{u8g.print(F( "Минская Волна" )); break ;} |
220 | case 7 :{u8g.print(F( "АвтоРадио" )); break ;} |
221 | case 8 :{u8g.print(F( "Новое Радио" )); break ;} |
222 | case 9 :{u8g.print(F( "Русское Радио" )); break ;} |
223 | case 10 :{u8g.print(F( "Радио Юнистар" )); break ;} |
224 | case 11 :{u8g.print(F( "Радио Хит" )); break ;} |
225 | case 12 :{u8g.print(F( "Пилот ФМ" )); break ;} |
226 | case 13 :{u8g.print(F( "Радио ОНТ" )); break ;} |
227 | case 14 :{u8g.print(F( "Радио Рокс" )); break ;} |
228 | case 15 :{u8g.print(F( "Народное Радио" )); break ;} |
229 | case 16 :{u8g.print(F( "Радио Культура" )); break ;} |
230 | case 17 :{u8g.print(F( "Радиус ФМ" )); break ;} |
231 | case 18 :{u8g.print(F( "Радио Би-Эй" )); break ;} |
232 | case 19 :{u8g.print(F( "Радио Столица" )); break ;} |
233 | case 20 :{u8g.print(F( "Душевное Радио" )); break ;} |
234 | case 21 :{u8g.print(F( "Первый Канал" )); break ;} |
235 | case 22 :{u8g.print(F( "Радио Мир" )); break ;} |
236 | case 23 :{u8g.print(F( "Альфа Радио" )); break ;} |
244 | case 1 :{s=8750; break ;} |
245 | case 2 :{s=9370; break ;} |
246 | case 3 :{s=8750; break ;} |
247 | case 4 :{s=9410; break ;} |
248 | case 5 :{s=9620; break ;} |
249 | case 6 :{s=9740; break ;} |
250 | case 7 :{s=9800; break ;} |
251 | case 8 :{s=9840; break ;} |
252 | case 9 :{s=9890; break ;} |
253 | case 10 :{s=9950; break ;} |
254 | case 11 :{s=10040; break ;} |
255 | case 12 :{s=10120; break ;} |
256 | case 13 :{s=10170; break ;} |
257 | case 14 :{s=10210; break ;} |
258 | case 15 :{s=10250; break ;} |
259 | case 16 :{s=10290; break ;} |
260 | case 17 :{s=10370; break ;} |
261 | case 18 :{s=10460; break ;} |
262 | case 19 :{s=10510; break ;} |
263 | case 20 :{s=10570; break ;} |
264 | case 21 :{s=10620; break ;} |
265 | case 22 :{s=10710; break ;} |
266 | case 23 :{s=10790; break ;} |
272 | if (MODE==1 && millis()-TimeOut>8000) |
276 | if (v2!=v){v2=v; EEPROM[1] = v;} |
277 | if (k2!=k){k2=k; EEPROM[2] = k;} |
278 | if (m2!=m){m2=m; EEPROM[3] = m;} |
279 | if (b2!=b){b2=b; EEPROM[4] = b;} |
280 | if (ms2!=ms){ms2=ms; EEPROM[5] = ms;} |
281 | if (s2!=s){s2=s; EEPROM[6] = int (s/100); EEPROM[7] = s%100;} |
283 | if (MODE==0 && millis()-TimeOut<500) |
293 | #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) |
294 | ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
296 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
300 | while (bit_is_set(ADCSRA, ADSC)); |
303 | long result = (high << 8) | low; |
305 | result = 1.080 * 1023 * 1000 / result; |
306 | Voltage = int (result); |
307 | Voltage = map(Voltage, 3200, 4200, 0, 100); |
308 | Voltage = constrain(Voltage, 0, 100); |
Дисплей для сохранения отключается через 8 секунд. Когда дисплей выключен кнопками регулируется громкость. Когда дисплей выключается измененные настройки сохраняются в EEPROM.
2.

011 | #define Pin_DOWN 4 // левая кнопка |
012 | #define Pin_UP 2 // правая кнопка |
013 | #define Pin_SET 3 // центральная кнопка |
016 | const unsigned char Volume [] = {0x7E, 0x42, 0x81, 0x81, 0x81, 0x81, 0xE7, 0xE7, 0x66, 0x66}; |
017 | const unsigned char Bass [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0x8D, 0xA2, 0x51, 0xA3, 0x91, 0x9A, 0x4D, 0x8A, 0x45, 0xB3, 0x99,0x80, 0x01, 0x7F, 0xFE}; |
018 | const unsigned char FM [] = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x98, 0xA9, 0x90, 0xA9, 0x90, 0x89,0x80, 0x01, 0x7F, 0xFE}; |
019 | const unsigned char Stereo [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0xB9, 0xA1, 0x25, 0xA1, 0x39, 0x99, 0x31, 0x89, 0x29, 0xB1, 0x25,0x80, 0x01, 0x7F, 0xFE}; |
021 | const unsigned char Bat1 [] = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC}; |
022 | const unsigned char Bat2 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC}; |
023 | const unsigned char Bat3 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC}; |
024 | const unsigned char Bat4 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC}; |
025 | const unsigned char Bat5 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC}; |
026 | const unsigned char Bat6 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC}; |
027 | const unsigned char Bat7 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC}; |
029 | const unsigned char Vol1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x60, 0x00, 0x60, 0x00}; |
030 | const unsigned char Vol2 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00,0x6C, 0x00, 0x6C, 0x00}; |
031 | const unsigned char Vol3 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x0D, 0x80, 0x0D, 0x80,0x6D, 0x80, 0x6D, 0x80}; |
032 | const unsigned char Vol4 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x01, 0xB0, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0xB0,0x6D, 0xB0, 0x6D, 0xB0}; |
033 | const unsigned char Vol5 [] = {0x00, 0x06, 0x00, 0x06, 0x00, 0x36, 0x00, 0x36, 0x01, 0xB6, 0x01, 0xB6, 0x0D, 0xB6, 0x0D, 0xB6,0x6D, 0xB6, 0x6D, 0xB6}; |
035 | byte v,v2,k,k2,m,m2,rs, flag1=1,flag2=0,flag3=0; |
037 | boolean b,b2,ms,ms2,flag=1,MODE=1; |
040 | U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); |
045 | pinMode(Pin_DOWN,INPUT_PULLUP); |
046 | pinMode(Pin_UP,INPUT_PULLUP); |
047 | pinMode(Pin_SET,INPUT_PULLUP); |
063 | u8g.setFont(rus10x20); |
064 | u8g.setPrintPos(25,14); |
065 | u8g.print(F( "ФМ РАДИО" )); |
066 | u8g.setFont(rus6x10); |
067 | u8g.setPrintPos(36,28);u8g.print(F( "v 1.4 Rus" )); |
068 | u8g.setPrintPos(40,40);u8g.print(F( "18.11.18" )); |
069 | u8g.setPrintPos(25,52);u8g.print(F( "By GhostLion" )); |
070 | u8g.setPrintPos(40,62);u8g.print(F( "EXTENDED" )); |
072 | while ( u8g.nextPage() ); |
079 | s = EEPROM[6]*100+EEPROM[7]; |
080 | v2=v; k2=k; m2=m; b2=b; ms2=ms; s2=s; |
082 | radio.setBandFrequency(FIX_BAND, s); |
086 | radio.setBassBoost(b); |
092 | boolean SET=digitalRead(Pin_SET); |
093 | boolean UP=digitalRead(Pin_UP); |
094 | boolean DOWN=digitalRead(Pin_DOWN); |
096 | if (SET==HIGH && flag1==0) |
100 | if (SET==LOW && flag1==1) |
104 | if (MODE==1) {m++; if (m>6) m=1; flag=1;} |
107 | if (UP==LOW && flag2==1) |
111 | if (UP==HIGH && flag2==0) |
117 | case 1:{ (v==15?0:v++); radio.setVolume(v); break ; } |
118 | case 2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break ; } |
119 | case 3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break ; } |
120 | case 4:{ radio.seekUp( true ); delay(3000); s = radio.getFrequency(); Kanal(); break ; } |
121 | case 5:{ s=s+10; if (s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal(); break ; } |
122 | case 6:{ k++; if (k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s); break ;} |
127 | else {(v==15?0:v++);radio.setVolume(v);} |
130 | if (DOWN==LOW && flag3==1) |
134 | if (DOWN==HIGH && flag3==0) |
140 | case 1:{ (v==0?15:v--); radio.setVolume(v); break ; } |
141 | case 2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s); break ; } |
142 | case 3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s); break ; } |
143 | case 4:{ radio.seekDown( true ); delay(3000); s=radio.getFrequency(); Kanal(); break ; } |
144 | case 5:{ s=s-10; if (s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal(); break ; } |
145 | case 6:{ k--; if (k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s); break ;} |
150 | else {(v==0?15:v--);radio.setVolume(v);} |
158 | if (flag==1 && MODE==1) |
164 | u8g.setDefaultForegroundColor(); |
165 | if (Voltage>85) u8g.drawBitmap (110, 0, 2, 10, Bat7); |
166 | else if (Voltage>70) u8g.drawBitmap (110, 0, 2, 10, Bat6); |
167 | else if (Voltage>55) u8g.drawBitmap (110, 0, 2, 10, Bat5); |
168 | else if (Voltage>40) u8g.drawBitmap (110, 0, 2, 10, Bat4); |
169 | else if (Voltage>25) u8g.drawBitmap (110, 0, 2, 10, Bat3); |
170 | else if (Voltage>10) u8g.drawBitmap (110, 0, 2, 10, Bat2); |
171 | else u8g.drawBitmap (110, 0, 2, 10, Bat1); |
172 | u8g.drawBitmap (0, 0, 1, 10, Volume); |
173 | if (v<3) u8g.drawBitmap (13, 0, 2, 10, Vol1); |
174 | else if (v<7) u8g.drawBitmap (13, 0, 2, 10, Vol2); |
175 | else if (v<10) u8g.drawBitmap (13, 0, 2, 10, Vol3); |
176 | else if (v<13) u8g.drawBitmap (13, 0, 2, 10, Vol4); |
177 | else u8g.drawBitmap (13, 0, 2, 10, Vol5); |
178 | if (ms==0) u8g.drawBitmap (68, 0, 2, 10, Stereo); |
179 | if (b==1) u8g.drawBitmap (88, 0, 2, 10, Bass); |
180 | if (rs>40) u8g.drawBitmap (32, 0, 2, 10, FM); |
182 | u8g.setFont(rus10x20); |
183 | if (ch<100) u8g.setPrintPos(40,35); else u8g.setPrintPos(36,35); |
188 | u8g.drawRFrame (0,22,18,13,2); |
189 | u8g.setPrintPos(3,32); |
190 | if (k<10) u8g.print( "0" ); |
193 | u8g.drawRFrame (0,51,127,12,3); |
194 | u8g.setPrintPos(13,61); |
197 | case 1: {u8g.print(F( "- < ГРОМКОСТЬ > +" )); break ;} |
198 | case 2: {u8g.print(F( " НЕТ < БАСС > ДА" )); break ;} |
199 | case 3: {u8g.print(F( "НЕТ < СТЕРЕО > ДА" )); break ;} |
200 | case 4: {u8g.print(F( " < АВТОПОИСК >" )); break ;} |
201 | case 5: {u8g.print(F( "< РУЧ. ПОИСК >" )); break ;} |
202 | case 6: {u8g.print(F( " < КАНАЛЫ >" )); break ;} |
208 | while ( u8g.nextPage() ); |
215 | if (MODE==1 && millis()-TimeOut>2000) flag=1; |
216 | if (MODE==1 && millis()-TimeOut>8000) |
220 | if (v2!=v){v2=v; EEPROM[1] = v;} |
221 | if (k2!=k){k2=k; EEPROM[2] = k;} |
222 | if (m2!=m){m2=m; EEPROM[3] = m;} |
223 | if (b2!=b){b2=b; EEPROM[4] = b;} |
224 | if (ms2!=ms){ms2=ms; EEPROM[5] = ms;} |
225 | if (s2!=s){s2=s; EEPROM[6] = int (s/100); EEPROM[7] = s%100;} |
227 | if (MODE==0 && millis()-TimeOut<500) |
237 | #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) |
238 | ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
240 | ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); |
244 | while (bit_is_set(ADCSRA, ADSC)); |
247 | long result = (high << 8) | low; |
249 | result = 1.080 * 1023 * 1000 / result; |
250 | Voltage = int (result); |
251 | Voltage = map(Voltage, 3200, 4200, 0, 100); |
252 | Voltage = constrain(Voltage, 0, 100); |
259 | case 8750 : k=1; break ; |
260 | case 9240 : k=2; break ; |
261 | case 9370 : k=3; break ; |
262 | case 9410 : k=4; break ; |
263 | case 9620 : k=5; break ; |
264 | case 9740 : k=6; break ; |
265 | case 9800 : k=7; break ; |
266 | case 9840 : k=8; break ; |
267 | case 9890 : k=9; break ; |
268 | case 9950 : k=10; break ; |
269 | case 10040: k=11; break ; |
270 | case 10120: k=12; break ; |
271 | case 10170: k=13; break ; |
272 | case 10210: k=14; break ; |
273 | case 10250: k=15; break ; |
274 | case 10290: k=16; break ; |
275 | case 10370: k=17; break ; |
276 | case 10460: k=18; break ; |
277 | case 10510: k=19; break ; |
278 | case 10570: k=20; break ; |
279 | case 10620: k=21; break ; |
280 | case 10710: k=22; break ; |
281 | case 10790: k=23; break ; |
291 | case 1 :{s=8750; break ;} |
292 | case 2 :{s=9370; break ;} |
293 | case 3 :{s=8750; break ;} |
294 | case 4 :{s=9410; break ;} |
295 | case 5 :{s=9620; break ;} |
296 | case 6 :{s=9740; break ;} |
297 | case 7 :{s=9800; break ;} |
298 | case 8 :{s=9840; break ;} |
299 | case 9 :{s=9890; break ;} |
300 | case 10 :{s=9950; break ;} |
301 | case 11 :{s=10040; break ;} |
302 | case 12 :{s=10120; break ;} |
303 | case 13 :{s=10170; break ;} |
304 | case 14 :{s=10210; break ;} |
305 | case 15 :{s=10250; break ;} |
306 | case 16 :{s=10290; break ;} |
307 | case 17 :{s=10370; break ;} |
308 | case 18 :{s=10460; break ;} |
309 | case 19 :{s=10510; break ;} |
310 | case 20 :{s=10570; break ;} |
311 | case 21 :{s=10620; break ;} |
312 | case 22 :{s=10710; break ;} |
313 | 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.
001
//FM Radio OLED Copyright by GhostLion v1.5
002
003
#include <EEPROM.h>
004
#include <radio.h>
005
#include <RDA5807M.h>
006
007
#include "U8glib.h"
008
#include "rus6x10.h"
009
#include "MyDigitsHelveticaBold24.h"
010
011
#define Pin_DOWN 4 // левая кнопка
012
#define Pin_UP 2 // правая кнопка
013
#define Pin_SET 3 // центральная кнопка
014
#define FIX_BAND 1
015
016
const
unsigned
char
Volume [] = {0x7E, 0x42, 0x81, 0x81, 0x81, 0x81, 0xE7, 0xE7, 0x66, 0x66};
017
const
unsigned
char
Bass [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0x8D, 0xA2, 0x51, 0xA3, 0x91, 0x9A, 0x4D, 0x8A, 0x45, 0xB3, 0x99,0x80, 0x01, 0x7F, 0xFE};
018
const
unsigned
char
FM [] = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x98, 0xA9, 0x90, 0xA9, 0x90, 0x89,0x80, 0x01, 0x7F, 0xFE};
019
const
unsigned
char
Stereo [] = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0xB9, 0xA1, 0x25, 0xA1, 0x39, 0x99, 0x31, 0x89, 0x29, 0xB1, 0x25,0x80, 0x01, 0x7F, 0xFE};
020
021
const
unsigned
char
Bat1 [] = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC};
022
const
unsigned
char
Bat2 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC};
023
const
unsigned
char
Bat3 [] = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC};
024
const
unsigned
char
Bat4 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC};
025
const
unsigned
char
Bat5 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC};
026
const
unsigned
char
Bat6 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC};
027
const
unsigned
char
Bat7 [] = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC};
028
029
const
unsigned
char
Vol1 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x60, 0x00, 0x60, 0x00};
030
const
unsigned
char
Vol2 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00,0x6C, 0x00, 0x6C, 0x00};
031
const
unsigned
char
Vol3 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x0D, 0x80, 0x0D, 0x80,0x6D, 0x80, 0x6D, 0x80};
032
const
unsigned
char
Vol4 [] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x01, 0xB0, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0xB0,0x6D, 0xB0, 0x6D, 0xB0};
033
const
unsigned
char
Vol5 [] = {0x00, 0x06, 0x00, 0x06, 0x00, 0x36, 0x00, 0x36, 0x01, 0xB6, 0x01, 0xB6, 0x0D, 0xB6, 0x0D, 0xB6,0x6D, 0xB6, 0x6D, 0xB6};
034
035
byte
v,v2,k,k2,m,m2,rs, flag1=1,flag2=0,flag3=0;
036
int
Voltage,s,s2;
037
boolean b,b2,ms,ms2,sm,sm2,flag=1,MODE=1;
038
long
TimeOut;
039
040
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
041
RDA5807M radio;
042
043
void
setup
()
044
{
045
pinMode(Pin_DOWN,INPUT_PULLUP);
046
pinMode(Pin_UP,INPUT_PULLUP);
047
pinMode(Pin_SET,INPUT_PULLUP);
048
049
Inicial();
050
}
051
052
void
loop
()
053
{
054
Parsing();
055
Menu();
056
Energy();
057
}
058
//==============================================
059
void
Inicial()
060
{
061
u8g.firstPage();
062
do
{
063
u8g.setFont(rus6x10);
064
u8g.setPrintPos(38,12);u8g.print(F(
"ФМ РАДИО"
));
065
u8g.setPrintPos(36,32);u8g.print(F(
"v 1.5 Rus"
));
066
u8g.setPrintPos(40,42);u8g.print(F(
"20.11.18"
));
067
u8g.setPrintPos(25,52);u8g.print(F(
"By GhostLion"
));
068
u8g.setPrintPos(40,62);u8g.print(F(
"EXTENDED"
));
069
}
070
while
( u8g.nextPage() );
071
072
delay(1500);
073
sm = EEPROM[0];
074
v = EEPROM[1];
075
k = EEPROM[2];
076
m = EEPROM[3];
077
b = EEPROM[4];
078
ms = EEPROM[5];
079
s = EEPROM[6]*100+EEPROM[7];
080
v2=v; k2=k; m2=m; b2=b; ms2=ms; s2=s;sm2=sm;
081
radio.init();
082
radio.setVolume(v);
083
radio.setMono(ms);
084
radio.setMute(
false
);
085
radio.setBassBoost(b);
086
radio.setSoftMute(sm);
087
radio.setBandFrequency(FIX_BAND, s);
088
readVcc();
089
}
090
//================================================
091
void
Parsing()
092
{
093
boolean SET=digitalRead(Pin_SET);
094
boolean UP=digitalRead(Pin_UP);
095
boolean DOWN=digitalRead(Pin_DOWN);
096
097
if
(SET==HIGH && flag1==0)
098
{
099
flag1=1;
100
}
101
if
(SET==LOW && flag1==1)
102
{
103
flag1=0;
104
TimeOut=millis();
105
if
(MODE==1) {m++; flag=1;
if
(m>7) m=1;}
106
}
107
108
if
(UP==LOW && flag2==1)
109
{
110
flag2=0;
111
}
112
if
(UP==HIGH && flag2==0)
113
{
114
if
(MODE==1)
115
{
116
switch
(m)
117
{
118
case
1:{ (v==15?0:v++); radio.setVolume(v);
break
; }
119
case
2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s);
break
; }
120
case
3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s);
break
; }
121
case
4:{sm = 1; radio.setSoftMute(
true
);radio.setBandFrequency(FIX_BAND,s);
break
;}
122
case
5:{ radio.seekUp(
true
); delay(3000); s = radio.getFrequency(); Kanal();
break
; }
123
case
6:{ s=s+10;
if
(s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal();
break
; }
124
case
7:{ k++;
if
(k>23) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s);
break
;}
125
}
126
flag=1;
127
TimeOut=millis();
128
}
129
else
{(v==15?0:v++);radio.setVolume(v);}
130
flag2=1;
131
}
132
if
(DOWN==LOW && flag3==1)
133
{
134
flag3=0;
135
}
136
if
(DOWN==HIGH && flag3==0)
137
{
138
if
(MODE==1)
139
{
140
switch
(m)
141
{
142
case
1:{ (v==0?15:v--); radio.setVolume(v);
break
; }
143
case
2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s);
break
; }
144
case
3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s);
break
; }
145
case
4:{sm = 0; radio.setSoftMute(
false
);radio.setBandFrequency(FIX_BAND,s);
break
;}
146
case
5:{ radio.seekDown(
true
); delay(3000); s=radio.getFrequency(); Kanal();
break
; }
147
case
6:{ s=s-10;
if
(s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal();
break
; }
148
case
7:{ k--;
if
(k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s);
break
;}
149
}
150
flag=1;
151
TimeOut=millis();
152
}
153
else
{(v==0?15:v--);radio.setVolume(v);}
154
flag3=1;
155
}
156
}
157
//================================================
158
void
Menu()
159
{
160
float
ch;
161
if
(flag==1 && MODE==1)
162
{
163
rs = radio.getRSSI();
164
ch=
float
(s)/100;
165
u8g.firstPage();
166
do
{
167
u8g.setDefaultForegroundColor();
168
if
(Voltage>85) u8g.drawBitmap (110, 0, 2, 10, Bat7);
169
else
if
(Voltage>70) u8g.drawBitmap (110, 0, 2, 10, Bat6);
170
else
if
(Voltage>55) u8g.drawBitmap (110, 0, 2, 10, Bat5);
171
else
if
(Voltage>40) u8g.drawBitmap (110, 0, 2, 10, Bat4);
172
else
if
(Voltage>25) u8g.drawBitmap (110, 0, 2, 10, Bat3);
173
else
if
(Voltage>10) u8g.drawBitmap (110, 0, 2, 10, Bat2);
174
else
u8g.drawBitmap (110, 0, 2, 10, Bat1);
175
u8g.drawBitmap (0, 0, 1, 10, Volume);
176
if
(v<3) u8g.drawBitmap (13, 0, 2, 10, Vol1);
177
else
if
(v<7) u8g.drawBitmap (13, 0, 2, 10, Vol2);
178
else
if
(v<10) u8g.drawBitmap (13, 0, 2, 10, Vol3);
179
else
if
(v<13) u8g.drawBitmap (13, 0, 2, 10, Vol4);
180
else
u8g.drawBitmap (13, 0, 2, 10, Vol5);
181
if
(ms==0) u8g.drawBitmap (68, 0, 2, 10, Stereo);
182
if
(b==1) u8g.drawBitmap (88, 0, 2, 10, Bass);
183
if
(rs>43) u8g.drawBitmap (32, 0, 2, 10, FM);
184
185
u8g.setFont(MyDigitsHelveticaBold24);
186
if
(ch<100) u8g.setPrintPos(30,43);
else
u8g.setPrintPos(23,43);
187
u8g.print(ch,1);
188
u8g.setFont(rus6x10);
189
u8g.print(
" MHz"
);
190
if
(sm==1){
191
u8g.drawRFrame (0,16,18,13,2);
192
u8g.setPrintPos(3,26);
193
u8g.print(
"SM"
);
194
}
195
if
(k!=0){
196
u8g.drawRFrame (0,32,18,13,2);
197
u8g.setPrintPos(3,42);
198
if
(k<10) u8g.print(
"0"
);
199
u8g.print(k);
200
}
201
u8g.drawRFrame (0,51,127,12,3);
202
u8g.setPrintPos(13,61);
203
switch
(m)
204
{
205
case
1: {u8g.print(F(
"- < ГРОМКОСТЬ > +"
));
break
;}
206
case
2: {u8g.print(F(
" НЕТ < БАСС > ДА"
));
break
;}
207
case
3: {u8g.print(F(
"НЕТ < СТЕРЕО > ДА"
));
break
;}
208
case
4: {u8g.print(F(
"НЕТ < S.MUTE > ДА"
));
break
;}
209
case
5: {u8g.print(F(
" < АВТОПОИСК >"
));
break
;}
210
case
6: {u8g.print(F(
"< РУЧ. ПОИСК >"
));
break
;}
211
case
7: {u8g.print(F(
" < КАНАЛЫ >"
));
break
;}
212
213
}
214
215
216
}
217
while
( u8g.nextPage() );
218
flag=0;
219
}
220
}
221
//================================================
222
void
Energy()
223
{
224
if
(MODE==1 && millis()-TimeOut>2000) flag=1;
225
if
(MODE==1 && millis()-TimeOut>8000)
226
{
227
u8g.sleepOn();
228
MODE=0;
229
if
(sm2!=sm){sm2=sm;EEPROM[0] = sm;}
230
if
(v2!=v){v2=v; EEPROM[1] = v;}
231
if
(k2!=k){k2=k; EEPROM[2] = k;}
232
if
(m2!=m){m2=m; EEPROM[3] = m;}
233
if
(b2!=b){b2=b; EEPROM[4] = b;}
234
if
(ms2!=ms){ms2=ms; EEPROM[5] = ms;}
235
if
(s2!=s){s2=s; EEPROM[6] =
int
(s/100); EEPROM[7] = s%100;}
236
}
237
if
(MODE==0 && millis()-TimeOut<500)
238
{
239
u8g.sleepOff();
240
readVcc();
241
MODE=1;flag=1;
242
}
243
}
244
//===================================================
245
void
readVcc()
246
{
247
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
248
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
249
#else
250
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
251
#endif
252
delay(2);
// Wait for Vref to settle
253
ADCSRA |= _BV(ADSC);
// Start conversion
254
while
(bit_is_set(ADCSRA, ADSC));
// measuring
255
uint8_t low = ADCL;
// must read ADCL first - it then locks ADCH
256
uint8_t high = ADCH;
// unlocks both
257
long
result = (high << 8) | low;
258
259
result = 1.080 * 1023 * 1000 / result;
// расчёт реального VCC
260
Voltage =
int
(result);
261
Voltage = map(Voltage, 3200, 4200, 0, 100);
262
Voltage = constrain(Voltage, 0, 100);
263
}
264
//=======================================================
265
void
Kanal()
266
{
267
switch
(s)
268
{
269
case
8750 : k=1;
break
;
270
case
9240 : k=2;
break
;
271
case
9370 : k=3;
break
;
272
case
9410 : k=4;
break
;
273
case
9620 : k=5;
break
;
274
case
9740 : k=6;
break
;
275
case
9800 : k=7;
break
;
276
case
9840 : k=8;
break
;
277
case
9890 : k=9;
break
;
278
case
9950 : k=10;
break
;
279
case
10040: k=11;
break
;
280
case
10120: k=12;
break
;
281
case
10170: k=13;
break
;
282
case
10210: k=14;
break
;
283
case
10250: k=15;
break
;
284
case
10290: k=16;
break
;
285
case
10370: k=17;
break
;
286
case
10460: k=18;
break
;
287
case
10510: k=19;
break
;
288
case
10570: k=20;
break
;
289
case
10620: k=21;
break
;
290
case
10710: k=22;
break
;
291
case
10790: k=23;
break
;
292
default
: k=0;
293
294
}
295
}
296
//==========================================================
297
void
Frequency()
298
{
299
switch
(k)
300
{
301
case
1 :{s=8750;
break
;}
302
case
2 :{s=9370;
break
;}
303
case
3 :{s=8750;
break
;}
304
case
4 :{s=9410;
break
;}
305
case
5 :{s=9620;
break
;}
306
case
6 :{s=9740;
break
;}
307
case
7 :{s=9800;
break
;}
308
case
8 :{s=9840;
break
;}
309
case
9 :{s=9890;
break
;}
310
case
10 :{s=9950;
break
;}
311
case
11 :{s=10040;
break
;}
312
case
12 :{s=10120;
break
;}
313
case
13 :{s=10170;
break
;}
314
case
14 :{s=10210;
break
;}
315
case
15 :{s=10250;
break
;}
316
case
16 :{s=10290;
break
;}
317
case
17 :{s=10370;
break
;}
318
case
18 :{s=10460;
break
;}
319
case
19 :{s=10510;
break
;}
320
case
20 :{s=10570;
break
;}
321
case
21 :{s=10620;
break
;}
322
case
22 :{s=10710;
break
;}
323
case
23 :{s=10790;
break
;}
324
}
325
}
Зря травил/паял,не получается скомпилировать,ошибка компиляции
У меня версия 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
Там вообще все мудрено,вот начал-все работает
01
#include <Wire.h>
02
03
#define Pin_DOWN 12//4 // левая кнопка
04
#define Pin_UP 13//2 // правая кнопка
05
#define Pin_SET 11//3 // центральная кнопка
06
const
byte
channel=5;
07
byte
Byte0;
08
byte
val = 0;
09
byte
volume = 4;
10
int
freq=1011;
11
void
setup
()
12
{
13
pinMode(Pin_DOWN,INPUT_PULLUP);
14
pinMode(Pin_UP,INPUT_PULLUP);
15
pinMode(Pin_SET,INPUT_PULLUP);
16
Wire.begin();
// подключение к шине i2c
17
delay(500);
18
Inicial();
19
}
20
21
void
loop
()
22
{
23
boolean SET=digitalRead(Pin_SET);
24
boolean UP=digitalRead(Pin_UP);
25
boolean DOWN=digitalRead(Pin_DOWN);
26
if
(DOWN==LOW)
27
{
28
volume=volume+1; set_vol();delay(500);
29
//freq=freq+1; set_freq();delay(500);//работает норм
30
}
31
if
(SET==LOW)
32
{
33
volume=volume-1; set_vol();delay(500);
34
//freq=freq-1;set_freq();delay(500); //работает норм
35
}
36
if
(UP==LOW)
37
{
38
stby();
//выключаем радио ,потребление почти 0
39
40
delay(1500);
//ждем 1,5 сек и вкл
41
set_freq();
// вкл радио
42
}
43
}
44
void
Inicial()
45
{
46
Wire.beginTransmission(0x10);
// передача для устройства
47
//02 // адрес устройства указывается в документации (datasheet)
48
Wire.write(0B11010000);
// отправка байта
49
Wire.write(0B10000001);
50
//03
51
Byte0 = freq - 870;
52
Wire.write(Byte0);
53
Byte0=0B00010011;
54
Wire.write(Byte0);
55
//04
56
Wire.write(0B00010000);
57
Wire.write(0B00000000);
58
//05
59
Wire.write(0B10001000);
60
Byte0=0B10000000 + volume;
61
Wire.write(Byte0);
62
Wire.endTransmission();
// передача данных
63
}
64
void
set_freq()
//установка частоты
65
{
66
if
(freq > 1080) freq = 870;
67
if
(freq < 880) freq = 1080;
68
Wire.beginTransmission(0x10);
// передача для устройства
69
//02 // адрес устройства указывается в документации (datasheet)
70
Wire.write(0B11010000);
// отправка байта
71
Wire.write(0B10000001);
72
//03
73
Byte0 = freq - 870;
74
Wire.write(Byte0);
//частота,старшие 8 бит
75
Byte0=0B00010011;
//7,6-мл биты частоты=всегда 00 так как шаг=25, 4-точная установка,3,2-диапазон=87-108,1,0-шаг 25 кгц
76
Wire.write(Byte0);
77
Wire.endTransmission();
// передача данных
78
}
79
void
set_vol()
//установка громкости
80
{
81
if
(volume > 200) volume = 0;
82
if
(volume >15) volume = 15;
83
Wire.beginTransmission(0x11);
// передача для устройства
84
//02 // адрес устройства указывается в документации (datasheet)
85
Wire.write(0B00000101);
// отправка байта val
86
//05
87
Wire.write(0B10001000);
88
Byte0=0B10000000 + volume;
89
Wire.write(Byte0);
90
Wire.endTransmission();
// передача данных
91
}
92
void
stby()
93
{
94
Wire.beginTransmission(0x10);
// выкл радио
95
//02 // адрес устройства указывается в документации (datasheet)
96
Wire.write(0B11010000);
// отправка байта val
97
Wire.write(0B10000000);
98
Wire.endTransmission();
// передача данных
99
}
Финальная версия радио. С каналами не стал морочиться - сделал, поигрался, но через программу забивать удобнее. Короче, оставил все как было, только внёс некоторые правки.
.

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)
Сколько максимально?
01
Так правильно?
02
void
Kanal()
03
{
04
switch
(s)
05
{
06
case
8750 : k=1;
break
;
//Бизнес ФМ
07
case
8830 : k=2;
break
;
//Ретро ФМ
08
case
8910 : k=3;
break
;
//Радио Джаз
09
case
8950 : k=4;
break
;
//Мегаполис ФМ
10
case
8990 : k=5;
break
;
//Страна ФМ
11
case
9030 : k=6;
break
;
//Авторадио
12
case
9080 : k=7;
break
;
//Релакс ФМ
13
case
9120 : k=8;
break
;
//Эхо Москвы
14
case
9890 : k=9;
break
;
//Радио Культура
15
case
9360 : k=10;
break
;
//Коммерсант ФМ
16
case
9560: k=11;
break
;
//Радио Звезда
17
case
9600: k=12;
break
;
//Дорожное радио
18
case
9720: k=13;
break
;
//Радио КП
19
case
9920: k=14;
break
;
//Радио Романтика
20
case
9960: k=15;
break
;
//Радио Орфей
21
case
10010: k=16;
break
;
//Серебряный дождь
22
case
10170: k=17;
break
;
//Наше радио
23
case
10250: k=18;
break
;
//Камеди Радио
24
case
10300: k=19;
break
;
//Радио Шансон
25
case
10500: k=20;
break
;
//Радио Книга
26
case
10570: k=21;
break
;
//Русское радио
27
case
10740: k=22;
break
;
//Хит ФМ
28
case
10780: k=23;
break
;
//Милицейская волна
29
default
: k=0;
30
31
}
32
}
33
//==========================================================
34
void
Frequency()
35
{
36
switch
(k)
37
{
38
case
1 :{s=8750;
break
;}
39
case
2 :{s=8830;
break
;}
40
case
3 :{s=8910;
break
;}
41
case
4 :{s=8950;
break
;}
42
case
5 :{s=8990;
break
;}
43
case
6 :{s=9030;
break
;}
44
case
7 :{s=9080;
break
;}
45
case
8 :{s=9120;
break
;}
46
case
9 :{s=9890;
break
;}
47
case
10 :{s=9360;
break
;}
48
case
11 :{s=9560;
break
;}
49
case
12 :{s=9600;
break
;}
50
case
13 :{s=9720;
break
;}
51
case
14 :{s=9920;
break
;}
52
case
15 :{s=9960;
break
;}
53
case
16 :{s=10010;
break
;}
54
case
17 :{s=10170;
break
;}
55
case
18 :{s=10250;
break
;}
56
case
19 :{s=10300;
break
;}
57
case
20 :{s=10500;
break
;}
58
case
21 :{s=10570;
break
;}
59
case
22 :{s=10740;
break
;}
60
case
23 :{s=10780;
break
;}
61
}
62
}
255 (переменная k типа byte)
Да, правильно.
GhostLion, доброго дня! Собрал на макетке, 51 радиостанцию внес в скетч, залил, все работает. Теперь буду засовывать все в корпус сгоревшей БТ колонки Оклик ОК-10 (аудио вход джек умудрился попасть в фазу пилота на столе).
Предела совершенству не существует, и я попросил бы Вас создать скетч PLATINUM 1.7, внесением в v1.6 индикацию уровня сигнала (антенка вместо наушников). Сам слаб в програмировании, а вот готовый скетч с такой функцией имеется.
001
// Nicu Florica (aka niq_ro) from <a href="http://www.tehnic.go.ro" title="http://www.tehnic.go.ro" rel="nofollow">http://www.tehnic.go.ro</a> made a small change for nice display for low frequence (bellow 100MHz)
002
// it use info from <a href="http://full-chip.net/arduino-proekty/97-cifrovoy-fm-priemnik-na-arduino-i-module-rda5807-s-graficheskim-displeem-i-funkciey-rds.html" title="http://full-chip.net/arduino-proekty/97-cifrovoy-fm-priemnik-na-arduino-i-module-rda5807-s-graficheskim-displeem-i-funkciey-rds.html" rel="nofollow">http://full-chip.net/arduino-proekty/97-cifrovoy-fm-priemnik-na-arduino-...</a>
003
// original look like is from <a href="http://seta43.hol.es/radiofm.html" title="http://seta43.hol.es/radiofm.html" rel="nofollow">http://seta43.hol.es/radiofm.html</a>
004
// version 1 - store frequency and volume step in EEPROM memory
005
006
#include <EEPROM.h> // info -> <a href="http://tronixstuff.com/2011/03/16/tutorial-your-arduinos-inbuilt-eeprom/" title="http://tronixstuff.com/2011/03/16/tutorial-your-arduinos-inbuilt-eeprom/" rel="nofollow">http://tronixstuff.com/2011/03/16/tutorial-your-arduinos-inbuilt-eeprom/</a>
007
008
#include <Wire.h>
009
#define DEBUG 0
010
011
const
int
entrada = A0;
012
int
entradaV = 0;
013
014
int
menu;
015
#define MAXmenu 4
016
int
menux;
017
#define MAXmenux 4
018
static
char
* menuS[]= {
" "
,
"MANUAL TUNE"
,
"VOLUME "
,
"AUTO TUNE"
,
"INFO "
};
019
020
//int volumen=2,volumenOld=7;
021
int
volumen, volumenOld=7;
022
int
frecuencia,frecuenciaOld;
023
024
025
unsigned
int
z,z1;
026
byte
xfrecu,xfrecuOld;
027
unsigned
int
estado[6];
028
029
unsigned
long
time,time1,time2,time3;
030
031
// int RDA5807_adrs=0x10; // I2C-Address RDA Chip for sequential Access
032
// int RDA5807_adrr=0x11; // I2C-Address RDA Chip for random Access
033
// int RDA5807_adrt=0x60; // I2C-Address RDA Chip for TEA5767like Access
034
035
char
buffer[30];
036
unsigned
int
RDS[4];
037
char
seg_RDS[8];
038
char
seg_RDS1[64];
039
char
indexRDS1;
040
041
char
hora,minuto,grupo,versio;
042
unsigned
long
julian;
043
044
int
mezcla;
045
046
void
setup
()
047
{
048
Wire.begin();
049
Serial
.begin(9600);
050
051
/*
052
// write data in eeprom memory
053
EEPROM.write(201,175); // frequency = frecvencia * 0.1 + 87
054
// frecuencia=175; //104.5
055
EEPROM.write(202,7); // volume 0 to 15
056
*/
057
058
// read value of last frequency
059
frecuencia = EEPROM.read(201);
060
volumen = EEPROM.read(202);
061
062
if
(volumen < 0) volumen = 0;
063
if
(volumen >15) volumen = 15;
064
if
(frecuencia <0) frecuencia = 0;
065
if
(frecuencia >210) frecuencia = 210;
066
067
LcdInitialise();
068
LcdClear();
069
// drawBox();
070
071
// WriteReg(0x02,0xC001); // write 0xC002 into Reg.2 (soft reset, enable,RDS, )
072
WriteReg(0x02,0xC00d);
// write 0xC00d into Reg.2 ( soft reset, enable,RDS, )
073
WriteReg(0x05,0x84d8);
// write ,0x84d8 into Reg.3
074
075
// frecuencia inicial = frecvencia * 0.1 + 87
076
// frecuencia=175; //104.5
077
//frecuencia=130; //100.0 ==>
078
// frecuencia=26; //89.6
079
time3=time2=time1=time = millis();
080
menu=3;
081
082
canal(frecuencia);
083
clearRDS;
084
}
085
086
void
loop
() {
087
088
entradaV = analogRead(entrada);
089
090
#if DEBUG
091
Serial
.print(
"sensor = "
);
Serial
.println(entradaV);delay(50);
092
#endif
093
094
// Boton menu
095
if
(entradaV>500 && entradaV<524)
096
{
097
menu++;
098
if
(menu>MAXmenu)menu=1;
099
Visualizar();
100
// sprintf(buffer,"Menu->%s",menuS[menu]); gotoXY(2,2); LcdString(buffer);
101
#if DEBUG
102
Serial
.print(
"menu = "
);
Serial
.println(menu);
103
#endif
104
while
(1020>analogRead(entrada))delay(5);
105
}
106
107
// Boton derecho
108
if
( entradaV<50)
109
{
110
menux++;
111
if
(menux>MAXmenux)menux=MAXmenux;
112
#if DEBUG
113
Serial
.print(
"menux = "
);
Serial
.println(menux);
114
#endif
115
switch
(menu)
116
{
117
case
1:
118
frecuencia++;
119
if
(frecuencia>210)frecuencia=210;
// верхняя граница частот
120
delay(130);
121
break
;
122
case
2:
123
volumen++;
124
if
(volumen>15)volumen=15;
125
while
(1020>analogRead(entrada))delay(5);
126
break
;
127
case
3:
128
busqueda(0);
129
while
(1020>analogRead(entrada))delay(5);
130
break
;
131
case
4:
132
LcdClear();
133
visualPI();
134
delay(3000);
135
LcdClear();
136
frecuenciaOld=-1;
137
break
;
138
}
139
}
140
141
// Boton izquierdo
142
if
( entradaV<700 && entradaV>660)
143
{
144
menux--;
145
if
(menux<1)menux=1;
146
#if DEBUG
147
Serial
.print(
"menux = "
);
Serial
.println(menux);
148
#endif
149
switch
(menu)
150
{
151
case
1:
152
frecuencia--;
153
if
(frecuencia<0)frecuencia=0;
154
delay(130);
155
break
;
156
case
2:
157
volumen--;
158
if
(volumen<0)volumen=0;
159
while
(1020>analogRead(entrada))delay(5);
160
break
;
161
case
3:
162
busqueda(1);
163
while
(1020>analogRead(entrada))delay(5);
164
break
;
165
case
4:
166
LcdClear();
167
visualPTY();
168
delay(3000);
169
LcdClear();
170
frecuenciaOld=-1;
171
break
;
172
}
173
174
}
175
176
if
( millis()-time2>50)
177
{
178
ReadEstado();
179
time1 = millis();
180
//RDS
181
if
((estado[0] & 0x8000)!=0) {get_RDS();}
182
}
183
if
( millis()-time3>500)
184
{
185
time3 = millis();
186
Visualizar();
187
188
}
189
190
if
( frecuencia!=frecuenciaOld)
191
{
192
frecuenciaOld=frecuencia;
193
z=870+frecuencia;
194
EEPROM.write(201,frecuencia);
195
#if DEBUG
196
Serial
.print(
"Frecuencia = "
);
Serial
.println(frecuencia);
197
#endif
198
sprintf(buffer,
"%04d "
,z);
199
gotoXY(1,3);
200
201
for
(z=0;z<5;z++)
202
{
203
if
(z==0) {
204
if
(frecuencia < 130) LcdStringX(
" "
);
205
else
LcdCharacterX(buffer[0]);
206
// else LcdStringX("1");
207
}
208
209
if
(z==3) LcdStringX(
"."
);
210
// if((z==0) and (buffer[0]==0)) LcdStringX("."); else LcdCharacterX(buffer[z]);
211
if
(z>0) LcdCharacterX(buffer[z]);
212
}
213
214
215
// LcdString("MHz");
216
gotoXY(62,3);
217
LcdString(
"MHz"
);
218
219
canal(frecuencia);
220
clearRDS();
221
}
222
223
//Cambio de volumen
224
if
(volumen!=volumenOld)
225
{
226
volumenOld=volumen;
227
sprintf(buffer,
"Vol %02d"
,volumen); gotoXY(38,1); LcdString(buffer);
228
WriteReg(5, 0x84D0 | volumen);
229
EEPROM.write(202,volumen);
230
}
231
}
232
233
void
visualPI(
void
)
234
{
235
#if DEBUG
236
Serial
.print(
"PAIS: "
);
Serial
.println(RDS[0]>>12 & 0X000F);
237
Serial
.print(
"Cobertura:"
);
Serial
.println(RDS[0]>>8 & 0X000F);
238
Serial
.print(
"CODIGO:"
);
Serial
.println(RDS[0] & 0X00FF);
239
#endif
240
/*
241
gotoXY(1,3);sprintf(buffer,"PAIS -%02d",RDS[0]>>12 & 0X000F); LcdString(buffer);
242
gotoXY(1,4);sprintf(buffer,"COBERT-%02d",RDS[0]>>8 & 0X000F); LcdString(buffer);
243
gotoXY(1,5);sprintf(buffer,"CODIGO-%02d",RDS[0] & 0X00FF); LcdString(buffer);
244
*/
245
gotoXY(1,3);sprintf(buffer,
"COUNTRY -%02d"
,RDS[0]>>12 & 0X000F); LcdString(buffer);
246
gotoXY(1,4);sprintf(buffer,
"COVERAGE-%02d"
,RDS[0]>>8 & 0X000F); LcdString(buffer);
247
gotoXY(1,5);sprintf(buffer,
"CODE -%02d"
,RDS[0] & 0X00FF); LcdString(buffer);
248
249
}
250
void
visualPTY(
void
)
251
{
252
#if DEBUG
253
Serial
.print(
"PTY: "
);
Serial
.println(RDS[1]>>5 & 0X001F);
254
#endif
255
256
/*
257
gotoXY(1,3); LcdString("TIPO");
258
gotoXY(1,4); LcdString("PROGRAMA");
259
gotoXY(1,5);sprintf(buffer,"%02d",RDS[1]>>5 & 0X001F); LcdString(buffer);
260
*/
261
gotoXY(1,3); LcdString(
"TYPE"
);
262
gotoXY(1,4); LcdString(
"PROGRAMS"
);
263
gotoXY(1,5);sprintf(buffer,
"%02d"
,RDS[1]>>5 & 0X001F); LcdString(buffer);
264
265
}
266
267
void
busqueda(
byte
direc)
268
{
269
byte
i;
270
if
(!direc) WriteReg(0x02,0xC30d);
else
WriteReg(0x02,0xC10d);
271
272
for
(i=0;i<10;i++)
273
{
274
delay(200);
275
ReadEstado();
276
if
(estado[0]&0x4000)
277
{
278
//Serial.println("Emisora encontrada");
279
frecuencia=estado[0] & 0x03ff;
280
break
;
281
}
282
}
283
}
284
285
void
clearRDS(
void
)
286
{
287
gotoXY(10,4);
for
(z=0;z<8;z++) {seg_RDS[z]=32; LcdCharacter(32);}
//borrar Name LCD Emisora
288
gotoXY(38,2);
for
(z=0;z<6;z++) { LcdCharacter(32);}
//borrar linea Hora
289
for
(z=0;z<64;z++) seg_RDS1[z]=32;
290
}
291
292
void
Visualizar(
void
)
293
{
294
//Serial.print("READ_Frecuencia= " ); Serial.println(estado[0] & 0x03ff);
295
gotoXY(2,0); LcdStringX(
"FM"
);
296
sprintf(buffer,
"%s"
,menuS[menu]); gotoXY(2,2); LcdString(buffer);
297
//Detectar señal stereo
298
gotoXY(72,0);
299
if
((estado[0] & 0x0400)==0) LcdCharacter(32);
else
LcdCharacter(127);
300
//Señal
301
z=estado[1]>>10; sprintf(buffer,
"S-%02d"
,z); gotoXY(38,0); LcdString(buffer);
302
sprintf(buffer,
"Vol %02d"
,volumen); gotoXY(38,1); LcdString(buffer);
303
//ver RADIO_TXT
304
gotoXY(0,5);
305
z1=indexRDS1;
306
for
(z=0;z<12;z++)
307
{
308
LcdCharacter(seg_RDS1[z1]);
309
z1++;
310
if
(z1>35)z1=0;
311
}
312
indexRDS1++;
if
(indexRDS1>35) indexRDS1=0;
313
314
frecuencia=estado[0] & 0x03ff;
315
}
316
317
void
canal(
int
canal)
318
{
319
byte
numeroH,numeroL;
320
321
numeroH= canal>>2;
322
numeroL = ((canal&3)<<6 | 0x10);
323
Wire.beginTransmission(0x11);
324
Wire.write(0x03);
325
Wire.write(numeroH);
// write frequency into bits 15:6, set tune bit
326
Wire.write(numeroL);
327
Wire.endTransmission();
328
}
329
330
//________________________
331
//RDA5807_adrr=0x11;
332
// I2C-Address RDA Chip for random Access
333
void
WriteReg(
byte
reg,unsigned
int
valor)
334
{
335
Wire.beginTransmission(0x11);
336
Wire.write(reg); Wire.write(valor >> 8); Wire.write(valor & 0xFF);
337
Wire.endTransmission();
338
//delay(50);
339
}
340
341
//RDA5807_adrs=0x10;
342
// I2C-Address RDA Chip for sequential Access
343
int
ReadEstado()
344
{
345
Wire.requestFrom(0x10, 12);
346
for
(
int
i=0; i<6; i++) { estado[i] = 256*Wire.read ()+Wire.read(); }
347
Wire.endTransmission();
348
349
}
350
351
//READ RDS Direccion 0x11 for random access
352
void
ReadW()
353
{
354
Wire.beginTransmission(0x11);
// Device 0x11 for random access
355
Wire.write(0x0C);
// Start at Register 0x0C
356
Wire.endTransmission(0);
// restart condition
357
Wire.requestFrom(0x11,8, 1);
// Retransmit device address with READ, followed by 8 bytes
358
for
(
int
i=0; i<4; i++) {RDS[i]=256*Wire.read()+Wire.read();}
// Read Data into Array of Unsigned Ints
359
Wire.endTransmission();
360
}
361
362
void
get_RDS()
363
{
364
int
i;
365
ReadW();
366
grupo=(RDS[1]>>12)&0xf;
367
if
(RDS[1]&0x0800) versio=1;
else
versio=0;
//Version A=0 Version B=1
368
if
(versio==0)
369
{
370
#if DEBUG
371
sprintf(buffer,
"Version=%d Grupo=%02d "
,versio,grupo);
Serial
.print(buffer);
372
// Serial.print(" 0->");Serial.print(RDS[0],HEX);Serial.print(" 1->");Serial.print(RDS[1],HEX);Serial.print(" 2->");Serial.print(RDS[2],HEX);Serial.print(" 3->");Serial.println(RDS[03],HEX);
373
// Serial.print(" 0->");Serial.print(RDS[0],BIN);Serial.print(" 1->");Serial.print(RDS[1],BIN);Serial.print(" 2->");Serial.print(RDS[2],BIN);Serial.print(" 3->");Serial.println(RDS[03],BIN);
374
#endif
375
switch
(grupo)
376
{
377
case
0:
378
#if DEBUG
379
Serial
.print(
"_RDS0__"
);
380
#endif
381
i=(RDS[1] & 3) <<1;
382
seg_RDS[i]=(RDS[3]>>8);
383
seg_RDS[i+1]=(RDS[3]&0xFF);
384
gotoXY(10,4);
385
for
(i=0;i<8;i++)
386
{
387
#if DEBUG
388
Serial
.write(seg_RDS[i]);
389
#endif
390
391
if
(seg_RDS[i]>31 && seg_RDS[i]<128)
392
LcdCharacter(seg_RDS[i]);
393
else
394
LcdCharacter(32);
395
}
396
//Serial.print("FrecuAlt1-");Serial.println((RDS[2]>>8)+875);
397
//Serial.print("FrecuAlt2-"); Serial.println(RDS[2]&0xFF+875);
398
399
#if DEBUG
400
Serial
.println(
"---"
);
401
#endif
402
break
;
403
case
2:
404
i=(RDS[1] & 15) <<2;
405
seg_RDS1[i]=(RDS[2]>>8);
406
seg_RDS1[i+1]=(RDS[2]&0xFF);
407
seg_RDS1[i+2]=(RDS[3]>>8);
408
seg_RDS1[i+3]=(RDS[3]&0xFF);
409
#if DEBUG
410
Serial
.println(
"_RADIOTEXTO_"
);
411
//Serial.print(i);Serial.print(" ");Serial.println(RDS[1] & 15);
412
//Serial.write(RDS[2]>>8); Serial.write (RDS[2]&0xFF);Serial.write(RDS[3]>>8);Serial.write(RDS[3]&0xFF);Serial.write("_");
413
for
(i=0;i<32;i++)
Serial
.write(seg_RDS1[i]);
414
Serial
.println(
"-TXT-"
);
415
#endif
416
break
;
417
case
4:
418
i=RDS[3]& 0x003f;
419
minuto=(RDS[3]>>6)& 0x003f;
420
hora=(RDS[3]>>12)& 0x000f;
421
if
(RDS[2]&1) hora+=16;
422
hora+=i;
423
z=RDS[2]>>1;
424
julian=z;
425
426
if
(RDS[1]&1) julian+=32768;
427
if
(RDS[1]&2) julian+=65536;
428
#if DEBUG
429
Serial
.print(
"_DATE_"
);
430
Serial
.print(
" Juliano="
);
Serial
.print(julian);
431
sprintf(buffer,
" %02d:%02d "
,hora,minuto); gotoXY(38,2); LcdString(buffer);
432
Serial
.println(buffer);
433
#endif
434
break
;
435
default
:
436
#if DEBUG
437
Serial
.println(
"__"
);
438
#endif
439
;
440
}
441
}
442
}
443
444
// The pins to use on the arduino
445
#define PIN_SCE 7
446
#define PIN_RESET 6
447
#define PIN_DC 5
448
#define PIN_SDIN 4
449
#define PIN_SCLK 3
450
451
// COnfiguration for the LCD
452
#define LCD_C LOW
453
#define LCD_D HIGH
454
#define LCD_CMD 0
455
456
// Size of the LCD
457
#define LCD_X 84
458
#define LCD_Y 48
459
460
int
scrollPosition = -10;
461
462
static
const
byte
ASCII[][5] =
463
{
464
{0x00, 0x00, 0x00, 0x00, 0x00}
// 20
465
,{0x00, 0x00, 0x5f, 0x00, 0x00}
// 21 !
466
,{0x00, 0x07, 0x00, 0x07, 0x00}
// 22 "
467
,{0x14, 0x7f, 0x14, 0x7f, 0x14}
// 23 #
468
,{0x24, 0x2a, 0x7f, 0x2a, 0x12}
// 24 $
469
,{0x23, 0x13, 0x08, 0x64, 0x62}
// 25 %
470
,{0x36, 0x49, 0x55, 0x22, 0x50}
// 26 &
471
,{0x00, 0x05, 0x03, 0x00, 0x00}
// 27 '
472
,{0x00, 0x1c, 0x22, 0x41, 0x00}
// 28 (
473
,{0x00, 0x41, 0x22, 0x1c, 0x00}
// 29 )
474
,{0x14, 0x08, 0x3e, 0x08, 0x14}
// 2a *
475
,{0x08, 0x08, 0x3e, 0x08, 0x08}
// 2b +
476
,{0x00, 0x50, 0x30, 0x00, 0x00}
// 2c ,
477
,{0x08, 0x08, 0x08, 0x08, 0x08}
// 2d -
478
,{0x00, 0x60, 0x60, 0x00, 0x00}
// 2e .
479
,{0x20, 0x10, 0x08, 0x04, 0x02}
// 2f /
480
,{0x3e, 0x51, 0x49, 0x45, 0x3e}
// 30 0
481
,{0x00, 0x42, 0x7f, 0x40, 0x00}
// 31 1
482
,{0x42, 0x61, 0x51, 0x49, 0x46}
// 32 2
483
,{0x21, 0x41, 0x45, 0x4b, 0x31}
// 33 3
484
,{0x18, 0x14, 0x12, 0x7f, 0x10}
// 34 4
485
,{0x27, 0x45, 0x45, 0x45, 0x39}
// 35 5
486
,{0x3c, 0x4a, 0x49, 0x49, 0x30}
// 36 6
487
,{0x01, 0x71, 0x09, 0x05, 0x03}
// 37 7
488
,{0x36, 0x49, 0x49, 0x49, 0x36}
// 38 8
489
,{0x06, 0x49, 0x49, 0x29, 0x1e}
// 39 9
490
,{0x00, 0x36, 0x36, 0x00, 0x00}
// 3a :
491
,{0x00, 0x56, 0x36, 0x00, 0x00}
// 3b ;
492
,{0x08, 0x14, 0x22, 0x41, 0x00}
// 3c <
493
,{0x14, 0x14, 0x14, 0x14, 0x14}
// 3d =
494
,{0x00, 0x41, 0x22, 0x14, 0x08}
// 3e >
495
,{0x02, 0x01, 0x51, 0x09, 0x06}
// 3f ?
496
,{0x32, 0x49, 0x79, 0x41, 0x3e}
// 40 @
497
,{0x7e, 0x11, 0x11, 0x11, 0x7e}
// 41 A
498
,{0x7f, 0x49, 0x49, 0x49, 0x36}
// 42 B
499
,{0x3e, 0x41, 0x41, 0x41, 0x22}
// 43 C
500
,{0x7f, 0x41, 0x41, 0x22, 0x1c}
// 44 D
501
,{0x7f, 0x49, 0x49, 0x49, 0x41}
// 45 E
502
,{0x7f, 0x09, 0x09, 0x09, 0x01}
// 46 F
503
,{0x3e, 0x41, 0x49, 0x49, 0x7a}
// 47 G
504
,{0x7f, 0x08, 0x08, 0x08, 0x7f}
// 48 H
505
,{0x00, 0x41, 0x7f, 0x41, 0x00}
// 49 I
506
,{0x20, 0x40, 0x41, 0x3f, 0x01}
// 4a J
507
,{0x7f, 0x08, 0x14, 0x22, 0x41}
// 4b K
508
,{0x7f, 0x40, 0x40, 0x40, 0x40}
// 4c L
509
,{0x7f, 0x02, 0x0c, 0x02, 0x7f}
// 4d M
510
,{0x7f, 0x04, 0x08, 0x10, 0x7f}
// 4e N
511
,{0x3e, 0x41, 0x41, 0x41, 0x3e}
// 4f O
512
,{0x7f, 0x09, 0x09, 0x09, 0x06}
// 50 P
513
,{0x3e, 0x41, 0x51, 0x21, 0x5e}
// 51 Q
514
,{0x7f, 0x09, 0x19, 0x29, 0x46}
// 52 R
515
,{0x46, 0x49, 0x49, 0x49, 0x31}
// 53 S
516
,{0x01, 0x01, 0x7f, 0x01, 0x01}
// 54 T
517
,{0x3f, 0x40, 0x40, 0x40, 0x3f}
// 55 U
518
,{0x1f, 0x20, 0x40, 0x20, 0x1f}
// 56 V
519
,{0x3f, 0x40, 0x38, 0x40, 0x3f}
// 57 W
520
,{0x63, 0x14, 0x08, 0x14, 0x63}
// 58 X
521
,{0x07, 0x08, 0x70, 0x08, 0x07}
// 59 Y
522
,{0x61, 0x51, 0x49, 0x45, 0x43}
// 5a Z
523
,{0x00, 0x7f, 0x41, 0x41, 0x00}
// 5b [
524
,{0x02, 0x04, 0x08, 0x10, 0x20}
// 5c ¥
525
,{0x00, 0x41, 0x41, 0x7f, 0x00}
// 5d ]
526
,{0x04, 0x02, 0x01, 0x02, 0x04}
// 5e ^
527
,{0x40, 0x40, 0x40, 0x40, 0x40}
// 5f _
528
,{0x00, 0x01, 0x02, 0x04, 0x00}
// 60 `
529
,{0x20, 0x54, 0x54, 0x54, 0x78}
// 61 a
530
,{0x7f, 0x48, 0x44, 0x44, 0x38}
// 62 b
531
,{0x38, 0x44, 0x44, 0x44, 0x20}
// 63 c
532
,{0x38, 0x44, 0x44, 0x48, 0x7f}
// 64 d
533
,{0x38, 0x54, 0x54, 0x54, 0x18}
// 65 e
534
,{0x08, 0x7e, 0x09, 0x01, 0x02}
// 66 f
535
,{0x0c, 0x52, 0x52, 0x52, 0x3e}
// 67 g
536
,{0x7f, 0x08, 0x04, 0x04, 0x78}
// 68 h
537
,{0x00, 0x44, 0x7d, 0x40, 0x00}
// 69 i
538
,{0x20, 0x40, 0x44, 0x3d, 0x00}
// 6a j
539
,{0x7f, 0x10, 0x28, 0x44, 0x00}
// 6b k
540
,{0x00, 0x41, 0x7f, 0x40, 0x00}
// 6c l
541
,{0x7c, 0x04, 0x18, 0x04, 0x78}
// 6d m
542
,{0x7c, 0x08, 0x04, 0x04, 0x78}
// 6e n
543
,{0x38, 0x44, 0x44, 0x44, 0x38}
// 6f o
544
,{0x7c, 0x14, 0x14, 0x14, 0x08}
// 70 p
545
,{0x08, 0x14, 0x14, 0x18, 0x7c}
// 71 q
546
,{0x7c, 0x08, 0x04, 0x04, 0x08}
// 72 r
547
,{0x48, 0x54, 0x54, 0x54, 0x20}
// 73 s
548
,{0x04, 0x3f, 0x44, 0x40, 0x20}
// 74 t
549
,{0x3c, 0x40, 0x40, 0x20, 0x7c}
// 75 u
550
,{0x1c, 0x20, 0x40, 0x20, 0x1c}
// 76 v
551
,{0x3c, 0x40, 0x30, 0x40, 0x3c}
// 77 w
552
,{0x44, 0x28, 0x10, 0x28, 0x44}
// 78 x
553
,{0x0c, 0x50, 0x50, 0x50, 0x3c}
// 79 y
554
,{0x44, 0x64, 0x54, 0x4c, 0x44}
// 7a z
555
,{0x00, 0x08, 0x36, 0x41, 0x00}
// 7b {
556
,{0x00, 0x00, 0x7f, 0x00, 0x00}
// 7c |
557
,{0x00, 0x41, 0x36, 0x08, 0x00}
// 7d }
558
,{0x10, 0x08, 0x08, 0x10, 0x08}
// 7e ←
559
//,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
560
,{B11111111, B01111110, B00011000, B01111110, B11111111}
//Stereo 127
561
};
562
563
void
LcdCharacter(
char
character)
564
{
565
unsigned
char
z,z1;
566
567
z1=character - 0x20;
568
LcdWrite(LCD_D, 0x00);
569
for
(
int
index = 0; index < 5; index++)
570
{
571
//para que funciona en proteus
572
573
z=ASCII[z1][index];
574
LcdWrite(LCD_D, z);
575
// LcdWrite(LCD_D, ASCII[character - 0x20][index]);
576
}
577
LcdWrite(LCD_D, 0x00);
578
}
579
580
void
LcdCharacterX(
char
character)
581
{
582
unsigned
char
z,z1;
583
z1=character - 0x20;
584
LcdWrite(LCD_D, 0x00);
585
for
(
int
index = 0; index < 5; index++)
586
{
587
//para que funciona en proteus
588
z=ASCII[z1][index];
589
LcdWrite(LCD_D, z);
590
LcdWrite(LCD_D, z);
591
//LcdWrite(LCD_D, ASCII[character - 0x20][index]);
592
//LcdWrite(LCD_D, ASCII[character - 0x20][index]);
593
}
594
LcdWrite(LCD_D, 0x00);
595
}
596
597
void
LcdClear(
void
)
598
{
599
for
(
int
index = 0; index < LCD_X * LCD_Y / 8; index++)
600
{
601
LcdWrite(LCD_D, 0x00);
602
}
603
}
604
605
void
LcdInitialise(
void
)
606
{
607
pinMode(PIN_SCE, OUTPUT);
608
pinMode(PIN_RESET, OUTPUT);
609
pinMode(PIN_DC, OUTPUT);
610
pinMode(PIN_SDIN, OUTPUT);
611
pinMode(PIN_SCLK, OUTPUT);
612
613
digitalWrite(PIN_RESET, LOW);
614
digitalWrite(PIN_RESET, HIGH);
615
616
LcdWrite(LCD_CMD, 0x21);
// LCD Extended Commands.
617
LcdWrite(LCD_CMD, 0xB5);
// Set LCD Vop (Contrast). //B1
618
LcdWrite(LCD_CMD, 0x04);
// Set Temp coefficent. //0x04
619
LcdWrite(LCD_CMD, 0x14);
// LCD bias mode 1:48. //0x13
620
LcdWrite(LCD_CMD, 0x0C);
// LCD in normal mode. 0x0d for inverse
621
LcdWrite(LCD_C, 0x20);
622
LcdWrite(LCD_C, 0x0C);
623
}
624
625
void
LcdString(
char
*characters)
626
{
627
while
(*characters)
628
{
629
LcdCharacter(*characters++);
630
}
631
}
632
void
LcdStringX(
char
*characters)
633
{
634
while
(*characters)
635
{
636
LcdCharacterX(*characters++);
637
}
638
}
639
640
void
LcdWrite(
byte
dc,
byte
data)
641
{
642
digitalWrite(PIN_DC, dc);
643
digitalWrite(PIN_SCE, LOW);
644
shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
645
digitalWrite(PIN_SCE, HIGH);
646
}
647
648
/**
649
* gotoXY routine to position cursor
650
* x - range: 0 to 84
651
* y - range: 0 to 5
652
*/
653
void
gotoXY(
int
x,
int
y)
654
{
655
LcdWrite( 0, 0x80 | x);
// Column.
656
LcdWrite( 0, 0x40 | y);
// Row.
657
}
658
659
void
drawBox(
void
)
660
{
661
int
j;
662
for
(j = 0; j <= 84; j++)
// top
663
{
664
gotoXY(j, 0);
665
LcdWrite(1, 0x01);
666
}
667
668
for
(j = 0; j < 84; j++)
//Bottom
669
{
670
gotoXY(j, 5);
671
LcdWrite(1, 0x80);
672
}
673
674
for
(j = 0; j < 6; j++)
// Right
675
{
676
gotoXY(83, j);
677
LcdWrite(1, 0xff);
678
}
679
680
for
(j = 0; j < 6; j++)
// Left
681
{
682
gotoXY(0, j);
683
LcdWrite(1, 0xff);
684
}
685
}
686
687
void
Scroll(String message)
688
{
689
for
(
int
i = scrollPosition; i < scrollPosition + 11; i++)
690
{
691
if
((i >= message.length()) || (i < 0))
692
{
693
LcdCharacter(
' '
);
694
}
695
else
696
{
697
LcdCharacter(message.charAt(i));
698
}
699
}
700
scrollPosition++;
701
if
((scrollPosition >= message.length()) && (scrollPosition > 0))
702
{
703
scrollPosition = -10;
704
}
705
}
Сделал индикацию уровня сигнала , правда не антенка , а цифры.
как переделать код под TEA5767
Заинтересовал приемник,есть ли обновления?
заработал скетч под tea5767. вот моя версия с московскими радиостанциями.
хочется запилить туда RDS......
001
//FM Radio OLED Copyright by GhostLion v1.6 GOLD
002
003
#include <EEPROM.h>
004
#include <radio.h>
005
#include <TEA5767.h>
006
007
#include "U8glib.h"
008
#include "rus6x10.h"
009
#include "MyDigitsHelveticaBold24.h"
010
011
#define Pin_DOWN 4 // левая кнопка
012
#define Pin_UP 2 // правая кнопка
013
#define Pin_SET 3 // центральная кнопка
014
#define FIX_BAND 1
015
016
const
uint8_t Radio [] U8G_PROGMEM = {0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x40, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0xC0, 0x01, 0x80,0x00, 0x00, 0xC0, 0x01, 0x8E, 0x88, 0x00, 0xC0, 0x01, 0x88, 0xD8, 0x00,
017
0xC0, 0x01, 0x88, 0xA8,0x00, 0xC0, 0x01, 0x8C, 0xA8, 0x00, 0xC0, 0x01, 0x88, 0xA8, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x00,0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x81, 0x04, 0x10, 0x41, 0x05, 0x81, 0x04, 0x10,
018
0x41,0x05, 0x95, 0x55, 0x55, 0x55, 0x55, 0x95, 0x55, 0x55, 0x55, 0x55, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80,0x00, 0x00,
019
0xF8, 0x01, 0x80, 0x00, 0x03, 0xFE, 0x01, 0x80, 0x00, 0x07, 0x03, 0x01, 0x80, 0x00,0x0C, 0x01, 0x81, 0x80, 0x60, 0x18, 0x00, 0xC1, 0x81, 0xF8, 0x18, 0x00, 0x41, 0x83, 0x9C, 0x10,0x00, 0x61, 0x83, 0x0C, 0x30,
020
0x00, 0x61, 0x83, 0x0C, 0x30, 0x00, 0x61, 0x83, 0x0C, 0x30, 0x00,0x61, 0x83, 0x9C, 0x10, 0x00, 0x61, 0x81, 0xF8, 0x18, 0x00, 0x41, 0x80, 0x60, 0x18, 0x00, 0xC1,0x80, 0x00, 0x0C, 0x01, 0x81, 0x80, 0x00, 0x07,
021
0x03, 0x01, 0x80, 0x00, 0x03, 0xFE, 0x01, 0x80,0x00, 0x00, 0xF8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00,0x00, 0x00, 0x02, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC};
022
023
const
uint8_t Volume[] U8G_PROGMEM = {0x7E, 0x42, 0x81, 0x81, 0x81, 0x81, 0xE7, 0xE7, 0x66, 0x66};
024
const
uint8_t Bass[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0x8D, 0xA2, 0x51, 0xA3, 0x91, 0x9A, 0x4D, 0x8A, 0x45, 0xB3, 0x99,0x80, 0x01, 0x7F, 0xFE};
025
const
uint8_t FM[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x98, 0xA9, 0x90, 0xA9, 0x90, 0x89,0x80, 0x01, 0x7F, 0xFE};
026
const
uint8_t Stereo[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x9B, 0xB9, 0xA1, 0x25, 0xA1, 0x39, 0x99, 0x31, 0x89, 0x29, 0xB1, 0x25,0x80, 0x01, 0x7F, 0xFE};
027
const
uint8_t SM[] U8G_PROGMEM = {0x7F, 0xFE, 0x80, 0x01, 0x8C, 0x51, 0x90, 0xA9, 0x90, 0xA9, 0x8C, 0xA9, 0x84, 0xA9, 0x98, 0x89,0x80, 0x01, 0x7F, 0xFE};
028
029
const
uint8_t Bat1[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,0x80, 0x02, 0x7F, 0xFC};
030
const
uint8_t Bat2[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01, 0xA0, 0x01,0x80, 0x02, 0x7F, 0xFC};
031
const
uint8_t Bat3[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01, 0xA8, 0x01,0x80, 0x02, 0x7F, 0xFC};
032
const
uint8_t Bat4[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01, 0xAA, 0x01,0x80, 0x02, 0x7F, 0xFC};
033
const
uint8_t Bat5[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81, 0xAA, 0x81,0x80, 0x02, 0x7F, 0xFC};
034
const
uint8_t Bat6[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1, 0xAA, 0xA1,0x80, 0x02, 0x7F, 0xFC};
035
const
uint8_t Bat7[] U8G_PROGMEM = {0x7F, 0xFC, 0x80, 0x02, 0xAA, 0xA9, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xAD, 0xAA, 0xA9,0x80, 0x02, 0x7F, 0xFC};
036
037
const
uint8_t Vol1[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x60, 0x00, 0x60, 0x00};
038
const
uint8_t Vol2[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00,0x6C, 0x00, 0x6C, 0x00};
039
const
uint8_t Vol3[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x0D, 0x80, 0x0D, 0x80,0x6D, 0x80, 0x6D, 0x80};
040
const
uint8_t Vol4[] U8G_PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x01, 0xB0, 0x01, 0xB0, 0x0D, 0xB0, 0x0D, 0xB0,0x6D, 0xB0, 0x6D, 0xB0};
041
const
uint8_t Vol5[] U8G_PROGMEM = {0x00, 0x06, 0x00, 0x06, 0x00, 0x36, 0x00, 0x36, 0x01, 0xB6, 0x01, 0xB6, 0x0D, 0xB6, 0x0D, 0xB6,0x6D, 0xB6, 0x6D, 0xB6};
042
043
byte
v,k,m,rs, flag1=1,flag2=0,flag3=0;
044
int
Voltage;
045
unsigned
int
s,s2;
046
boolean b,ms,sm,flag=1,MODE=1;
047
long
TimeOut;
048
049
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);
050
TEA5767 radio;
051
052
void
setup
()
053
{
054
pinMode(Pin_DOWN,INPUT_PULLUP);
055
pinMode(Pin_UP,INPUT_PULLUP);
056
pinMode(Pin_SET,INPUT_PULLUP);
057
058
Inicial();
059
}
060
061
void
loop
()
062
{
063
Parsing();
064
Menu();
065
Energy();
066
}
067
//==============================================
068
void
Inicial()
069
{
070
u8g.firstPage();
071
do
{
072
u8g.drawBitmapP (5, 16, 5, 40, Radio);
073
u8g.setFont(rus6x10);
074
u8g.setPrintPos(40,11);u8g.print(F(
"FM РАДИО"
));
075
u8g.setPrintPos(55,45);u8g.print(F(
"v 1.6 GOLD"
));
076
u8g.setPrintPos(55,55);u8g.print(F(
"By GhostLion"
));
077
}
078
while
( u8g.nextPage() );
079
080
delay(1500);
081
if
(EEPROM[0]!=1)
082
{
083
EEPROM[0]=1;
084
EEPROM[1]=5;
085
EEPROM[2]=30;
// здесь установить номер текущего канала (моя частота 98.90 "Русское радио") (или 0)
086
EEPROM[3]=1;
087
EEPROM[4]=1;
088
EEPROM[5]=0;
089
EEPROM[6]=107;
// частота текущей радиостанции
090
EEPROM[7]=40;
// "Хит FM"
091
EEPROM[8]=1;
092
}
093
v = EEPROM[1];
// громкость
094
k = EEPROM[2];
// текущий канал
095
m = EEPROM[3];
// текущее меню
096
b = EEPROM[4];
// супербасс
097
ms = EEPROM[5];
// моно/стерео
098
s = EEPROM[6]*100+EEPROM[7];
// текущая частота
099
sm = EEPROM[8];
// softmute
100
s2=s;
101
radio.init();
102
radio.setVolume(v);
103
radio.setMono(ms);
104
radio.setMute(
false
);
105
radio.setBassBoost(b);
106
radio.setSoftMute(sm);
107
radio.setBandFrequency(FIX_BAND, s);
108
readVcc();
109
}
110
//================================================
111
void
Parsing()
112
{
113
boolean SET=digitalRead(Pin_SET);
114
boolean UP=digitalRead(Pin_UP);
115
boolean DOWN=digitalRead(Pin_DOWN);
116
117
if
(SET==HIGH && flag1==0)
118
{
119
flag1=1;
120
}
121
if
(SET==LOW && flag1==1)
122
{
123
flag1=0;
124
TimeOut=millis();
125
if
(MODE==1) {m++; flag=1;
if
(m>7) m=1;}
126
}
127
128
if
(UP==LOW && flag2==1)
129
{
130
flag2=0;
131
}
132
if
(UP==HIGH && flag2==0)
133
{
134
if
(MODE==1)
135
{
136
switch
(m)
137
{
138
case
1:{ (v==15?0:v++); radio.setVolume(v);
break
; }
139
case
2:{ b = 1; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s);
break
; }
140
case
3:{ ms = 0; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s);
break
; }
141
case
4:{sm = 1; radio.setSoftMute(
true
);radio.setBandFrequency(FIX_BAND,s);
break
;}
142
case
5:{ radio.seekUp(
true
); delay(3000); s = radio.getFrequency(); Kanal();
break
; }
143
case
6:{ s=s+10;
if
(s > 10800) s = 8700; delay(100); radio.setBandFrequency(FIX_BAND,s);Kanal();
break
; }
144
case
7:{ k++;
if
(k>31) k=1; Frequency(); radio.setBandFrequency(FIX_BAND,s);
break
;}
145
}
146
flag=1;
147
TimeOut=millis();
148
}
149
else
{(v==15?0:v++);radio.setVolume(v);}
150
flag2=1;
151
}
152
if
(DOWN==LOW && flag3==1)
153
{
154
flag3=0;
155
}
156
if
(DOWN==HIGH && flag3==0)
157
{
158
if
(MODE==1)
159
{
160
switch
(m)
161
{
162
case
1:{ (v==0?15:v--); radio.setVolume(v);
break
; }
163
case
2:{ b = 0; radio.setBassBoost(b); radio.setBandFrequency(FIX_BAND,s);
break
; }
164
case
3:{ ms = 1; radio.setMono(ms); radio.setBandFrequency(FIX_BAND,s);
break
; }
165
case
4:{sm = 0; radio.setSoftMute(
false
);radio.setBandFrequency(FIX_BAND,s);
break
;}
166
case
5:{ radio.seekDown(
true
); delay(3000); s=radio.getFrequency(); Kanal();
break
; }
167
case
6:{ s=s-10;
if
(s<8700) s=10800; delay(100); radio.setBandFrequency(FIX_BAND,s); Kanal();
break
; }
168
case
7:{ k--;
if
(k<1) k=23; Frequency(); radio.setBandFrequency(FIX_BAND,s);
break
;}
169
}
170
flag=1;
171
TimeOut=millis();
172
}
173
else
{(v==0?15:v--);radio.setVolume(v);}
174
flag3=1;
175
}
176
}
177
//================================================
178
void
Menu()
179
{
180
float
ch;
181
if
(flag==1 && MODE==1)
182
{
183
//rs = radio.getRSSI();
184
ch=
float
(s)/100;
185
u8g.firstPage();
186
do
{
187
u8g.setDefaultForegroundColor();
188
if
(Voltage>85) u8g.drawBitmapP (110, 0, 2, 10, Bat7);
189
else
if
(Voltage>70) u8g.drawBitmapP (110, 0, 2, 10, Bat6);
190
else
if
(Voltage>55) u8g.drawBitmapP (110, 0, 2, 10, Bat5);
191
else
if
(Voltage>40) u8g.drawBitmapP (110, 0, 2, 10, Bat4);
192
else
if
(Voltage>25) u8g.drawBitmapP (110, 0, 2, 10, Bat3);
193
else
if
(Voltage>10) u8g.drawBitmapP (110, 0, 2, 10, Bat2);
194
else
u8g.drawBitmapP (110, 0, 2, 10, Bat1);
195
u8g.drawBitmapP (0, 0, 1, 10, Volume);
196
if
(v<3) u8g.drawBitmapP (13, 0, 2, 10, Vol1);
197
else
if
(v<7) u8g.drawBitmapP (13, 0, 2, 10, Vol2);
198
else
if
(v<10) u8g.drawBitmapP (13, 0, 2, 10, Vol3);
199
else
if
(v<13) u8g.drawBitmapP (13, 0, 2, 10, Vol4);
200
else
u8g.drawBitmapP (13, 0, 2, 10, Vol5);
201
if
(ms==0) u8g.drawBitmapP (55, 0, 2, 10, Stereo);
202
if
(b==1) u8g.drawBitmapP (75, 0, 2, 10, Bass);
203
if
(sm==1) u8g.drawBitmapP (35, 0, 2, 10, SM);
204
205
u8g.setFont(MyDigitsHelveticaBold24);
206
if
(ch<100) u8g.setPrintPos(30,43);
else
u8g.setPrintPos(23,43);
207
u8g.print(ch,1);
208
u8g.setFont(rus6x10);
209
u8g.print(
" MHz"
);
210
if
(rs>43) u8g.drawBitmapP (0, 16, 2, 10, FM);
211
if
(k!=0){
212
u8g.drawRFrame (0,32,18,13,2);
213
u8g.setPrintPos(3,42);
214
if
(k<10) u8g.print(
"0"
);
215
u8g.print(k);
216
}
217
u8g.drawRFrame (0,51,127,12,3);
218
u8g.setPrintPos(13,61);
219
switch
(m)
220
{
221
case
1: {u8g.print(F(
"- < ГРОМКОСТЬ > +"
));
break
;}
222
case
2: {u8g.print(F(
" НЕТ < БАСС > ДА"
));
break
;}
223
case
3: {u8g.print(F(
"НЕТ < СТЕРЕО > ДА"
));
break
;}
224
case
4: {u8g.print(F(
"НЕТ < S.MUTE > ДА"
));
break
;}
225
case
5: {u8g.print(F(
" < АВТОПОИСК >"
));
break
;}
226
case
6: {u8g.print(F(
"< РУЧ. ПОИСК >"
));
break
;}
227
case
7: {u8g.print(F(
" < КАНАЛЫ >"
));
break
;}
228
229
}
230
231
232
}
233
while
( u8g.nextPage() );
234
flag=0;
235
}
236
}
237
//================================================
238
void
Energy()
239
{
240
if
(MODE==1 && millis()-TimeOut>2000) flag=1;
241
if
(MODE==1 && millis()-TimeOut>8000)
242
{
243
u8g.sleepOn();
244
MODE=0;
245
if
(v!= EEPROM[1]) EEPROM[1] = v;
246
if
(k!= EEPROM[2]) EEPROM[2] = k;
247
if
(m!= EEPROM[3]) EEPROM[3] = m;
248
if
(b!= EEPROM[4]) EEPROM[4] = b;
249
if
(ms!=EEPROM[5]) EEPROM[5] = ms;
250
if
(s2!=s){s2=s; EEPROM[6] =
int
(s/100);
251
EEPROM[7] = s%100;
252
}
253
if
(sm!=EEPROM[8]) EEPROM[8] = sm;
254
}
255
if
(MODE==0 && millis()-TimeOut<500)
256
{
257
u8g.sleepOff();
258
readVcc();
259
MODE = 1;
260
flag = 1;
261
m = 7;
262
}
263
}
264
//===================================================
265
void
readVcc()
266
{
267
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
268
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
269
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
270
ADMUX = _BV(MUX5) | _BV(MUX0);
271
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
272
ADMUX = _BV(MUX3) | _BV(MUX2);
273
#else
274
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
275
#endif
276
delay(2);
// Wait for Vref to settle
277
ADCSRA |= _BV(ADSC);
// Start conversion
278
while
(bit_is_set(ADCSRA, ADSC));
// measuring
279
uint8_t low = ADCL;
// must read ADCL first - it then locks ADCH
280
uint8_t high = ADCH;
// unlocks both
281
long
result = (high << 8) | low;
282
283
result = 1.080 * 1023 * 1000 / result;
// расчёт реального VCC
284
Voltage =
int
(result);
285
Voltage = map(Voltage, 3200, 4200, 0, 100);
286
Voltage = constrain(Voltage, 0, 100);
287
}
288
//=======================================================
289
void
Kanal()
290
{
291
switch
(s)
292
{
293
case
8750 : k=1;
break
;
294
case
8790 : k=2;
break
;
295
case
8830 : k=3;
break
;
296
case
8870 : k=4;
break
;
297
case
8910 : k=5;
break
;
298
case
8950 : k=6;
break
;
299
case
9030 : k=7;
break
;
300
case
9080 : k=8;
break
;
301
case
9120 : k=9;
break
;
302
case
9240 : k=10;
break
;
303
case
9560 : k=11;
break
;
304
case
9600 : k=12;
break
;
305
case
9640 : k=13;
break
;
306
case
9760 : k=14;
break
;
307
case
9880 : k=15;
break
;
308
case
10010: k=16;
break
;
309
case
10050: k=17;
break
;
310
case
10120: k=18;
break
;
311
case
10170: k=19;
break
;
312
case
10210: k=20;
break
;
313
case
10250: k=21;
break
;
314
case
10370: k=22;
break
;
315
case
10420: k=23;
break
;
316
case
10470: k=24;
break
;
317
case
10520: k=25;
break
;
318
case
10570: k=26;
break
;
319
case
10620: k=27;
break
;
320
case
10660: k=28;
break
;
321
case
10700: k=29;
break
;
322
case
10740: k=30;
break
;
323
case
10780: k=31;
break
;
324
default
: k=0;
325
326
}
327
}
328
//==========================================================
329
void
Frequency()
330
{
331
switch
(k)
332
{
333
case
1 :{s=8750;
break
;}
334
case
2 :{s=8790;
break
;}
335
case
3 :{s=8830;
break
;}
336
case
4 :{s=8870;
break
;}
337
case
5 :{s=8910;
break
;}
338
case
6 :{s=8950;
break
;}
339
case
7 :{s=9030;
break
;}
340
case
8 :{s=9080;
break
;}
341
case
9 :{s=9120;
break
;}
342
case
10 :{s=9240;
break
;}
343
case
11 :{s=9560;
break
;}
344
case
12 :{s=9600;
break
;}
345
case
13 :{s=9640;
break
;}
346
case
14 :{s=9760;
break
;}
347
case
15 :{s=9880;
break
;}
348
case
16 :{s=10010;
break
;}
349
case
17 :{s=10050;
break
;}
350
case
18 :{s=10120;
break
;}
351
case
19 :{s=10170;
break
;}
352
case
20 :{s=10210;
break
;}
353
case
21 :{s=10250;
break
;}
354
case
22 :{s=10370;
break
;}
355
case
23 :{s=10420;
break
;}
356
case
24 :{s=10470;
break
;}
357
case
25 :{s=10520;
break
;}
358
case
26 :{s=10570;
break
;}
359
case
27 :{s=10620;
break
;}
360
case
28 :{s=10660;
break
;}
361
case
29 :{s=10700;
break
;}
362
case
30 :{s=10740;
break
;}
363
case
31 :{s=10780;
break
;}
364
}
365
}
заработал скетч под tea5767.
хочется запилить туда RDS.....
Забуть, у 5767 нет RDS, тока у 5807 есть
заработал скетч под tea5767. вот моя версия с московскими радиостанциями.
хочется запилить туда RDS......
01
//FM Radio OLED Copyright by GhostLion v1.6 GOLD
02
//=======================================================
03
void
Kanal()
04
{
05
switch
(s)
06
{
07
case
8750 : k=1;
break
;
08
case
8790 : k=2;
break
;
09
case
8830 : k=3;
break
;
10
case
8870 : k=4;
break
;
11
case
8910 : k=5;
break
;
12
case
8950 : k=6;
break
;
13
case
9030 : k=7;
break
;
14
case
9080 : k=8;
break
;
15
case
9120 : k=9;
break
;
16
case
9240 : k=10;
break
;
17
case
9560 : k=11;
break
;
18
case
9600 : k=12;
break
;
19
case
9640 : k=13;
break
;
20
case
9760 : k=14;
break
;
21
case
9880 : k=15;
break
;
22
case
10010: k=16;
break
;
23
case
10050: k=17;
break
;
24
case
10120: k=18;
break
;
25
case
10170: k=19;
break
;
26
case
10210: k=20;
break
;
27
case
10250: k=21;
break
;
28
case
10370: k=22;
break
;
29
case
10420: k=23;
break
;
30
case
10470: k=24;
break
;
31
case
10520: k=25;
break
;
32
case
10570: k=26;
break
;
33
case
10620: k=27;
break
;
34
case
10660: k=28;
break
;
35
case
10700: k=29;
break
;
36
case
10740: k=30;
break
;
37
case
10780: k=31;
break
;
38
default
: k=0;
39
40
}
41
}
42
//==========================================================
43
void
Frequency()
44
{
45
switch
(k)
46
{
47
case
1 :{s=8750;
break
;}
48
case
2 :{s=8790;
break
;}
49
case
3 :{s=8830;
break
;}
50
case
4 :{s=8870;
break
;}
51
case
5 :{s=8910;
break
;}
52
case
6 :{s=8950;
break
;}
53
case
7 :{s=9030;
break
;}
54
case
8 :{s=9080;
break
;}
55
case
9 :{s=9120;
break
;}
56
case
10 :{s=9240;
break
;}
57
case
11 :{s=9560;
break
;}
58
case
12 :{s=9600;
break
;}
59
case
13 :{s=9640;
break
;}
60
case
14 :{s=9760;
break
;}
61
case
15 :{s=9880;
break
;}
62
case
16 :{s=10010;
break
;}
63
case
17 :{s=10050;
break
;}
64
case
18 :{s=10120;
break
;}
65
case
19 :{s=10170;
break
;}
66
case
20 :{s=10210;
break
;}
67
case
21 :{s=10250;
break
;}
68
case
22 :{s=10370;
break
;}
69
case
23 :{s=10420;
break
;}
70
case
24 :{s=10470;
break
;}
71
case
25 :{s=10520;
break
;}
72
case
26 :{s=10570;
break
;}
73
case
27 :{s=10620;
break
;}
74
case
28 :{s=10660;
break
;}
75
case
29 :{s=10700;
break
;}
76
case
30 :{s=10740;
break
;}
77
case
31 :{s=10780;
break
;}
78
}
79
}
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
если код по строкам продавать, как индусы, то так дороже выходит. :)
ребята, вы о массивах вовсе ничего не слыхали? уберите эти кейсы из кода, не позорьтесь
не нравится код? а покажи свой " правильный"
тогда и посмотрим чей код лучше....авторский код работает...а вот Ваш....под вопросом пока
просто аффтар - махровый непрофессионал или индус.