Proyecto de Reproducción de MP3 con ESP32 y DFPlayer Mini

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.

Proyectos:

guest
2 Comentarios
Más antiguo
Más nuevo Más votado
Inline Feedbacks
View all comments
Guillermo
Guillermo
26 days ago

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.

GDPR