Problemas con DFPlayerMini

Buenos días.
Estoy haciendo un proyecto en el que tengo que sacar sonido por unos speakers y sonidos diferentes a través de un megáfono con conexión jack 3,5. Estoy haciendo mil pruebas y soy incapaz de implementarlo.

Estoy usando la libreria DFRobotDFPlayerMini.h

He intentado poner dos DFPlayer con dos RX, TX pero sólo funciona si los conecto al pin 10 (RX) y 11(TX). Cuando intento crear una segunda instancia del SoftwareSerial con otros pines no funciona.... quiero decir, el segundo DFPlayer es incapaz de iniciarse.

Lios he probado por separado en 10 y 11 y todo ok, incluso he intentado poner las dos salidas en el mismo DFPlayer pero logicamente el sonido sale por el speaker y el megáfono.

Os dejo el código, que funciona para ver si encuentro alguna solución.... Es posible tener dos DFPlayer para que reproduzca diferentes sonidos y por diferentes salidas?

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

//SoftwareSerial mySoftwareSerial(15, 14); // RX, TX
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX funciona ok
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  //pinMode(14, INPUT);
  //pinMode(4, OUTPUT);
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //----Set volume----
  myDFPlayer.volume(15);  //Set volume value (0~30).
  myDFPlayer.volumeUp(); //Volume Up
  myDFPlayer.volumeDown(); //Volume Down

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);

  //----Mp3 control----
//  myDFPlayer.sleep();     //sleep
//  myDFPlayer.reset();     //Reset the module
//  myDFPlayer.enableDAC();  //Enable On-chip DAC
//  myDFPlayer.disableDAC();  //Disable On-chip DAC
//  myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15

  //----Mp3 play----
  //myDFPlayer.playMp3Folder(1); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
  //delay(1000);
  
  //----Read imformation----
  Serial.println(myDFPlayer.readState()); //read mp3 state
  Serial.println(myDFPlayer.readVolume()); //read current volume
  Serial.println(myDFPlayer.readEQ()); //read EQ setting
  Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card
  Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number
  Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03
}

void loop()
{
    delay(1000);
    Serial.println("SUENA BEEP");
    myDFPlayer.playMp3Folder(1); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535)
    delay(14000);
    Serial.println("SUENA BOMBA");
    myDFPlayer.playMp3Folder(2);  //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255)
    delay(7000);
}

type or paste code here

Estoy usando un Mega2560 con estas conexiones

aunque lo que quiero implementar si se puede es esto....

El resto de sensores funcionan correctamente...... el teclado del telefono, el sensor de peso, etc..... pero los dos DFPlayer no lo consigo

Este es el código completo del proyecto..... Como veis he intentado hacer de todo, pero no va

#include "Arduino.h"
#include "HX711.h"
#include <Keypad.h>
#include "DFRobotDFPlayerMini.h"
//#include "DFRobotDFPlayerMini2.h"
#include "SoftwareSerial.h"

// Parámetro para calibrar el peso y el sensor
#define CALIBRACION -1440
 
const byte rowsCount = 4;
const byte columsCount = 3;
const byte rowPins[rowsCount] = { 41, 39, 37, 35 };
const byte columnPins[columsCount] = { 29, 31, 33 };
 
int ledRojo=12;    // pin para el LED rojo
int luzpolicia=14;    
int interruptor=9;
char numeroTelefono[10] = {'9', '1', '4', '6', '2', '5', '5', '2', '0', '7'};
char myDial[10];

int posicion=0;    // necesaria para la clave
int cursor=0;      // posicion inicial de la clave
int clave=0;       // para el LCD
int value=0;       // para interruptor
int correcto=0;
int peso=0;                   // Lectura peso
bool pesocorrecto=false;
bool timbre=false;


// millis
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;

// Pin de datos y de reloj
byte pinData = 22;
byte pinClk = 24;

// Objeto HX711
HX711 balanza;

//DFPlayer 1 AURICULAR TELEFONO
SoftwareSerial myAuricular(10, 11); // RX, TX
DFRobotDFPlayerMini mySonidoAuricular;

//DFPlayer 1 ALTAVOZ 
SoftwareSerial myAltavoz(5, 6); // RX, TX
DFRobotDFPlayerMini mySonidoAltavoz;
void printDetail(uint8_t type, int value);

char keys[rowsCount][columsCount] = {
   { '1','2','3', },
   { '4','5','6', },
   { '7','8','9', },
   { '#','0','*', }
};
 
// teclado
Keypad keypad = Keypad(makeKeymap(keys), rowPins, columnPins, rowsCount, columsCount);


 
void setup() {
  
  Serial.begin(9600);
  Serial.println(F("Comunicación Serial arrancada"));
      
  
  // Iniciar sensor
  balanza.begin(pinData, pinClk);
  // Aplicar la calibración
  balanza.set_scale(CALIBRACION);
  // Iniciar la tara
  // No tiene que haber nada sobre el peso
  balanza.tare();
    
  // Iniciar DFPlayer 1
  myAuricular.begin(9600);
  myAuricular.listen();
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer AURICULAR... (May take 3~5 seconds)"));
  if (!mySonidoAuricular.begin(myAuricular)) 
  {  //Use softwareSerial to communicate with mp3.
      Serial.println(F("Unable to begin:"));
      Serial.println(F("1.Please recheck the connection!"));
      Serial.println(F("2.Please insert the SD card!"));
      while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  mySonidoAuricular.setTimeOut(500); //Set serial communictaion time out 500ms
  //----Set volume----
  mySonidoAuricular.volume(15);  //Set volume value (0~30).
  mySonidoAuricular.volumeUp(); //Volume Up
  mySonidoAuricular.volumeDown(); //Volume Down
  //----Set different EQ----
  mySonidoAuricular.EQ(DFPLAYER_EQ_NORMAL);
  mySonidoAuricular.outputDevice(DFPLAYER_DEVICE_SD);
  //----Read imformation----
  Serial.println(mySonidoAuricular.readState()); //read mp3 state
  Serial.println(mySonidoAuricular.readVolume()); //read current volume
  Serial.println(mySonidoAuricular.readEQ()); //read EQ setting
  Serial.println(mySonidoAuricular.readFileCounts()); //read all file counts in SD card
  Serial.println(mySonidoAuricular.readCurrentFileNumber()); //read current play file number
  Serial.println(mySonidoAuricular.readFileCountsInFolder(1)); //read fill counts in folder SD:/03
  delay(1000);

  // Iniciar DFPlayer 2
  myAltavoz.begin(9600);
  myAltavoz.listen();
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ALTAVOZ... (May take 3~5 seconds)"));
  if (!mySonidoAuricular.begin(myAltavoz)) 
  {  //Use softwareSerial to communicate with mp3.
      Serial.println(F("Unable to begin:"));
      Serial.println(F("1.Please recheck the connection!"));
      Serial.println(F("2.Please insert the SD card!"));
      while(true);
  }
  Serial.println(F("DFPlayer Mini online."));
  mySonidoAltavoz.setTimeOut(500); //Set serial communictaion time out 500ms
  //----Set volume----
  mySonidoAltavoz.volume(25);  //Set volume value (0~30).
  mySonidoAltavoz.volumeUp(); //Volume Up
  mySonidoAltavoz.volumeDown(); //Volume Down
  //----Set different EQ----
  mySonidoAltavoz.EQ(DFPLAYER_EQ_NORMAL);
  mySonidoAltavoz.outputDevice(DFPLAYER_DEVICE_SD);
  //----Read imformation----
  Serial.println(mySonidoAltavoz.readState()); //read mp3 state
  Serial.println(mySonidoAltavoz.readVolume()); //read current volume
  Serial.println(mySonidoAltavoz.readEQ()); //read EQ setting
  Serial.println(mySonidoAltavoz.readFileCounts()); //read all file counts in SD card
  Serial.println(mySonidoAltavoz.readCurrentFileNumber()); //read current play file number
  Serial.println(mySonidoAltavoz.readFileCountsInFolder(1)); //read fill counts in folder SD:/03
  delay(1000);

  pinMode (ledRojo, OUTPUT);
  //pinMode (luzpolicia, OUTPUT);
  //digitalWrite(luzpolicia, LOW);
  pinMode (interruptor, INPUT_PULLUP);

}
 
void loop() {
 
  Serial.print("[HX7] Leyendo: ");
  peso=balanza.get_units(20);
  Serial.print("PESO: ");
  Serial.print(peso);
  Serial.print(" gr");
  Serial.println();

  // Comprobar si el peso es correcto
  if ((peso>10) && (peso<20) || pesocorrecto) 
  {
    Serial.println("PESO CORRECTO FALSO");
    pesocorrecto=true;
    Serial.println("PESO CORRECTO...");
    int value = digitalRead(interruptor);  //lectura digital de pin
    // Comprobar si el led rojo esta encendido (descolgado)
    if ((value == LOW) && timbre) 
    {
      mySonidoAuricular.playMp3Folder(4); //Locución al cojer telefono tras timbre
      delay(7000);
      //mySonidoAltavoz.playMp3Folder(2); //Altavoz Policia
      //Encender sirena policia
      digitalWrite(luzpolicia, HIGH);
      timbre=false;
    }
    if (value == LOW) 
    {
      Serial.println("Auricular descolgado");
      mySonidoAuricular.playMp3Folder(1); //Establecimiento de linea
      //delay(1000);
      digitalWrite(ledRojo, HIGH);
      while (clave == 0)
      {
        // Leemos teclado telefono
        char tecla = keypad.getKey() ; // leemos tecla
        if (tecla != 0) //Si el valor es 0 es que no se ha pulsado ninguna tecla
        { // descartamos almohadilla y asterisco
          if (tecla != '#' && tecla != '*' && clave==0)
           { 
            cursor++;             // incrementamos el cursor
           }
        }  
        // Si el carácter leído coincide con el del código secreto
        if (tecla == numeroTelefono[posicion])
        {
          posicion ++; //Incrementa en 1 la posición del código secreto
        }
        //Si hemos llegado a la posición 10 del código secreto
        if (posicion == 10)
        {
          Serial.println("Numero Telefono correcto");
          mySonidoAuricular.playMp3Folder(2); //numero de telefono correcto
          delay(7000);
          clave=1; // indicamos que se ha introducido la clave
        }
        //--- En el caso de que este incompleta o no hayamos acertado ----------
        if(cursor==10 && clave==0)         // comprobamos que no hemos acertado
        { 
          Serial.println("Numero Telefono incorrecto");
          mySonidoAuricular.playMp3Folder(3); //numero de telefono erroneo
          cursor=0;
          delay(7000);
        }
      }
      
    } else
      {
        Serial.println("Auricular colgado");

        //Auricular colgado
        tiempo1 = millis();
        digitalWrite(ledRojo, LOW);
        Serial.println("Primer Timbre");
        //mySonidoAuricular.playMp3Folder(5); //timbre
        mySonidoAltavoz.playMp3Folder(1); //Timbre telefono
        delay(3000);
        timbre=true;
        tiempo2 = millis();
        if(tiempo2 > (tiempo1+10000))  //Si han pasado 5 segundos desde que se colgó el teléfono
        {
          Serial.println("Siguientes timbres");
          tiempo1 = millis(); //Actualiza el tiempo actual
          mySonidoAltavoz.playMp3Folder(1); //Timbre telefono
          //mySonidoAuricular.playMp3Folder(5); //timbre
          delay(3000);
  
        }
        
        
      }
  }  
}   

Antes de nada perdonad....... Se me ha iluminado el cerebro y ya he conseguido que funcione el DFPlayer usando Serial3 (15 y 14) en el arduino Mega..... estaba obcecado. Ahora funciona bien.

El único problema que tengo es que no puedo hacer que funcionen los dos a la vez...... el segundo (el que va por Serial3, no me inicializa.

Lo que he hecho es comentar esta linea y sustituir MyAltavoz, por Serial3

No tienes que usar SoftwareSerial en el Mega, ya tiene 4 puertos serie hardware.

  • Serial: Transmisión (1) y Recepción (0). Igual que en Uno.
  • Serial1: Transmisión (18) y Recepción (19).
  • Serial2: Transmisión (16) y Recepción (17).
  • Serial3: Transmisión (14) y Recepción (15).

Saludos

Ademas de la acotación de gatul, tu programa se basa en el uso de delays.
No se puede hacer/unir programas complejos donde se encuentre la instrucción delay()
https://forum.arduino.cc/t/procesos-en-paralelo-multihilo-simultaneos-y-otras-yerbas/398842

Ese es el motivo por el cual no puedes hacer dos cosas al mismo

Al margen de lo que te remarca @PeterKantTropus , yo no había caído en cuenta de los delay() que creo son innecesarios pero no me detuve mucho en analizarlo, además mezclar millis() con delay() no es la mejor idea.
Como decía, al margen de eso

if(tiempo2 > (tiempo1+10000)){

no está bien. Lo correcto es

if(tiempo2 - tiempo1 > 10000UL){

de otro modo puede generar problemas.
(UL indica que el literal es unsigned long al igual que tiempo1 y tiempo2)

Saludos

Muchas gracias por las aportaciones. En principio tengo los delays por el motivo de que aun estoy depurando pero ese no es el problema.

Ya lo tengo solucionado.
Por un lado que no estaba usando los Serial por hardware que proporciona el arduino Mega, así tengo ahora un SoftwareSerial con RX:10 y TX:11 y un Serial3 desde los pines 14 y 15.

Funcionan perfectamente los dos DFPlayer. Sólo que tenía un error en el software y no estaba inicializando bien el segundo. Sólo era eso.

Gracias gatul..... era eso!!!

Si, es parte importante del problema.
Si tu vienes con una duda y las personas que saben te hacen mención a algo no digas que NO es el problema. Las responsabilidades son compartidas siempre. Un % por un lado y otro por otro.
Para tener en cuenta.

Te repito, NO uses SoftwareSerial, es un desperdicio de recursos por más que te funcione.

Piénsalo así, tienes un auto con auxilio temporal (la rueda chiquita y el peor invento de la industria automotriz)
¿Vas a guardar una de las 4 ruedas en el baúl y circular toda la vida con el auxilio?
¿No, verdad? Sería ilógico.
Bueno, esto es igual.

Saludos

Agradezco vuestras recomendaciones, las seguiré al pie de la letra.... y gracias por todo

Hola, ¿podrías pasar el programa ya corregido?
No entiendo como has programado TX y RX sin SoftwareSerial
Un saludo

Esta usando un MEGA que tienes 4 puertos Seriales. No necesita SoftwareSerial.
SoftwareSerial se usa en UNO/NANO/PRO Micro, o sea dispositivos que solo tienen un puerto serie hardware.
El Mega tiene 4, el DUE tambien.

¿Y como se programaría el TX y el RX en código?
Siento mucho las molestas, gracias de antemano

Los puertos en el Mega se llaman Serial, Serial1, Serial2 y Serial3.
image

Busca MEGA puerto Serie y verás cuales son.
Defines como defines un puerto serie.

Serial1.begin(9600); 

para definir el puerto Serie1 a 9600 bps en los pines TX 18 y RX 19 no olvides GND
y lo mismo para los demas.

Muchas gracias Surbyte. ¡Me has sido de gran ayuda!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.