ESP8266Audio library reproducir MP3 en ESP8266 y ESP32 con acceso SPIFFS - How to connect and play MP3
Utilizando la librería ESP8266Audio es posible lograr la reproducción de archivos MP3 en placas ESP8266 y ESP32.
Para este proyecto se ha utilizado un ESP8266 mini Wemos y un ESP32 Wroom y en ambos ha funcionado correctamente la reproducción.
En ambos casos la reproducción fué exitosa empleando las librerías AudioFileSourceSPIFFS.h para acceso SPIFFS, AudioGeneratorMP3.h para la compatibilidad con archivos MP3 y AudioOutputI2SNoDAC.h como salida directa hacia un auricular o amplificador.
También se definen los punteros mp3, file y out que referenciarán la decodificación mp3, los archivos accedidos mediante SPIFFs y la salida out configurada en modo NoDAC (que aunque suene ilógico, es la librería que si funciona en la salida I2C en vez de la librería DAC I2C que no he logrado hacerla funcionar). El código completo de las librerías necesarias es el siguiente:
#ifdef ESP32
#include "WiFi.h"
#include "SPIFFS.h"
#else
#include "ESP8266WiFi.h"
#endif
#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
Se ha reducido en este ejemplo el código al mínimo posible, eliminando también de los ejemplos originales, aquellas librerías poco útiles como la librería ID3, etc.También se ha creado un procedimiento en bucle que permite la reproducción directa y sin limitaciones de cualquier archivo MP3 (a 44.100Hz y128bits).
Aquí un ejemplo sencillo y directo para reproducir en forma ininterrumpida dos archivos mp3:
#include "Arduino.h"
#ifdef ESP32
#include "WiFi.h"
#include "SPIFFS.h"
#else
#include "ESP8266WiFi.h"
#endif
#include "AudioFileSourceSPIFFS.h"
//#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;
void setup() {
WiFi.mode(WIFI_OFF);
Serial.begin(115200);
delay(1000);
SPIFFS.begin();
out = new AudioOutputI2SNoDAC();
mp3 = new AudioGeneratorMP3();
}
void PlayMp3(char* archivo){
file = new AudioFileSourceSPIFFS(archivo);
if (file) {
mp3->begin(file, out);
while(mp3->isRunning()) { // Bucle infinito hasta que termine de sonar cada archivo MP3
if (!mp3->loop()) mp3->stop();
}
}
}
void loop() {
PlayMp3("/test1.mp3");
PlayMp3("/test2.mp3");
}
Conexionado de la salida de audio en ESP8266 y ESP32
Este código ha sido testeado y funciona perfectamente tanto en ESP8266 como en ESP32. Sin embargo debemos tener en cuenta algunas cuestiones para que en ambas placas la reproducción MP3 sea exitosa.
En el caso de las placas ESP8266 es preciso configurar el IDE Arduino como Generic ESP8266 module, setear la velocidad del CPU en el menu: Herramientas -> CPU frequency en 160 Mhz y el parámetro IwIP Variant: configurarlo como: v2 Higher Bandwidth (no features)
Para el conexionado de salida de audio debemos utilizar el puerto GPIO03 (RX) junto con el conector GND:
--------------------------------
Para el conexionado de placas ESP32 se utiliza el puerto GPIO22
----------------------------------
Aunque se recomienda utilizar en ambos circuitos un transistor 2N3904 (NFN) para potenciar y limpiar la salida, en ambos circuitos se puede obviar y conectar en forma directa hacia una salida mini Plug de audio para conectarse a un auricular o a un amplificador en forma directa.
En ambas placas, dentro del proyecto .ino debemos crear una carpeta Data donde almacenaremos los dos archivos MP3 (test1.mp3 y test2.mp3) y debemos subirlo al almacenamiento SPIFFS de la placa utilizando -> Herramientas -> ESP8266 Sketch Data Upload o ESP32 Sketch Data Upload según corresponda.