Hi everyone, I'm really stuck on a baffling issue involving an ESP32-S3 and a DFPlayer Mini module. After days of debugging, nothing makes sense anymore—maybe someone here has run into something similar?
The Goal:
A simple project: play an MP3 file from a DFPlayer Mini using an ESP32-S3 (with a display and keypad later).
The Problem:
- When connected to the ESP32-S3, the DFPlayer Mini is either completely silent or, under certain wiring configurations, outputs a loud, continuous digital noise (like a "tractor" sound) from the speaker. The ESP32 code reports that the DFPlayer is not responding.
- When the exact same DFPlayer Mini, SD card, and speaker are connected to an Arduino Uno, everything works perfectly.
So the DFPlayer module, SD card, MP3 file, and speaker are all fine. The issue is clearly with the ESP32-S3 setup.
Hardware Used:
- Microcontroller: ESP32-S3 development board
- DFPlayer Module: MH2024K-24SS based (PCB marked MP3-TF-16P V3.0).
- SD Card: Known-good card, FAT32 formatted using the official SD Card Formatter. Contains a
/mp3folder with0001.mp3(128kbps CBR). - Power Supply: Stable 5V 1A wall adapter powering the ESP32 via USB.
- Logic Level Shifter: 4-channel bidirectional (BSS138-based)
What I’ve Tried (Summary):
Using the Arduino Uno, everything works without issues. A simple setup with a resistor on the RX line is enough to get the DFPlayer playing audio immediately.
With the ESP32-S3, nothing works. I’ve tested both direct connections (with and without a resistor) and setups using a proper bidirectional logic level shifter. In one case, I get loud digital noise (even with the SD card removed); in the other, the module stays silent and player.begin() always fails. The level shifter itself works fine—I verified it with a loopback test.
I’ve tried multiple UARTs (Serial1, Serial2, main UART) and different pins, but no luck. The main UART even interferes with uploads when the DFPlayer is connected.
I also cycled through all common baud rates, including 9600, 4800, and 19200—none of them worked.
Minimal Test Code for ESP32 with Logic Level Shifter (Fails):
#include "DFRobotDFPlayerMini.h"
#include "HardwareSerial.h"
// Using Hardware Serial 2 on ESP32
HardwareSerial mySerial(2);
DFRobotDFPlayerMini player;
void setup() {
// Init serial for debugging
Serial.begin(115200);
while (!Serial);
Serial.println("\n--- Final Test: ESP32 with Logic Level Shifter ---");
// Init serial for DFPlayer
// ESP32 RX = Pin 19, ESP32 TX = Pin 21
mySerial.begin(9600, SERIAL_8N1, 19, 21);
Serial.println("DFPlayer serial port initialized.");
Serial.println("Waiting 3 seconds for DFPlayer to boot...");
delay(3000);
Serial.println("Attempting to initialize DFPlayer...");
if (player.begin(mySerial)) {
Serial.println("**************************************");
Serial.println("* SUCCESS! DFPlayer is online! *");
Serial.println("**************************************");
player.volume(25);
player.play(1);
Serial.println("Play command sent.");
} else {
Serial.println("**************************************");
Serial.println("* FAILURE! DFPlayer is not responding. *");
Serial.println("**************************************");
}
}
void loop() {}
Conclusions (and Desperation)
At this point, it looks like there’s some low-level incompatibility between this ESP32-S3 board and DFPlayer modules based on the MH2024K chip. I’m guessing some mix of electrical noise, UART timing, or something deeper in the hardware layer.
I’ve tried everything I can think of.
If anyone knows of issues with the ESP32-S3 UART or has suggestions I'd be very grateful.
Thanks in advance




