projekty@dakohran.cz

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

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
I2C sběrnice je na pinech A4 ( SDA ) a A5 ( SCL )

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>          // Standartní knihovna Ethernet - Shield W5100
#include   <Bounce2.h>            // Vyhodnocení stavu tlačítek - autor Thomas Ouellet Fredericks
#include   <LiquidCrystal_I2C.h>  // 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

  1. Anonym napsal:

    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?

    • David Kohout napsal:

      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

      • Anonym napsal:

        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

        • David Kohout napsal:

          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

          • David Kohout napsal:

            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ě….

  2. Radovan Čermák napsal:

    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??

Napsat komentář: David Kohout Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna.