projekty@dakohran.cz

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

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˃     // Standartní knihovna Ethernet - Shield W5100
#include   ˂Bounce2.h˃    // 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

Napsat komentář

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