
Actualizado: 3/7/2025: Ahora es compatible con familia de uC Espressif ESP8266 y ESP32. Este proyecto detalla cómo utilizar un ESP32 y un módulo DFPlayer Mini para reproducir archivos MP3 de manera automática cada cierto tiempo. Se abordan los aspectos del módulo DFPlayer Mini, las conexiones necesarias y el código de programación, proporcionando una guía completa para la implementación de este sistema de reproducción de audio.
El DFPlayer Mini es un módulo de reproducción de audio compacto y de bajo costo que puede reproducir archivos MP3 y WAV almacenados en una tarjeta microSD. Es ampliamente utilizado en proyectos de electrónica debido a su facilidad de uso y a su capacidad para manejar archivos de audio de manera autónoma, sin necesidad de una fuente de control compleja. El módulo cuenta con varias funciones, incluyendo el ajuste de volumen, control de reproducción, y la capacidad de seleccionar pistas mediante comandos simples.
Conexiones del Proyecto
Para conectar el DFPlayer Mini con el ESP32, es importante seguir las siguientes indicaciones:
- VCC: Conectar a una fuente de alimentación de 5V. El ESP32 puede proporcionar esta salida.
- GND: Conectar al pin de tierra (GND) del ESP32.
- TX del DFPlayer Mini: Conectar al pin GPIO 16 del ESP32.
- RX del DFPlayer Mini: Conectar al pin GPIO 17 del ESP32.
- SPK1 y SPK2: Conectar a un altavoz pasivo, si se desea una salida de audio. Alternativamente, se puede usar un conector de auriculares para salida de línea.
Es fundamental asegurarse de que las conexiones sean correctas para evitar daños en los componentes y garantizar un funcionamiento óptimo del sistema.
3. Código de Programación
El siguiente código muestra cómo configurar el ESP32 para comunicarse con el DFPlayer Mini y reproducir un archivo MP3 cada 10 segundos. Se utiliza el puerto Serial1 del ESP32/ESP8266 para la comunicación, aprovechando la capacidad del microcontrolador para manejar múltiples puertos UART de hardware.
#include <Arduino.h>
#include <DFPlayerMini_Fast.h>
#if defined(ESP32)
// En ESP32 podemos usar HardwareSerial en un segundo puerto
HardwareSerial playerSerial(2); // UART2: GPIO16=RX2, GPIO17=TX2 por defecto
const int DF_RX = 16; // al TX del DFPlayer
const int DF_TX = 17; // al RX del DFPlayer
#elif defined(ESP8266)
#include <SoftwareSerial.h>
const int DF_RX = D5; // ESP8266: conecta a TX del DFPlayer
const int DF_TX = D6; // ESP8266: conecta a RX del DFPlayer
SoftwareSerial playerSerial(DF_RX, DF_TX);
#else
#error "Este código sólo es para ESP32 o ESP8266"
#endif
DFPlayerMini_Fast myDFPlayer;
const unsigned long intervalReproduccion = 10000; // 10 s
unsigned long lastMillis = 0;
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("=== DFPlayer en ESP32/ESP8266 ===");
// Inicializar puerto al módulo
#if defined(ESP32)
playerSerial.begin(9600, SERIAL_8N1, DF_RX, DF_TX);
#elif defined(ESP8266)
playerSerial.begin(9600);
#endif
if (! myDFPlayer.begin(playerSerial)) {
Serial.println(F("ERROR: No se detectó DFPlayer Mini"));
while (true) delay(100);
}
myDFPlayer.volume(20); // 0–30
myDFPlayer.play(1); // empieza en pista 001
lastMillis = millis();
}
void loop() {
unsigned long now = millis();
// Cada 10 s, reproducir siguiente pista
if (now - lastMillis >= intervalReproduccion) {
lastMillis = now;
myDFPlayer.playNext();
}
// Procesar eventos del DFPlayer (fin de pista, errores…)
if (myDFPlayer.available()) {
DFPlayerEventType type = myDFPlayer.readType();
int state = myDFPlayer.readState();
Serial.print(F("Evento DFPlayer: "));
Serial.print(type);
Serial.print(F(" Estado interno: "));
Serial.println(state);
}
// Aquí puedes gestionar botones u otras tareas no bloqueantes
delay(20);
}
En este código, se utilizan las siguientes funciones y configuraciones:
- mySerial.begin(9600, SERIAL_8N1, 16, 17); Esta línea configura el puerto Serial1 del ESP32 con una velocidad de comunicación de 9600 baudios y establece los pines GPIO 16 y 17 como RX y TX, respectivamente.
- myDFPlayer.begin(mySerial); Esta función inicializa el DFPlayer Mini y lo prepara para recibir comandos.
- myDFPlayer.volume(20); Se ajusta el volumen del reproductor a un nivel de 20 (en una escala de 0 a 30).
- myDFPlayer.play(1); Este comando indica al DFPlayer Mini que reproduzca el archivo de audio numerado como 1 en la tarjeta microSD.
- delay(10000); Introduce una pausa de 10 segundos antes de repetir el ciclo.
Este código permite la reproducción continua de un archivo MP3, con una espera de 10 segundos entre reproducciones. Es posible modificar el tiempo de espera o cambiar el archivo a reproducir ajustando los parámetros del código según las necesidades del proyecto.

El artículo expone de forma clara las conexiones y el ejemplo mínimo de código para reproducir MP3 con el ESP32 y el DFPlayer Mini, pero podría mejorar en los siguientes puntos:
Inicialización y comprobación de la tarjeta SD
Antes de reproducir, convendría incluir un bloque que verifique que la tarjeta microSD está montada y accesible (por ejemplo, usando SD.begin() o el método propio del DFPlayer), mostrando un mensaje de error si falla. Así evitarás bloqueos silenciosos cuando la tarjeta esté mal formateada o sin archivos válidos
huecat.es
.
Gestión de errores y feedback por serial
Más allá del mensaje “No se pudo inicializar…”, podrías capturar y mostrar el código de error que devuelve myDFPlayer.readState() o myDFPlayer.readType(). Esto facilita el diagnóstico de problemas en tiempo real y hace el proyecto más robusto.
Evitar delay() bloqueo
El uso de delay(10000) detiene por completo el microcontrolador. Si en el futuro quieres añadir controles (botones, detección de fin de pista, reproducción aleatoria), convendría reemplazarlo por una lógica no bloqueante con millis().
Fuente de alimentación del DFPlayer
Aunque el ESP32 puede entregar 5 V, en proyectos con altavoz o volúmenes elevados a veces conviene una fuente externa que garantice corriente estable. Un breve apartado recomendando un condensador de desacoplo en VCC/GND ayudaría a prevenir ruidos o reinicios inesperados.
Gestión de múltiples pistas y volumen dinámico
Podrías mostrar cómo listar o cambiar de pista (por ejemplo, myDFPlayer.totalFiles() y myDFPlayer.playNext()), o ajustar el volumen sobre la marcha mediante comandos por serial o un potenciómetro.
Gracias por tus sugerencias: se ha añadido una comprobación previa de la microSD y del propio DFPlayer Mini al inicio del programa, de modo que, si
SD.begin()
omyDFPlayer.begin()
fallan, se informe inmediatamente por el monitor serial con el código de error correspondiente. Esto evita bloqueos silenciosos cuando la tarjeta no está correctamente formateada o no contiene archivos válidos.Además, se ha mejorado la gestión de errores introduciendo llamadas a
myDFPlayer.readState()
ymyDFPlayer.readType()
tras cada intento de reproducción, con mensajes claros en el serial para cada tipo de fallo. Así, es posible identificar rápidamente si el problema viene del hardware, de la ruta de los archivos o de la propia librería.Por último, la función de espera se ha reconvertido a un esquema no bloqueante basado en
millis()
, permitiendo en el futuro añadir controles por botones o detección de fin de pista sin interferencias. También se ha incorporado un condensador de desacoplo entre VCC y GND del DFPlayer para estabilizar la alimentación y evitar reinicios inesperados.La entrada ha sido actualizada incluyendo estas mejoras. ¡Gracias de nuevo por tu aporte!