Internetové rádio Arduino MEGA, 150 stanic, dálkové ovládání, posuv textu na LCD

ARDUINO MEGA, ETHERNET SHIELD W5100, AUDIO SHIELD VS 1053 B, Infračervená přijímací LED dioda VS 1838 B, I2C LCD displej.
Tento projekt pro Arduino MEGA je téměř identický s předchozím projektem pro UNO http://dakohran.cz/2020/02/15/internetove-radio-ovladane-dalkovym-ovladacem/ Nicméně je zde několik zásadních změn :
- Je předvoleno 150 stanic Internetových rádií
- Přepínání stanic a regulace hlasitosti pomocí dálkového ovladače
- 10 rychlých předvoleb stanic tlačítky 0 až 9
- Přepínání stanic po krocích +10 nebo -10 pomocí dálkového ovladače
- Název stanice se posouvá na LCD displeji
- 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

POZOR, PRO ARDUINO MEGA MUSÍME PROPOJIT SPI PINY S VS 1053B, PIN 50 ARDUINO NA PIN 12 ( MISO ), 51 NA PIN 11 ( MOSI ), 52 NA PIN 13 ( SCK ). SDA MÁ MEGA NA PINU 20, SCL NA PINU 21. DĚKUJI H.K. ZA VŠÍMAVOST 🙂
V tomto projektu jsem nahradil 2-řádkový displej I2C displejem 4-řádkovým o 20-ti znacích na řádek. Displej můžeme použít jakýkoliv I2C, níže si ukážeme, na co dávat pozor aby se nám text posouval správně. Vzhledem k velikosti programu ho zde nevypíši celý, budeme se věnovat změnám oproti předchozímu projektu.
String nazev=““; // Zde se uloží jméno aktuálně přehrávané stanice
String zanr=““; // Zde se uloží žánr aktuálně přehrávané stanice
int Li = 20; // Poslední znak na řádku – pozice
int Lii = 0; // První znak na řádku – pozice
int Delka_textu = 0; // Délka srolovacího textu na LCD – 0 = inicializační
int Prodleva=0; // Prodleva před posunutím znaku na LCD
Přibylo nám několik nových proměnných. Proměnná zanr nám na LCD zobrazí žánr aktuální stanice ( pop, zpravodajství, rock… ). Integer Li nám udává, kolik znaků na řádek je schopný náš LCD displej zobrazit. Lii je počáteční znak LCD. Proměnná Delka_textu je číslo, které nám udává, kolik znaků má text, který chceme posouvat. Prodleva je doba, kdy se más posunout znak na LCD.
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 } if (Prodleva >= 300){ Posuv(); // Zavolej funkci posuv znaků na řádku } }
String Scroll_LCD_Left(String StrDisplay){ String result; String StrProcess = " " + StrDisplay + " "; // Mezera = počet znaků na řádku result = StrProcess.substring(Li,Lii); Li++; Lii++; if (Li>StrProcess.length()){ Li=20; Lii=0; } return result; }
V této části kódu řeším, kdy se má posunout text o jeden znak. Hraje-li stanice, tak do bufferu posíláme data k přehrání po 32 Bytes. Do této smyčky jsem vložil počítadlo počtu cyklů smyčky LOOP ( Prodleva=Prodleva+1; ). Takže jakmile je počet cyklů roven nebo vetší jak 300, zavolám funkci Posuv, kde se počítadlo vynuluje a dojde k posunu textu na LCD o 1 znak.Při datovém toku 128 kb/s streamu trvá asi 1 sec., než proměnná Prodleva dosáhne hodnoty 300. Je-li datový tok vyšší, je této hodnoty dosaženo dříve, při nižším datovém toku se rychlost posuvu zpomalí. Většina rádií používá datový tok 128 kb/s, tak stačí tento kompromis a není nutno použít interupt.
void Posuv(){ Prodleva=0; Delka_textu = nazev.length(); lcd.setCursor(0, 1); // Nastav kurzor na 1 znak druhého řádku lcd.print(Scroll_LCD_Left(nazev)); }
Kód pro posuv textu můžeme použít i v předchozích příkladech pro Arduino Uno, vzhledem k malé paměti ale asi budeme nuceni ubrat počet předvoleb.
Zkouška funkčnosti
8 Odpovědi
dobrý den, při nahrání kodů do Arduino Mega2560 se musí předtím propojit piny Mega s MP3 zvukovkou, vše provedeno, zvuk běží, ale na lcd 4×20 i2c se neobjevuje žádný výpis, jen černé kostičky, na trimru i2c jsem kontrast zkoušel, bohužel nic ? Když vyměním Mega2560 za Uno, tak vše běží jak má. Zapojení je ok, kde může být zrada ? Děkuji HK
Dobrý den, děkuji za Váš příspěvek, chybu jsem udělal já ve schématu zapojení LCD displeje.
Schéma jsem okopíroval ze zapojení pro Arduino UNO a zapomněl jsem na zásadní věc, že signál
SDA má MEGA na pinu 20 a SCL na pinu 21 🙁 Takže vodiče z pinu 4 a 5 zvukovky přepojte prosím na tyto
piny 20 a 21 Arduino MEGA a displej by měl fungovat. Ještě jednou díky za upozornění schéma v brzké
době opravím. David K.
Dobrý den, děkuju za rychlou odpověď / nápravu. Zapojení pinů přepojeno. Internetové rádio s Mega2560 hraje a zobrazuje přesně tak, jak je ve Vašem ukázkovém videu. SUPER ! postavil jsem i předešlé verze rádia, které bez problémů šlapou na první zapojení ! Dobrá práce ! Těším se na další Vaše projekty a vylepšení. Díky HK
Dobrý den, nějak sem nevyčetl z kódu zda se hlasitost ovládá arduinem nebo až na repro ??
Mám v plánu to udělat do pergoly a hlasitost encoderem ( tím by se mohly ovládaly i stanice)
Dobrý den, toto rádio je kompletně ovládáno IR dálkovým ovladačem – viz. nadpis projektu 🙂
.
.
Přepínání stanic a regulace hlasitosti pomocí dálkového ovladače
10 rychlých předvoleb stanic tlačítky 0 až 9
Přepínání stanic po krocích +10 nebo -10 pomocí dálkového ovladače
.
.
int Volume=10; // Výchozí hlasitost rádia po zapnutí
.
MP3player.setVolume(Volume); // Nižší číslo vyšší hlasitost
.
case 0xFFE01F: // Pokud je to kód 0xFFE01F, VOLUME –
if (Volume 5){ // a je-li aktuální hlasitost větší jak 5,
Volume=Volume -5; // tak odečti číslo 5 ( menší číslo vyšší hlasitost )
MP3player.setVolume(Volume); // Nižší číslo větší hlasitost
.
.
case 0xFFA857: // Pokud je to kód 0xFFA857, VOLUME +
if (Volume >5){ // a je-li aktuální hlasitost větší jak 5,
Volume=Volume -5; // tak odečti číslo 5 ( menší číslo vyšší hlasitost )
MP3player.setVolume(Volume); // Nižší číslo větší hlasitost
.
.
Dobry den,
dekuji za krasne navody, rozchodil jsem zakladni radio s arduino uno a tlacitky. Rad bych se zeptal, zda kdybych presel na arduino mega, zda diky vetsimu bufferu by se zmensily pripadne vypadky?
Pripadne myslite, ze by slo tez rozchodit PI pico s lan a zvukovou kartou?
Dobrý den, v zásadě je úplně jedno, jestli Vaše rádio běží na Arduino Uno, Mega,
nebo ESP 32. Důležitá je kvalita internetového připojení, ani ne tak rychlost, ale
hlavně odezva ( Ping ). U exotických stanic ( např. Karibik, Afrika atd.. ) je kolikrát
nemožné mít kvalitní poslech i když si to rádio chcete pustit na PC. Holt tam Internet
běží jak u nás v 90-tých letech 🙂