He probado dos librerias al uso:
<SerialMP3Player.h>

<MD_YX5300.h>

Es necesario utilizar tambien la libreria <SoftwareSerial.h> para Esp8266 y Esp32 bajo la denominación de EspSoftwareSerial, que es como viene en la búsqueda y gestión de librerias del Ide Arduíno-
EJEMPLO con <MD_YX5300.h>
Estructura de archivos y carpetas dentro de la tarjeta sd de memoria.
+-+- 01
| + 001-Happy_Dance.mp3
| + 002-O_Sole_Mio.mp3
|
+- 02
| + 003-Humpty_Dumpty.mp3
| + 004-Incy_Wincy_Spider.mp3
| + 005-Grand_Duke.mp3
|
+- 03
+ 006-Fernando.mp3
+ 007-Mamma_Mia.mp3
- Basandome en https://github.com/MajicDesigns/MD_YX5300/tree/main/examples/MD_YX5300_Simple_Player, he simplificado todo lo posible adaptandolo al Esp32 para comprobar como actua el volumen,la reproducción de una carpeta con varios archivos mp3 y un led indicador.
#ifndef USE_SOFTWARESERIAL
#define USE_SOFTWARESERIAL 1 ///< Set to 1 to use SoftwareSerial library, 0 for native serial port
#endif
#include <MD_YX5300.h>
#include <SoftwareSerial.h>
// Connections for serial interface to the YX5300 module
const uint8_t esp32_RX = 16; // connect to TX of MP3 Player module
const uint8_t esp32_TX = 17; // connect to RX of MP3 Player module
SoftwareSerial MP3Stream(esp32_RX, esp32_TX); // MP3 player serial stream for comms
#define Console Serial // command processor input/output stream
const uint8_t play = 27; // varios usos, active low (PULLUP)
const uint8_t noplay = 14;
const uint8_t PIN_LED = 12; // LED to show status
const uint8_t POT_VOLUME = 34; // volume control pot analog pin
#define PRINT(s,v) { Console.print(F(s)); Console.print(v); }
#define PRINTX(s,v) { Console.print(F(s)); Console.print(v, HEX); }
#define PRINTS(s) { Console.print(F(s)); }
// Define global variables
MD_YX5300 mp3(MP3Stream);
bool playerPause = true; // true if player is currently paused
void processVolume(bool bForce = false) // read the volume pot and set the volume if it has changed
{
static uint8_t vol; // current audio volume
uint8_t newVolume = map(analogRead(POT_VOLUME), 0, 4095, 0, mp3.volumeMax());
if (newVolume != vol || bForce)
{
PRINT("\nSetting volume ", newVolume);
vol = newVolume;
bool b = mp3.volume(vol);
PRINT(" result ", b);
}
}
void testPlay() {
if (digitalRead(play)==LOW){
PRINT(" result ",mp3.playFolderRepeat(1));
digitalWrite(PIN_LED, HIGH);
}
if (digitalRead(noplay)==LOW){
PRINT(" result ",mp3.playPause());
digitalWrite(PIN_LED, LOW);
}
}
void setup()
{
analogSetPinAttenuation (34, ADC_11db);
// set the hardware pins
pinMode(PIN_LED, OUTPUT);
pinMode(play, INPUT);
pinMode(noplay, INPUT);
// initialize global libraries
MP3Stream.begin(MD_YX5300::SERIAL_BPS);
mp3.begin();
mp3.setSynchronous(true);
processVolume(true); // force these to set up the hardware
}
void loop()
{
mp3.check(); // run the mp3 receiver
processVolume(); // set the volume if required
testPlay();
}
Funciones basicas libreria <MD_YX5300.h>
https://majicdesigns.github.io/MD_YX5300/class_m_d___y_x5300.html#aed0df46b07b2bf699c0bee9f31497c71
| mp3..playFolderRepeat(uint8_t folder) | Reproduce una carpeta completa (numero de carpeta a repetir) |
| mp3.playStart() | Reinicia la reproducción reproduciendo el archivo MP3 actual después de una reproducción Pausa () |
| mp3.playPause() | Pausa la reproducción del archivo MP3 actual,. playStart () debe seguir para reiniciar el mismo archivo MP3. playStop () debe usarse para detener la reproducción y abortar el modo de reproducción actual si no se utiliza playStart actuara como stop |
| mp3.playNext() | Reproduce el siguiente archivo MP3 en orden numérico. |
| mp3.playPrev() | Reproduce el archivo previo en orden numérico |
| mp3.playSpecific(uint8_t fldr,uint8_t file ) | fldr numero de carpeta que contiene los archivos file el numero de archivo dentro de la carpeta |
| mp3..playTrack(uint8_t t) | Reproduce un archivo específico. Reproducir un archivo especificando el número de índice del archivo |
| mp3.playTrackRepeat(uint8_t file) | Reproduce una pista en modo de repetición. |
| mp3.volume(uint8_t vol) | Establezca el volumen de salida al nivel especificado. El volumen máximo es volumeMax (). |
EJEMPLO con <serialMP3Player.h>
Con esta libreria, podremos hacer códigos mas asequibles para los que estamos empezando.
En este sketch utilizaremos un potenciometro conectado a la entrada GPIO 34, un led con una resistencia limitadora en la GPIO 12 y un solo switch con sus resistencia pull Up que con pulsos cortos pasaremos de «reproducir» a «pausa y con un pulso algo mas largo pasaremos al siguiente archivo mp3:
uint8_t i=0;
bool b;
void Player(){
if (digitalRead(PIN_SWITCH)==LOW&&b==1){ // b se hace igual a 1 en el "void setup"
mp3.play();
digitalWrite(PIN_LED,HIGH);
b=0;// hasta aqui seria el pulso corto
i++;
if (i==2){
mp3.playNext();
delay(500);
i=0;// hasta aqui seria un pulso de 1 segundo
}
}
if (b==0&&digitalRead(PIN_SWITCH)==LOW){
mp3.pause(); // solo funciona con play(),de otra forma hace funcion stop
b=1;
digitalWrite(PIN_LED,LOW);
}
#include "SerialMP3Player.h"
#define TX 17
#define RX 16
uint8_t i=0;
SerialMP3Player mp3(RX,TX);
const uint8_t PIN_SWITCH = 14; // varios usos, active low (PULLUP)
const uint8_t PIN_LED = 12; // LED to show status
const uint8_t POT_VOLUME = 34; // volume control pot analog pin
bool b;
void Player(){// Un solo Switch con tres funciones pulso corto=play otra pulso corto=pause ,un pulso largo= next
if (digitalRead(PIN_SWITCH)==LOW&&b==1){
mp3.play();
digitalWrite(PIN_LED,HIGH);
b=0;
i++;
if (i==2){
mp3.playNext();
delay(500);
i=0;
}
}
if (b==0&&digitalRead(PIN_SWITCH)==LOW){
mp3.pause(); // solo funciona con play(),de otra forma hace funcion stop
b=1;
digitalWrite(PIN_LED,LOW);
}
}
void Volume(){
int aud=analogRead(34);
aud=map(aud,0,4095,0,30);
mp3.setVol(aud);
}
void setup(){
b=1;
pinMode(PIN_SWITCH,INPUT);
pinMode(PIN_LED,OUTPUT);
mp3.begin(9600); // start mp3-communication
delay(500); // wait for init
mp3.sendCommand(CMD_SEL_DEV, 0, 2); //select sd-card
delay(500); // wait for init
char c; // char from Serial
char cmd=' ';
char cmd1=' ';
analogSetPinAttenuation (34, ADC_11db);
}
void loop() {
Player();
Volume();
}
Funciones Básicas
mp3.playNext(); // Play next file
mp3.playPrevious(); // Play previous file
mp3.play(); // Play
mp3.play(byte n); // Play n file
mp3.play(byte n, byte vol); // Play n file with volume
mp3.volUp(); // Volumen Up
mp3.volDown(); // Volumen Down
mp3.setVol(byte v); // Set Volumen (0-30)
mp3.playSL(byte n); // Play Single loop n file.
mp3.playSL(byte f, byte n); // Play Single loop play n file from f folder.
mp3.pause(); // Pause
mp3.playF(byte f); // Play all files in the f folder
mp3.stop(); // Stop playing
Hola, me gustaría que al cargarlo empezara la música sin tener que tocar nada, existe alguno forma? muchas gracias
Prueba esto: carga un sketch vacio solo con el setup().se reproduciria todos los archivos de la carpeta 1…
#include «SerialMP3Player.h»
#define TX (pin para tx)
#define RX (pin para rx)
SerialMP3Player mp3(RX,TX);
void setup(){
mp3.begin(9600);
delay(500);
mp3.setVol(23);
mp3.playF(1);
}
void loop(){}