Paisajismo Sonoro Integrado: Estudio de Luz y Silencio: Reproducción de MP3 con ESP32 y DFPlayer Mini

by

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.

El Desafío (El “Brief”)

El cliente requiere la sonorización de un espacio arquitectónico de vanguardia, inspirado en las obras de James Turrell (manipulación de la luz y el espacio) y la materialidad cálida de Herzog & de Meuron.

El objetivo es crear una atmósfera inmersiva de audio (sonidos ambientales, texturas sonoras) sin que la tecnología sea intrusiva. El sistema debe ser extremadamente fiable (grado industrial para operar 24/7), pero el núcleo de reproducción de audio debe ser modular y de bajo coste para fácil reemplazo. Los altavoces deben ser visibles pero integrarse como elementos de diseño, no como meras “cajas negras”.

2. La Solución: Arquitectura Híbrida

Propusimos una solución de hardware híbrida que combina la robustez del IoT industrial con la flexibilidad del hardware abierto.

  • El Cerebro (Control Industrial): Se seleccionó un Arduino Opta (PLC micro) como controlador maestro del espacio. El Opta gestiona los horarios de encendido, se integra con los sensores de ocupación de la sala y coordina la iluminación ambiental (DALI/Modbus).
  • La Voz (Módulo de Audio Especializado): Para la reproducción de audio, se implementó el módulo exacto detallado en la nota técnica de ger.ar: un ESP32 gestionando un DFPlayer Mini.
  • La Integración: El Arduino Opta envía comandos vía Serial (UART) o I2C al ESP32, indicándole qué pista de la tarjeta SD reproducir según el “estado de ánimo” del espacio (ej. mañana luminosa vs. tarde íntima). El ESP32 actúa como un esclavo de audio dedicado.

3. La Estética (Turrell + Herzog & de Meuron)

El espacio es un “estudio despoblado”. Paredes de hormigón texturizado con tonos cálidos (terracota, beige). La luz es indirecta, bañando las paredes desde foseados ocultos, creando volúmenes de color casi tangibles.

Los altavoces no se esconden, se celebran. Son elementos colgantes, tipo péndulo, de diseño cilíndrico simple, acabado en metal cepillado oscuro o cerámica mate, sin logotipos visibles, suspendidos por cables delgados desde el techo alto.


4. Visualización del Proyecto (Imágenes Conceptuales)

IMAGEN 1: El Plano General (La Arquitectura)

Objetivo: Mostrar el espacio inmersivo y la integración de los altavoces.

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.

Comentarios

2 respuestas a “Paisajismo Sonoro Integrado: Estudio de Luz y Silencio: Reproducción de MP3 con ESP32 y DFPlayer Mini”

  1. Guillermo Avatar
    Guillermo

    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.

    1. Ger Avatar
      Ger

      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() o myDFPlayer.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() y myDFPlayer.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!

Responder a Ger Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *