Esp32&Serial mp3 Player YX5300

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

Comentarios 2

  • 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(){}

Deja una respuesta

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

Translate »