Radio internetowe ESP32 może odbierać strumień MP3 przez Wi-Fi, dekodować go w czasie rzeczywistym i wysyłać dźwięk przez I2S do przetwornika PCM5102A. Poniżej znajdziesz gotowy kod z buforem, automatycznym ponawianiem połączenia oraz kompletną instrukcję podłączenia.
Program korzysta z klasy AudioFileSourceBuffer. Dekoder odczytuje dane z bufora biblioteki, a bufor pobiera je ze strumienia radiowego.
Projekt sprzętowy zrealizowany przez użytkownika @cezary0782.

Co jest potrzebne do radia internetowego ESP32?
- płytka ESP32 z łącznością Wi-Fi,
- moduł DAC I2S PCM5102A,
- aktywny głośnik lub wzmacniacz audio z głośnikiem,
- przewody połączeniowe i stabilne zasilanie,
- bezpośredni adres strumienia MP3.
ESP32 i PCM5102A – podłączenie I2S
| ESP32 | PCM5102A | Znaczenie |
|---|---|---|
| GPIO26 | BCK / BCLK | Zegar bitowy magistrali I2S |
| GPIO25 | LCK / LRCK / WS | Wybór lewego i prawego kanału |
| GPIO22 | DIN | Dane audio z ESP32 do przetwornika |
| GND | GND | Wspólna masa obu modułów |
| Zgodnie z opisem modułu | VIN / VCC | Zasilanie płytki PCM5102A; sprawdź opis konkretnego modułu |
| — | SCK | W pokazanej konfiguracji zwarte do GND; dotyczy modułów pracujących bez zewnętrznego MCLK |
Piny I2S są ustawione w programie przez SetPinout(26, 25, 22), czyli kolejno BCLK, LRCK i DATA. Możesz użyć innych GPIO, ale wtedy zmień zarówno przewody, jak i stałe w kodzie.

Kod radia internetowego ESP32 z buforem
Zainstaluj bibliotekę ESP8266Audio autorstwa Earle’a Philhowera w Menedżerze bibliotek Arduino IDE. Mimo nazwy obsługuje ona także ESP32. Uzupełnij nazwę sieci, hasło i adres strumienia, a następnie wgraj szkic.
.pls lub .m3u nie zawsze zadziałają jako STREAM_URL. Jeśli stacja nadaje AAC, trzeba użyć odpowiedniego generatora audio zamiast AudioGeneratorMP3.AudioFileSourceICYStream → AudioFileSourceBuffer → AudioGeneratorMP3 → AudioOutputI2S → PCM5102A. Nie trzeba tworzyć osobnych zadań na dwa rdzenie.Wyjaśnienie kodu krok po kroku
1. Biblioteki
WiFi.h łączy ESP32 z routerem. AudioFileSourceICYStream odbiera internetowy strumień i obsługuje metadane ICY spotykane w radiach internetowych. AudioFileSourceBuffer tworzy zapas pobranych danych, AudioGeneratorMP3 dekoduje MP3, a AudioOutputI2S przekazuje cyfrowy dźwięk do PCM5102A.
2. Dane Wi-Fi, adres stacji i piny I2S
W stałych WIFI_SSID i WIFI_PASSWORD wpisujesz dane swojej sieci. STREAM_URL zawiera bezpośredni adres strumienia MP3. Stałe I2S_BCLK, I2S_LRCK i I2S_DOUT odpowiadają przewodom opisanym w tabeli połączeń.
AUDIO_BUFFER_SIZE określa rozmiar bufora w bajtach. Wartość 8192 jest rozsądnym punktem startowym dla ESP32. RETRY_INTERVAL_MS ustala pięciosekundowy odstęp między kolejnymi próbami połączenia.
3. Obiekty strumienia audio
Wskaźniki stream, buffer, mp3 i output tworzą cały tor dźwięku. Początkowo mają wartość nullptr, ponieważ połączenie ze stacją jest tworzone dopiero po uzyskaniu dostępu do Wi-Fi.
4. Funkcja stopRadio()
stopRadio() zatrzymuje dekoder, zamyka źródło danych i zwalnia pamięć zajmowaną przez obiekty połączenia. Dzięki temu każda kolejna próba rozpoczyna się z czystym stanem i nie powoduje narastającego zużycia pamięci.
5. Funkcja startRadio()
Najpierw tworzony jest AudioFileSourceICYStream dla podanego adresu stacji. Następnie źródło zostaje opakowane w AudioFileSourceBuffer. To właśnie obiekt buffer, a nie bezpośrednio stream, jest przekazywany do mp3->begin(buffer, output).
Wywołanie mp3->begin() uruchamia dekoder oraz wyjście I2S. Jeśli źródła nie da się otworzyć albo dekoder nie wystartuje, funkcja zwraca false, a program spróbuje ponownie po ustalonym czasie.
6. Połączenie z Wi-Fi i setup()
connectWiFi() ustawia tryb stacji, rozpoczyna logowanie do routera i czeka na połączenie. WiFi.setSleep(false) ogranicza przerwy wynikające z oszczędzania energii, ale zwiększa pobór prądu.
W setup() uruchamiany jest port szeregowy, Wi-Fi oraz obiekt AudioOutputI2S. Metoda SetPinout() przypisuje GPIO do sygnałów BCLK, LRCK i DATA. Na końcu wykonywane jest pierwsze połączenie ze stacją.
7. Pętla loop() i ponowne łączenie
Gdy Wi-Fi działa i dekoder jest aktywny, program możliwie często wywołuje mp3->loop(). W tej metodzie pobierane są dane z bufora, dekodowane kolejne ramki MP3 i wysyłane próbki do I2S. Dlatego w głównej pętli nie należy dodawać długich opóźnień.
Jeżeli Wi-Fi zniknie, kod okresowo wykonuje WiFi.reconnect(). Jeżeli zakończy się sam strumień, po pięciu sekundach wywoływane jest ponownie startRadio(). Zasoby bieżącego połączenia są wcześniej zamykane przez stopRadio().
Czy większy bufor usunie zacinanie radia?
Większy bufor pomaga przy krótkich wahaniach transmisji, ale nie naprawi nieaktywnego adresu, złego kodeka, bardzo słabego Wi-Fi ani serwera, który okresowo przerywa połączenie. Dla ESP32 warto zacząć od 8192 bajtów. Jeśli jest wolna pamięć, można sprawdzić 16384 bajty, zmieniając AUDIO_BUFFER_SIZE.
Wyłączenie oszczędzania energii przez WiFi.setSleep(false) może zmniejszyć przerwy w odbiorze. Zwiększa jednak pobór prądu, dlatego w urządzeniu bateryjnym warto przetestować oba ustawienia.
Radio ESP32 nie gra – najczęstsze przyczyny
- Niepoprawny URL: użyj bezpośredniego adresu MP3, nie strony WWW ani listy odtwarzania.
- Inny kodek:
AudioGeneratorMP3nie dekoduje strumienia AAC. Dopasuj generator do formatu stacji. - Brak wspólnej masy: GND ESP32 i PCM5102A muszą być połączone.
- Zamienione BCLK, LRCK lub DIN: sprawdź nadruki na module, ponieważ producenci używają kilku skrótów.
- Za słabe zasilanie: moduł może tracić Wi-Fi podczas skoków poboru prądu.
- Wywołania blokujące: długie
delay()i ciężkie operacje wloop()utrudniają regularne dekodowanie audio.
Adresy rozgłośni mogą się zmieniać. Jako punkt wyjścia można wykorzystać listę polskich strumieni radiowych, ale przed wpisaniem adresu do programu sprawdź kodek i upewnij się, że jest to bezpośredni strumień.
Instalacja biblioteki ESP8266Audio
- W Arduino IDE otwórz Narzędzia → Zarządzaj bibliotekami.
- Wyszukaj ESP8266Audio i zainstaluj bibliotekę autorstwa Earle’a Philhowera.
- Wybierz właściwą płytkę ESP32 i port, uzupełnij dane Wi-Fi oraz wgraj kod.
- Otwórz Monitor portu szeregowego z prędkością 115200 baud, aby zobaczyć stan połączenia.

Najczęściej zadawane pytania
Dlaczego radio internetowe ESP32 się zacina?
Najczęstsze przyczyny to słaby sygnał Wi-Fi, niestabilny serwer stacji, zbyt mały zapas danych, blokowanie funkcji loop() albo błędny kodek. Bufor pomaga tylko przy krótkich przerwach transmisji.
Czy PCM5102A jest wzmacniaczem?
Nie. PCM5102A jest przetwornikiem cyfrowo-analogowym. Do pasywnego głośnika potrzebny jest jeszcze wzmacniacz; można też użyć aktywnego głośnika z własnym wzmacniaczem.
Czy trzeba używać dwóch rdzeni ESP32?
Nie. Biblioteka realizuje cały łańcuch źródło–bufor–dekoder–I2S, gdy regularnie wywołujesz mp3->loop(). Ręczne równoległe czytanie jednego strumienia może uszkodzić kolejność danych.
Jaki format radia obsługuje ten kod?
Pokazany wariant używa dekodera MP3. Dla AAC lub FLAC trzeba zastosować odpowiednią klasę dekodera dostępną w bibliotece i uwzględnić wymagania pamięciowe danego formatu.
Powiązane poradniki
- millis() zamiast delay() – jak wykonywać zadania bez długiego blokowania pętli.
- Skaner I2C Arduino – przydatny w projektach z wyświetlaczem sterowanym przez I2C.
- Arduino UNO pinout – funkcje pinów w projektach dla początkujących.
Podstawa techniczna kodu: dokumentacja i przykład StreamMP3FromHTTP biblioteki ESP8266Audio.