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

ARDUINO UNO, ETHERNET SHIELD W5100, AUDIO SHIELD VS 1053 B, 2 TLAČÍTKA SE SPÍNACÍM KONTAKTEM
Zde náš předchozí projekt nejjednoduššího Internetového rádia trochu upgradujeme, tato verze je doplněna o 2 tlačítka, pomocí kterých můžeme přepínat předvolené stanice směrem vpřed a zpět. Arduino UNO má velmi malou paměť SRAM určenou pro lokální proměnné, takže počet předvoleb stanic je limitován právě velikostí této paměti. Musíme mít na zřeteli, že při obsazenosti této paměti nad cca. 85 % se může Arduino chovat nestandartně nebo dojde k jeho úplnému „zamrznutí“. Proto doporučuji v tomto projektu nevkládat více předvoleb, aby mělo Arduino k dispozici aspoň 380 Bajtů volné SRAM paměti pro stabilní chod.
- 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
Jádro programu je stejné jako u předchozího projektu Nejjednodušší Internetové rádio, je přidána nová knihovna Bounce pro práci s tlačítky, adresy stanic máme ve struktuře ID_STANICE. Zapojení HW nemá cenu komentovat ani pro začátečníky, vstupy ARDUINA „reagují“ na GND ( kostra zdroje ), takže z pinu GND VS 1053B přivedeme vodiče na tlačítka a z nich odvody připojíme na piny 3 a 5.

/* Internetové rádio AURUINO UNO ( nebo kompatibilní ) s VS 1053B Shield ( nebo kompatibilní ) a Ethernet Shield W5100 R3 * * Autor : David Kohout 11 / 2019 * * Potřebné komponenty : Arduino Uno ( MEGA ) * : Shield VS 1053B ( audio ) * : Ethernetová karta ( zde W5100 ) * : 2 tlačítka ( spínací kontakt ) * */ // 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 // Vyhodnocení stavu tlačítek - autor Thomas Ouellet Fredericks #define B_PREV 3 // Tlačítko předchozí stanice připojeno mezi GND a pin 3 Arduino UNO #define B_NEXT 5 // Tlačítko další stanice připojeno mezi GND a pin 5 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 //--------------------------------------------------------------------------------------------------------// //--------------------------------------------------------------------------------------------------------// 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=12; // Zde se uloží číslo aktuálně přehrávané stanice - čí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. Serial.begin(9600); // Inicializace COM portu 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 Serial.println("\n\Arduino UNO Internetové rádio"); // Výpis na COM jméno mého Arduino rádia Serial.println("\n\IP adresa Ethernet Shieldu od DHCP : "); Serial.println(Ethernet.localIP()); // Výpis na COM adresa IP mého rádia 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 = "01- Hitrádio Osmdesátka"; host = "ice.abradio.cz"; // Hitrádio 80 path = "/hit80128.mp3"; httpPort = 80; break; case 2: nazev = "02- Hitrádio Devadesátka"; host= "ice.abradio.cz"; // Hitrádio 90 path = "/hit90128.mp3"; httpPort = 80; break; case 3: nazev = "03- Rádio Rubi"; host = "icecast8.play.cz"; // Radio Rubi path = "/radiorubi128.mp3"; httpPort = 80;; break; case 4: nazev = "04- Dance rádio"; host = "icecast6.play.cz"; // Dance Radio path = "/dance-radio128.mp3"; httpPort = 80;; break; case 5: nazev = "05- FUN rádio SK"; host = "stream.funradio.sk"; // Fun rádio SK path = "/dance128.mp3"; httpPort = 8000; break; case 6: nazev = "06- Classic 21 90´"; host = "radios.rtbf.be"; // Classic 21 90´ BE path = "/wr-c21-90-128.mp3"; httpPort = 80; break; case 7: nazev = "07- Hit West 80"; host = "streamingp.shoutcast.com"; // Hity 80 let path = "/HITWEST80.mp3"; httpPort = 80; break; case 8: nazev = "08- M2 80 France"; // Hity 80 let FR host = "live.m2radio.fr"; path = "/m280-128.mp3"; httpPort = 80; break; case 9: nazev = "09- Hitrádio Orion Morava"; // CZ Hitrádio Orion Morava host = "ice.abradio.cz"; path = "/orionmorava128.mp3"; httpPort = 8000; break; case 10: nazev = "10- Blaník FM"; // CZ Rádio Blaník FM host = "ice.abradio.cz"; path = "/blanikfm128.mp3"; httpPort = 80; break; case 11: nazev = "11- ČRo 1 Radiožurnál"; // CZ CRo 1 Radiožurnál host = "icecast7.play.cz"; path = "/cro1-128.mp3"; httpPort =8000; break; case 12: nazev = "12- Star*Sat Radio"; // DE Star*Sat Radio host = "starsat-ais-edge-3005.fra-eco.cdn.addradio.net"; path = "/starsat/live/mp3/low/stream.mp3"; httpPort =80; break; case 13: nazev = "13- Antenne Bayern - 80er Hits"; // DE Antenne Bayern - 80er Hits host = "mp3channels.webradio.antenne.de"; path = "/80er-kulthits"; httpPort =80; break; case 14: nazev = "14- Evropa 2"; // CZ Evropa 2 host = "icecast3.play.cz"; path = "/evropa2-128.mp3?"; httpPort =80; break; case 15: nazev = "15- Evropa 2 Top 40"; // CZ Evropa 2 Top 40 host = "ice.actve.net"; path = "/web-e2-top40"; httpPort =80; break; case 16: nazev = "16- KISS 98 FM"; // CZ Kiss 98 FM host = "icecast4.play.cz"; path = "/kiss128.mp3"; httpPort =80; break; case 17: nazev = "17- Rádio Zlín Best Ballads"; // CZ Rádio Zlín Best Ballads host = "212.111.2.151"; path = "/radiozlin_128.mp3"; httpPort =8000; break; case 18: nazev = "18- Rock rádio Metalománie"; // CZ Rock rádio Metalománie host = "ice.abradio.cz"; path = "/metalomanie128.mp3"; httpPort =80; break; } if(!client.connected() || pamet_ID_stanice!=ID_stanice){ // Paměť 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; Serial.println(""); // Prázdný řádek ve výpisu COM Serial.println(nazev); // Pošli na COM název aktuální stanice } } 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 11 / 2019
#define B_PREV 3 // Tlačítko předchozí stanice připojeno mezi GND a pin 3 Arduino UNO
#define B_NEXT 5 // Tlačítko další stanice připojeno mezi GND a pin 5 Arduino UNO
#define BUTTON_DEBOUNCE_PERIOD 20 // Perioda snímání stavu tlačítek v milisekundách
Zde definujeme tlačítka, tlačítku předchozí stanice přiřadíme jméno B_PREV, 3 značí číslo pinu, na které je připojeno.Tlačítko další stanice má jméno B_NEXT, je připojeno na pin 5. Tyto piny jsou zvoleny úmyslně, jsou to „rezervy“, VS 1053B a Ethernet Shield s nimi nepracují.
Bounce b_Next = Bounce(); // Makro tlačítko NEXT ( další stanice )
Bounce b_Prev = Bounce(); // Makro tlačítko PREV ( předchozí stanice )
Přiřazení makra ( funkce ) BOUNCE – knihovna pro práci s tlačítky
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.
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
Funkce tlačítka Další stanice : je-li stisknuto tlačítko další stanice a není-li aktuálně přehrávaná stanice s větším ID_stanice jak 18, připočti do aktuálního ID_stanice číslo 1. ( každá stanice má přiřazeno číslo, pod kterým je prezentována ). Na začátku programu najdeme tento řádek : int ID_stanice=12; Ten při zapnutí Arduina zapíše do proměnné ID_stanice číslo 12, to znamená, že po zapnutí nám začne hrát stanice s „předvolbou“ 12 ( Star*Sat Radio ). Tlačítko Předchozí stanice funguje podobně : je-li stisknuto tlačítko předchozí stanice a je-li aktuálně přehrávaná stanice s větším ID jak 1, odečti z aktuálního ID_stanice číslo 1. Tím dosáhneme toho, že tlačítka nám budou fungovat pouze v rozsahu „předvoleb“ stanic ( 1 – 18 ).
switch(ID_stanice){ // Přepínání stanic – ID stanice
case 1:
nazev = „01- Hitrádio Osmdesátka“;
host = „ice.abradio.cz“; // Hitrádio 80
path = „/hit80128.mp3“;
httpPort = 80;
break;
case 2:
nazev = „02- Hitrádio Devadesátka“;
host= „ice.abradio.cz“; // Hitrádio 90
path = „/hit90128.mp3“;
httpPort = 80;
break;
case 3:
nazev = „03- Rádio Rubi“;
host = „icecast8.play.cz“; // Radio Rubi
path = „/radiorubi128.mp3“;
httpPort = 80;;
break;
case 4:
Tady je to vcelku jasné : např. Je-li ID_stanice = 2, instrukce Case 2 vykoná řádky pod ní až do příkazu Break ( přerušit ) a nám bude hrát Hitrádio 90.
Jak jsem se zmínil na začátku článku, Arduino UNO má poměrně malou paměť, tak s ním žádné extra vychytávky neuděláme, nicméně v dalším příspěvku si do tohoto rádia vložíme LCD displej, kde se nám bude zobrazovat název a předvolba aktuálně přehrávané stanice.
Zkouška funkčnosti