Need help with DF Player Mini (MP3 Player) using ESP32

hey guys , i ve been trying to communicate with a dfplayer mini with an esp32, to play an alarm sound .. i ve not been very succesfull in communicating with it .

i always encounter this error .

DFRobot DFPlayer Mini Demo
Initializing DFPlayer ... (May take 3~5 seconds)
Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!

here is my code which is the gettingstarted code of dfplayer library

/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/product-1121.html>
 
 ***************************************************
 This example shows the basic function of library for DFPlayer.
 
 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)
 
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))   // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
#if (defined ESP32)
  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/3, /*tx =*/1);
#else
  FPSerial.begin(9600);
#endif

  Serial.begin(115200);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial 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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
  
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
  
}

and here are my connections !

Any insights will be appreciated . thanks

i do not have the same board in the picture , i have a 38 pin one , so the pins are adjusted accordingly .

You ESP32 has multiple hardware serial ports so don't use software serial
have you checked that your module is 3.3V compatible?

i have used "Serial2",same error .
yes dfplayer mini is powered by 5v and the serial communication is 3.3v .As directed by tutorials online.

I have the same module and it works without problems with 3.3V.

It's important also add the resistor on the RX in order to avoid noise and humming

With Esp32?
i was told there is no need for resistor with esp32 because it operates in 3.3v.
can you please share wirings? and code?

how did you initialise that?

It's not mandatory, but I've experienced noise without resistor on some of my projects

Wirings it's very simple... add a 1K resistor attached to RX pin

  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);

replacing FPSerial with Serial2

also FPSerial is defined as


#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))   // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/4, /*tx =*/5);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif

DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
#if (defined ESP32)
  FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
  FPSerial.begin(9600);
#endif

This is For arduino which operates with 5v,
i have an Esp32 which operates with 3.3v, thats why didnt add a resistor .

softwareSerial is only used when board is arrduino .
i have esp32. it should use Serial1 in default , and Serial2 with my modification.

As already stated, I had noise on ESP32 projects

If when you manage to make it work there is no noise, the problem does not arise in your case

i ll try with your mod .
does not adding a resistor also results in the error i am getting?

aren't Serial2 pins 16 (Rx2) and 17 (Tx2)?

#define RXD2 16
#define TXD2 17

void setup() {
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2);
•••

No, it's not related to the communication error.

Try to use the default Serial2 pins or some others. Maybe D2 and D3 is already connected to some others things? Built-led for example

as i described in the orignal post . i am using an esp32 board with 38 pins .
so the Tx and rx pins are 3 and 1 .
i gave you an example code .

for reference ..

You're making a mess with gpios.
Pins 3 and 1 are connected to the USB/TTL converter and you cannot use (the CP2102 IC will set the level on those pins, at least as regards the RX pin).

With the highlighted instruction, as have already pointed out from @J-M-L , you are redirecting the pins of Serial2 to D2 and D3
The default ones for Serial2 are 16 and 17, but with ESP32 you can freely re-assign to almost any of the available pins.

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