DFPlayer initialization problem

I’m having problems getting past initialization with my DFPlayer Mini project.

(I apologize in advance for any vagueness.)

Frustratingly, I had it working - at least it played individual files - but then I changed something trying to play all the files, and it wouldn’t initialize. So then I changed it back (I think!) but I still get can’t past this:

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!
Time Out!

…and the red LED on the player is not coming on, which it was when it was working.

I am using the original DFRobot libraries (not the popular DFPlayer_Fast ones).

I have tried three different Unos (including two brand new R4s), and three different players. The players claim to be HW-247As, but I’m told that claim isn’t always true. And they were working earlier.

So either

  • I’m did something stupid with my wiring
  • I did something stupid with my code that I didn’t change back

Things I’ve tried:

  • checking the wiring many times
  • different h/w (as above)
  • different SD card (in case it failed)
  • going back to “known working” software
  • switching the RX and TX wires in case I confused them

I believe my wiring is:

  • Arduino TX on pin 8 to DFPlayer RX via 1K resistor
  • Arduino RX on pin 9 to DFPlayer TX
  • 3V3 to top left, GND to 2nd from bottom left (between the two SPKR connections).

I tried to take some pics in case that helps. In these:

  • black is GND, white is 3V3
  • Green and Orange are the speaker wires, offstage
  • Yellow is pin 10
  • Purple is pin 11

Any suggestions welcome.

And here’s the code. It is lightly modified from the DFRobot example code.

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

#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266))  // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/8, /*tx =*/9);
#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

  Serial.begin(19200);
  while (!Serial)
    ;

  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!"));

    printDetail(myDFPlayer.readType(), myDFPlayer.read());  //Print the detail message from DFPlayer to handle different errors and states.

    while (true) {
      delay(0);  // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(30);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);     //Play the first mp3

  delay(3000);
}

void loop() {
}

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;
  }
}

SoftwareSerial softSerial(/*rx =*/8, /*tx =*/9);

Your code uses 8 and 9.

Your wiring uses 10 and 11 (or possibly 11 and 10; I couldn't work up the ambition to trace your wiring).

You say you're using 8 and 9. Then you turn around and say you're using 10 and 11.

Nothing is going to work until your code matches your wiring.

1 Like

Photos are almost useless, even if of a higher resolution than yours. We need a carefully drawn schematic (that matches the sketch as @van_der_decken said). Or a simple listing of all connections.

But in code

It seems that you need to swap TX and RX wires..

First, thanks for looking in such detail.

I’ve been going back and forth between 10/11 and 8/9 trying to diagnose the problem (basically out of frustration that nothing rational seemed to be working…) and posted a code snapshot and h/w picture that were out of sync.

I’ll update later (it’s currently 4am in my time zone and nothing I do at this hour is likely to be right.

Thank you to those who responded and I apologize and I apologize for wasting your time. It was option 2, “I did something stupid with my code”

This line


  Serial.begin(19200);

I somehow edited to


  FPSerial.begin(19200);

So I was (a) setting the player serial port to the wrong baud, and (b) not initializing the serial monitor at all. D’Oh.

I am now back to where I was 24 hours ago, able to play all of the sounds on the card, and feeling like an idiot.

Congrats on getting there in the end. Yes, coding at 04:00 (in any time zone) is usually a bad idea!
:slightly_smiling_face: