Internetové rádio s tlačítky přepínáním stanic a LCD displejem

ARDUINO UNO, ETHERNET SHIELD W5100, AUDIO SHIELD VS 1053 B, 2 TLAČÍTKA SE SPÍNACÍM KONTAKTEM, I2C LCD displej
V minulém projektu jsme přidali našemu rádio tlačítka, pomocí kterých si přepínáme předdefinované stanice směrem přechozí a následující. Když se snažíme maximálně využít kapacitu Arduina Uno, stanic můžeme mít uloženo cca. 18 a tím se může stát, že nevíme, jakou stanici aktuálně posloucháme. Zde nám pomůže jakýkoliv LCD displej s dvoudrátovou komunikací I2C.
- Je předvoleno 18 stanic Internetových rádií
- Přepínání stanic pomocí 2 tlačítek vpřed a zpět
- Lze si předvolit stanici, která začne hrát po zapnutí Arduina
- Předvolba a název aktuálně přehrávané stanice se zobrazuje na LCD

Zapojení tlačítek ponecháme stejně jako v předchozím projektu, napájení LCD displeje připojíme na piny GND a 5V zvukové karty VS 1053B. Komunikace I2C je z Arduina Uno průchozí až na zvukovku, zde je na pinech 4 ( SDA ) a 5 ( SCL ).

/* Internetové rádio AURUINO UNO ( nebo kompatibilní ), VS 1053B Shield ( nebo kompatibilní ) * Ethernet Shield W5100 R3, LCD displej I2C, 2 tlačítka se spínacím kontaktem * * Autor : David Kohout 12 / 2019 * */ // Standartní knihovny #include<VS1053.h> // Standartní knihovna VS1053 ( Funguje i pod naším Shieldem, originál knihovnu SFEMP3Shield nepožívat, #include <Ethernet.h><Bounce2.h> // Standartní knihovna Ethernet - Shield W5100 #include <LiquidCrystal_I2C.h> // Vyhodnocení stavu tlačítek - autor Thomas Ouellet Fredericks #include // Knihovna LCD displeje #define B_PREV 3 // Tlačítko předchozí stanice připojeno mezi GND a pin 5 Arduino UNO #define B_NEXT 5 // Tlačítko další stanice připojeno mezi GND a pin 3 Arduino UNO #define BUTTON_DEBOUNCE_PERIOD 20 // Perioda snímání stavu tlačítek v milisekundách Bounce b_Next = Bounce(); // Makro tlačítko NEXT ( další stanice ) Bounce b_Prev = Bounce(); // Makro tlačítko PREV ( předchozí stanice ) // SPI porty ARDUINA MEGA // 50 - MISO Při použití ARDUINO MEGA proklemovat 50 Arduino na 12 pin zvukovky // 51 - MOSI Při použití ARDUINO MEGA proklemovat 51 Arduino na 11 pin zvukovky // 52 - SCK Při použití ARDUINO MEGA proklemovat 52 Arduino na 13 pin zvukovky // --------- Nemusí se ohýbat nožičky ze Shieldu, prostě natvrdo dát klemu ----------- VS1053 MP3player(6,7,2,8); // X_CS 6 pin, X_DCS 7 pin, DREQ 2 pin, X_RESET 8 pin byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Přiřazení MAC adresy síťovce - možno změnit EthernetClient client; // Ethernet jako klient LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD na adrese 0x27, 16 znaků, 2 řádky //--------------------------------------------------------------------------------------------------------// //--------------------------------------------------------------------------------------------------------// uint8_t mp3buff[32]; // Velikost bufferu 32 Byte const char *host; // Zde se uloží adresa serveru s požadovaným streamem const char *path; // Zde se uloží cesta serveru s požadovaným streamem int httpPort; // Zde se uloží port serveru s požadovaným streamem int ID_stanice=7; // Zde se uloží číslo aktuálně přehrávané stanice - konstanta číslo stanice, které začne hrát po spuštění Arduina int pamet_ID_stanice; // Zde se uloží číslo posledně přehrávané stanice const char *nazev; // Zde se uloží jméno aktuálně přehrávané stanice void setup() { pinMode(B_PREV,INPUT_PULLUP); // Definování tlačítka předchozí stanice pinMode(B_NEXT,INPUT_PULLUP); // Definování tlačítka následující stanice b_Next.attach(B_NEXT); // Aktivace makra pro tlačítko další stanice b_Next.interval(BUTTON_DEBOUNCE_PERIOD); // Perioda snímání stavu tlačítka - 20 ms. b_Prev.attach(B_PREV); // Aktivace makra pro tlačítko předchozí stanice b_Prev.interval(BUTTON_DEBOUNCE_PERIOD); // Perioda snímání stavu tlačítka - 20 ms. Ethernet.begin(mac); // Start Ethernetového spojení, IP adresu přiřadí router MP3player.begin(); // Start zvukové karty VS1053B Shield MP3player.setVolume(10); // Nižší číslo vyšší hlasitost lcd.init(); // Inicializace LCD displeje lcd.backlight(); // Podsvícení LCD displeje client.print(String("GET ") + path + " HTTP/1.1\r\n" + // Adresa serveru se streamem - požadavek při spuštění Arduina "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); } void loop() { // Hlavní program - smyčka if (b_Next.update()) { if (b_Next.read() == LOW && ID_stanice <18) { // Detekována sestupná hrana tlačítka NEXT a není-li rádio aktuálně na poslední stanici, tak : ID_stanice=ID_stanice +1; // Připočti číslo 1 k číslu aktuálně přehrávané stanice } } if (b_Prev.update()) { if (b_Prev.read() == LOW&& ID_stanice >1) { // Detekována sestupná hrana tlačítka PREV a není-li rádio aktuálně na první stanici, tak : ID_stanice=ID_stanice -1; // Odečti číslo 1 od čísla aktuálně přehrávané stanice } } switch(ID_stanice){ // Přepínání stanic - ID stanice case 1: nazev = " Hitradio 80 CZ"; host = "ice.abradio.cz"; // Hitrádio 80 path = "/hit80128.mp3"; httpPort = 80; break; case 2: nazev = " Hitradio 90 CZ"; host= "ice.abradio.cz"; // Hitrádio 90 path = "/hit90128.mp3"; httpPort = 80; break; case 3: nazev = " Star*Sat Radio"; host = "starsat-ais-edge-3005.fra-eco.cdn.addradio.net"; // DE STAR*SAT RADIO path = "/starsat/live/mp3/low/stream.mp3"; httpPort = 80;; break; case 4: nazev = "Antene Bayern 80"; host = "mp3channels.webradio.antenne.de"; // DE Antenne Bayern - 80er Hits path = "/80er-kulthits"; httpPort = 80;; break; case 5: nazev = "Antene Bayern 90"; host = "mp3channels.webradio.antenne.de"; // DE Antenne Bayern - 90er Hits path = "/90er-hits"; httpPort = 80; break; case 6: nazev = " Hitradio Orion"; // CZ Hitrádio Orion Morava host = "ice.abradio.cz"; path = "/orionmorava128.mp3"; httpPort = 8000; break; case 7: nazev = "HOT MIX Radio 90´s"; // FR HOT MUX Radio 90s host = "streaming.hotmixradio.fr"; path = "/hotmixradio-90-128.mp3"; httpPort = 80; break; case 8: nazev = " N-Joy Bulgaria"; // BG N-Joy Radio host = "strm112.1.fm"; path = "/atr_mobile_mp3"; httpPort =80; break; case 9: nazev = "Evropa 2 Top 40"; // CZ Evropa 2 Top 40 host = "ice.actve.net"; path = "/web-e2-top40"; httpPort =80; break; case 10: nazev = " KISS 98 FM"; // CZ Kiss 98 FM host = "icecast4.play.cz"; path = "/kiss128.mp3"; httpPort =80; break; case 11: nazev = "Zlin Best Ballads"; // CZ Rádio Zlín Best Ballads host = "212.111.2.151"; path = "/radiozlin_128.mp3"; httpPort =8000; break; case 12: nazev = "Monte Carlo 98.2"; // Monako RMC 98.2 host = "radiomonaco.ice.infomaniak.ch"; path = "/radiomonaco-128.mp3"; httpPort =80; break; case 13: nazev = " Cherie Ballads"; // FR Chérie Ballads host = "185.52.127.131"; path = "/fr/30297/mp3_128.mp3"; httpPort =80; break; case 14: nazev = " Cherie FM"; // FR Chérie FM host = "185.52.127.163"; path = "/fr/30201/mp3_128.mp3"; httpPort =80; break; case 15: nazev = " Cherie 80s"; // FR Chérie 80s host = "185.52.127.159"; path = "/fr/30237/mp3_128.mp3?"; httpPort =80; break; case 16: nazev = " Athens Party GR"; // GR Athens Party host = "ice.onestreaming.com"; path = "/athensparty"; httpPort =80; break; case 17: nazev = " Radio Rubi"; host = "icecast8.play.cz"; // Radio Rubi path = "/radiorubi128.mp3"; httpPort =80; break; case 18: nazev = " SKY Radio SK"; // SK SKY Rádio host = "stream.skyradio.sk"; path = "/sky128"; httpPort =8000; break; } if(!client.connected() || pamet_ID_stanice!=ID_stanice){ if(client.connect(host, httpPort)){ // Adresa serveru se streamem - ve smyčce client.print(String("GET ") + path + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); pamet_ID_stanice=ID_stanice; lcd.clear(); lcd.setCursor(2,0); lcd.print("Predvolba"); lcd.setCursor(13,0); lcd.print(ID_stanice); lcd.setCursor(0,1); lcd.print(nazev); } } if(client.available() > 0){ // Pokud je server dostupný, tak : uint8_t bytesread = client.read(mp3buff,32); // ulož přijatá data do bufferu MP3player.playChunk(mp3buff,bytesread); // a přehraj na VS1053B Shield } } // To je vše, příjemnou zábavu ! David Kohout 12 / 2019
#include <LiquidCrystal_I2C.h> // Knihovna LCD displeje
Knihovna LiquidCrystal_I2C je určena pro LCD displej.
LiquidCrystal_I2C lcd(0x27, 16, 2); // LCD na adrese 0x27, 16 znaků, 2 řádky
LCD displej bude mít jméno lcd, na síti I2C bude mít adresu 0x27, obsahuje 16 znaků na řádek, 2 řádky. Při použití jiného displeje – např. 40 znaků, 4 řádky, musíme tyto parametry zde změnit.
nazev = “ KISS 98 FM“; // CZ Kiss 98 FM
Do proměnné nazev uložíme jméno stanice, kterou aktuálně posloucháme. Jelikož se jedná o statický text na LCD ( zatím neposouváme znaky zprava do leva ), dbáme na počet znaků ( pro tenhle LCD max. 16 ) a snažíme se text zarovnat na střed ( mezery za prvním znakem “ ).
lcd.clear();
lcd.setCursor(2,0);
lcd.print(„Predvolba“);
lcd.setCursor(13,0);
lcd.print(ID_stanice);
lcd.setCursor(0,1);
lcd.print(nazev);
Zde řešíme již samotné zobrazení textu na LCD, ukazatel (2,0) ukazuje na druhý znak v řádku – POZOR, pracuje s 0 znakem – ve skutečnosti 1, takže ukazatel 2 je ve skutečnosti třetí znak v řádku, 0 za ním ukazuje na číslo řadku 0 = 1 řádek, 1 = 2 řádek 🙂
Tak z Arduina UNO už toho moc nedostaneme, v dalším projektu je poslední úprava, tlačítka Stanice vpřed a Stanice zpět nahradíme IR dálkovým ovládáním, kde mimo jiné bude možnost zesílení / zeslabení hlasitosti.
Zkouška funkčnosti
6 Odpovědi
Po zapnutí napájení mi svítí na horním řádku displeje obdelníky, musím resetovat tlačítkem na arduniu, pak již vše funguje jak má. Bylo by možné přidat ještě dvě tlačítka pro volume?
Dobrý den, při zapnutí rádia se inicializuje LCD displej ( navazuje komunikaci s Arduinem ).
Pokud je vše v pořádku, měl by se LCD spojit s Arduinem za cca. 10 vteřin po zapnutí napájení.
Jestli se to nestane a je nutný reset Arduina, problém bude zřejmě v napájecím obvodu Arduina.
Napájení +5V z Arduina napájí Ethernet shiel, zvukovku VS 1053B a LCD displej. Je docela možné,
že při zapnutí poklesne napětí proudovým nárazem a LCD displej „zamrzne“ a již se nepřihlásí. Zkontrolujte –
je-li to možné osciloskopem průběh napětí 5V při zapnutí. Jak napájíte Arduino ? Jestli ho napájíte
USB portem z PC, teoreticky by problém mohl být tu – port „dává“ proud max. 500 mA. Zkuste napájet
Arduino z powerbanky, popřípadě použijte napájení Jack na Arduinu a nebo ještě zkuste ubrat kontrast
na LCD. Pokud ani to nepomůže, tak LCD napájet mimo Arduino, ale tu je nutno dbát na potenciál.
Snad ještě zkusit dát na piny napájení +5V a GND elektrolytický kondenzátor aspoň 470 uF, možná to
pomůže. Máte-li ještě jedno Ardino UNO, zkuste to na něm.
Hlasitost – přidat další tlačítka u verze UNO není možné – není již kam připojit 🙁
Použít Arduino MEGA…
Děkuji Vám za příspěvek, David Kohout
Dobrý den, děkuji za Vaši reakci na můj problém, napájím to ze zdroje 9V/1A což by snad mělo stačit, (změřený odběr cca 270mA).
Pokud dám nahrát program do ardunia, vše proběhne normálně a cca za 15 vteřin se normálně spustí přehrávání, dokud nevypnu napájení. Jinak problém přetrvává, cca minutu svítí horní řádek a pak to celé zatuhne. Blokování napájení, výměnu všech desek včetně displeje a I2C převodníku, napájení displeje z externího stabilizátoru, napájení z powerbanky vše jsem vyzkoušel.
Po připojení kondenzátoru 4u7 mezi GND a reset (spomalení náběhu resetu?) již vše funguje jak má. S připojeným kondenzátorem bohužel zase nejde z PC nahrát program do Ardunia musí se odpojit. Asi by se toto dalo řešit jedním řádkem v software napsaném na správném místě.
Díky s pozdravem Petr
Dobrý den, možná jsem našel příčinu problému s Vaším rádiem. HW a SW jsem vyloučil,
na 7 deskách Arduino UNO Precise R3 a 3 deskách Arduino UNO R3 CH340 rádio hrálo
hned na první pokus, po výměnách Ethernet Shield a VS 1053B za jiné se též problém neprojevil. Tak jsem se zaměřil na Ethernetové spojení – a ejhle ! Před rádio jsem vkládal
různé routery – switche co jsem našel doma. Vše fungovalo v pohodě, dokud jsem nepřipojil
router cca 12 roků starý od nejmenovaného poskytovatele Internetu, který sice pro PC
jede jakž – takž v pohodě, ale pro Arduino rádio – problém. Arduino se chová tak jak
popisujete – když je pod napětím a nahrajete projekt, po nahrání se restartuje a hraje do té doby, dokud ho nevypnete a nezapnete. Jakmile se zapne, na horním řádku LCD svítí
čtverečky a nic – dokud se nestiskne Reset na Arduinu. Router podle mě nestačí přiřadit
IP adresu Vašemu rádiu a to „zamrzne“. Takže problém je na straně routeru, nicméně
můžete zkusit toto : v kódu projektu vložte tyto pastičky delay(3000); ( počkej 3000 ms )
delay(3000); // Cekej 3 vteriny do inicializace síťovky
Ethernet.begin(mac); // Start Ethernetového spojení, IP adresu přiřadí router
delay(3000); // Po spuštění síťovky počkej 3 vteřiny
MP3player.begin(); // Start zvukové karty VS1053B Shield
delay(3000); // Po spuštění zvukovky počkej 3 vteřiny
MP3player.setVolume(10); // Nižší číslo vyšší hlasitost
lcd.init(); // Inicializace LCD displeje
lcd.backlight(); // Podsvícení LCD displeje
Po tomhle zásahu má router dostatek času přiřadit rádio do Vaší sítě. Mě to tedy s tím
„špatným“ routerem pomohlo a rádio hraje tak, jak má. Možná dejte větší čas jak 3 s…
Nyní můžete testovat – jednotlivé pastičky snižovat nebo úplně vyhodit z programu a
zkoušet, jak se rádio bude chovat po vypnutí a zapnutí.
Doufám, že Vám to bude fungovat a problém je s Vaším routerem.
Dejte vědět, jak jste dopadl. Hodně zdaru, David Kohout
Došel mi od pána viz příspěvky výše ohledně nefunkčnosti rádia tento mail…
…. náhodně jsem ještě našel, že klony ethernetu co mám jsou osazeny jinou hodnotou odporů viz tady:
https://www.laskarduino.cz/arduino-ethernet-shield-w5100-2/ – možná je chyba tady ?
….
Osazeno chybnou hodnotou rezistorů v obvodu ethernetu. Díky této chybě může modul vykazovat nestabilitu eth. spojení.
…
Takže pozor při nákupu, pokud je běžná cena na CZ shopech cca. 400 Kč a jiný CZ
obchod ho má za 100 Kč tak očekávejte možný problém. K plusu tohoto prodejce
je ale třeba říct, že u tohoto produktu informuje o jeho chybě – závadě….
Dobry den , hledal jsem inspiraci pro stavbu internetového radia, kde chci použít pro přepínání stanic rotační encoder a názvy stanic zobrazovat rolováním na sd1306 I2C. Původně jsem chtěl vše stavět na esp8266, ale místo objednaného modulu VS1053 mi přišel shield pro uno. Je možnost VS1053 propojit kablíky jako modul, nebo jde přípojit na uno esp 01 místo Ethenet schiedu??