В этой инструкции разберем, как подключить DAC модуль PCM5102 к платам ESP32 (на примере ESP32 WROOM 32D) через PlatformIO и решить распространенные проблемы: отсутствие звука (тишина) или появление треска. В качестве бонуса — важный лайфхак с перемычками на плате.
Проблема: PCM5102 не работает с ESP32
При попытке использовать связку ESP32 WROOM 32D (30 pin) и PCM5102 в среде PlatformIO часто вместо звука можно услышать либо полную тишину, либо постоянный треск. Стандартные скетчи могут не работать, и в интернете не всегда есть прямое решение этой конкретной проблемы. Для справки: ЦАП — это устройство, которое превращает цифровой сигнал (числа) в аналоговый (например, звук).
Характеристики PCM5102:
- 32-битный ЦАП может различать более 4 миллиардов уровней сигнала (2³²) (Примеры: 16-бит: как CD-качество. 24-бит: студийное качество.)
- Интерфейс I2S (произносится как "ай-ту-эс") — это способ, с помощью которого микросхемы передают цифровой звук друг другу.
- Динамический диапазон: 112 дБ Это очень хороший показатель, так как чем выше число — тем лучше качество звука. (CD-качество — около 96 дБ. Студийные устройства — от 100 дБ и выше.)
Комплектующие и подключение
- Плата: ESP32 WROOM 32D (30 pin)
- ЦАП модуль: PCM5102
Схема подключения PCM5102 к ESP32:
- SCK -> GND
- BCK (BCLK) -> GPIO 26
- DIN (DATA) -> GPIO 22
- LCK (LRCK) -> GPIO 25
- GND -> GND
- VIN -> 3.3V (можно запитать от внешнего источника, но для начала проверить от ESP32
И вишенка на торте чтоб этот код заработал и pcm5102 наконец-то начал выдавать звуки, нужно на обратной стороне pcm5102 спаять перемычки как на изображении ниже.

Код файла platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
esphome/ESP32-audioI2S@^2.0.7
Код в main.cpp (обратите внимание что main.c переименован в main.cpp). В основном файле программы (main.cpp) необходимо правильно инициализировать выводы I2S. Укажите пины в следующем порядке: 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("Инициализация радио...");
// Подключение к WiFi
Serial.print("Подключаемся к WiFi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
int wifiTimeout = 20; // 10 секунд таймаут
while (WiFi.status() != WL_CONNECTED && wifiTimeout > 0) {
delay(500);
Serial.print(".");
wifiTimeout--;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("\n Ошибка подключения к WiFi!");
return;
}
Serial.println("\n WiFi подключен!");
Serial.print(" IP адрес: ");
Serial.println(WiFi.localIP());
Serial.print(" RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
// Настройка аудио
Serial.println(" Настраиваем аудио...");
audio.setPinout(26, 25, 22);
audio.setVolume(15);
Serial.println(" Громкость: 15/21");
// Запуск потока
Serial.print(" Запускаем поток: ");
Serial.println(streamURL);
audio.connecttohost(streamURL);
Serial.println(" Радио запущено!");
}
void loop() {
audio.loop();
}
// ==================== ОБРАБОТЧИКИ СОБЫТИЙ ====================
// Вызывается при изменении статуса аудио
void audio_info(const char *info) {
Serial.print(" audio_info: ");
Serial.println(info);
}
// Вызывается при изменении ID3 тегов
void audio_id3data(const char *info) {
Serial.print(" ID3: ");
Serial.println(info);
}
// Вызывается при получении названия станции
void audio_showstation(const char *info) {
Serial.print(" Станция: ");
Serial.println(info);
}
// Вызывается при получении информации о потоке
void audio_showstreamtitle(const char *info) {
Serial.print(" Трек: ");
Serial.println(info);
}
// Вызывается при изменении громкости
void audio_volume(int volume) {
Serial.print(" Громкость: ");
Serial.println(volume);
}
// Вызывается при начале воспроизведения
void audio_eof_mp3(const char *info) {
Serial.print(" Конец трека: ");
Serial.println(info);
}
// Вызывается при ошибках
void audio_commercial(const char *info) {
Serial.print(" Ошибка: ");
Serial.println(info);
}
Итог:
Следуя этим шагам — правильное подключение пинов, настройка перемычек на плате PCM5102 и использование верного кода — вы решите проблему с отсутствием звука. Если у вас есть вопросы или дополнения — оставляйте их в комментариях!