W tej instrukcji omówimy, jak podłączyć moduł DAC PCM5102 do płytek ESP32 (na przykładzie ESP32 WROOM 32D) za pomocą PlatformIO i rozwiązać typowe problemy: brak dźwięku (cisza) lub pojawiające się trzaski. Jako bonus — ważny trik z zworkami na płytce.
Problem: PCM5102 nie działa z ESP32
Podczas próby użycia zestawu ESP32 WROOM 32D (30 pinów) i PCM5102 w środowisku PlatformIO często zamiast dźwięku słychać całkowitą ciszę lub nieustanne trzaski. Standardowe szkice mogą nie działać, a w internecie nie zawsze znajdziemy bezpośrednie rozwiązanie tego konkretnego problemu.
Specyfikacja PCM5102:
- 32-bitowy DAC może rozróżniać ponad 4 miliardy poziomów sygnału (2³²). (Przykłady: 16-bit — jakość CD. 24-bit — jakość studyjna.)
- Interfejs I2S (czytane jako „aj-tu-es”) to sposób, w jaki układy scalone przesyłają między sobą cyfrowy dźwięk.
- Zakres dynamiczny: 112 dB — to bardzo dobry wynik, ponieważ im wyższa wartość, tym lepsza jakość dźwięku. (Jakość CD — około 96 dB. Urządzenia studyjne — od 100 dB wzwyż.)
Komponenty i podłączenie
- Płytka: ESP32 WROOM 32D (30 pinów)
- Moduł DAC: PCM5102
Schemat podłączenia PCM5102 do ESP32:
- SCK -> GND
- BCK (BCLK) -> GPIO 26
- DIN (DATA) -> GPIO 22
- LCK (LRCK) -> GPIO 25
- GND -> GND
- VIN -> 3.3V (można zasilić z zewnętrznego źródła, ale najpierw sprawdzić z ESP32)
I wisienka na torcie — aby ten kod zadziałał i PCM5102 w końcu zaczął wydawać dźwięki, trzeba na odwrocie PCM5102 przylutować zworki zgodnie z obrazkiem poniżej.

Kod pliku platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
esphome/ESP32-audioI2S@^2.0.7
Kod w main.cpp (zwróć uwagę, że main.c został przemianowany na main.cpp). W głównym pliku programu (main.cpp) należy prawidłowo zainicjować wyjścia I2S. Podaj piny w następującej kolejności: BCK, LCK, DIN.
#include <wifi.h>
#include "Audio.h"
const char* ssid = "FIFI NAME";
const char* password = "WIFI PASS";
const char* streamURL = "http://zt01.cdn.eurozet.pl/zet-net.mp3";
Audio audio;
void setup() {
Serial.begin(115200);
Serial.println("Inicjalizacja radia...");
// Połączenie z WiFi
Serial.print("Łączenie z WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
int wifiTimeout = 20; // timeout 10 sekund
while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) {
delay(500);
Serial.print(".");
wifiTimeout--;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\n Błąd połączenia z WiFi!");
return;
}
Serial.println("\n WiFi połączone!");
Serial.print(" Adres IP: ");
Serial.println(WiFi.localIP());
Serial.print(" RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
// Konfiguracja audio
Serial.println(" Konfiguracja audio...");
audio.setPinout(26, 25, 22);
audio.setVolume(15);
Serial.println(" Głośność: 15/21");
// Uruchomienie strumienia
Serial.print(" Uruchamianie strumienia: ");
Serial.println(streamURL);
audio.connecttohost(streamURL);
Serial.println(" Radio uruchomione!");
}
void loop() {
audio.loop();
}
// ==================== OBSŁUGA ZDARZEŃ ====================
// Wywoływane przy zmianie statusu audio
void audio_info(const char *info) {
Serial.print(" audio_info: ");
Serial.println(info);
}
// Wywoływane przy zmianie tagów ID3
void audio_id3data(const char *info) {
Serial.print(" ID3: ");
Serial.println(info);
}
// Wywoływane przy otrzymaniu nazwy stacji
void audio_showstation(const char *info) {
Serial.print(" Stacja: ");
Serial.println(info);
}
// Wywoływane przy otrzymaniu informacji o strumieniu
void audio_showstreamtitle(const char *info) {
Serial.print(" Utwór: ");
Serial.println(info);
}
// Wywoływane przy zmianie głośności
void audio_volume(int volume) {
Serial.print(" Głośność: ");
Serial.println(volume);
}
// Wywoływane przy rozpoczęciu odtwarzania
void audio_eof_mp3(const char *info) {
Serial.print(" Koniec utworu: ");
Serial.println(info);
}
// Wywoływane przy błędach
void audio_commercial(const char *info) {
Serial.print(" Błąd: ");
Serial.println(info);
}
Podsumowanie:
Stosując się do tych kroków — prawidłowe podłączenie pinów, konfiguracja zworek na płytce PCM5102 i użycie właściwego kodu — rozwiążesz problem braku dźwięku. Jeśli masz pytania lub uwagi — zostaw je w komentarzach!