DfPlayerMini issue

Hello everyone! I am trying to play with a project that connect a LED matrix, an LCD screen, and dfplayer mini, but I just couldn't make the 3rd song play. So I reverted to a test code:

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

//  Use pins 2 and 3 to communicate with DFPlayer Mini
static const uint8_t PIN_MP3_TX = 2;  // Connects to module's RX
static const uint8_t PIN_MP3_RX = 3;  // Connects  to module's TX
SoftwareSerial softwareSerial(PIN_MP3_RX, PIN_MP3_TX);

//  Create the Player object
DFRobotDFPlayerMini player;

void setup() {

  // Init USB serial port for debugging
  Serial.begin(9600);
  // Init serial  port for DFPlayer Mini
  softwareSerial.begin(9600);

  // Start communication  with DFPlayer Mini
  if (player.begin(softwareSerial)) {
    Serial.println("OK");

    // Set volume to maximum (0 to 30).
    player.volume(30);
    // Play  the first MP3 file on the SD card
    player.play(2);
  } else {
    Serial.println("Connecting  to DFPlayer Mini failed!");
  }
}

void loop() {
}

I have 3 songs in the SD, named 001.mp3, 002.mp3, 003.mp3. The first two play the third does not.
I tried with multiple songs, and I even changed the name to 004.mp3 and coded play(4), in case that helped, but to no avail.
Anyone has any guess?

Welcome to the forum

Are you sure that you have posted the correct sketch because as posted it will not compile

Why do you use this slashes \ in the uint8_t type and variable names?

I have no idea why that is there.
Probably fucked something up when I uploaded to the forum.
My code doesn't have the slashes.

Please upload it again

In my experience this is the easiest way to tidy up the code and add the code tags

Start by tidying up your code by using Tools/Auto Format in the IDE to make it easier to read. Then use Edit/Copy for Forum and paste what was copied in a new reply. Code tags will have been added to the code to make it easy to read in the forum thus making it easier to provide help.

Thanks mate. Just did that.
The thing is that there is no issue with the code (99% sure), since I have played with it on other projects as well.
The issue is when I try to play a song named 003.mp3 or higher (e.g. 004.mp3).

A dude from Reddit sent me this: DFPlayerMini cheat sheet
I'll check it now.

I think

    // Play  the first MP3 file on the SD card
    player.play(2);

plays the second song on the card.

from the DFPlayer page in their example, it reads

 myDFPlayer.play(1);  //Play the first mp3

source:
https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299#target_1

No no I know that :sweat_smile:.
Just left it like that cause I was testing. The issue comes when I have player.play(3), and I want to... you know.. play 003.mp3, but it does not work.
I also tried player.play(4) and had a 004.mp3, but still

Is the mp3 in question one of the acceptable sample rates? And the sketch you included is your example sketch? What about this one:

/***************************************************
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 =*/D3, /*tx =*/D2);
#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;
  }
  
}

With this code, it pops here:

Also, I just changed the name of the working 002.mp3 to 003.mp3 and didn't work.
So the track isn't the issue.

Copy the working 0002.mp3 five times and name the copies with different mp3 names. Than try to play player.play(3) and player.play(4)

" NOTE : The folder name needs to be mp3, placed under the SD card root directory, and the mp3 file name needs to be 4 digits, for example, "0001.mp3", placed under the mp3 folder. If you want to name it you can add it after the number, for example, "0001hello.mp3""

I think you need to add another zero to your file names

IT WORKS!
I did the format of bro here: DFPlayerMini cheat sheet
mentions.
And now we are golden people!
Thanks for the support!

The DFPlayerMini page and "wiki" have confusing information.

  • Their wiring drawing and their code do not match.
  • The diagram shows Rx/Tx as 11/10 (Uno/Nano) but their two example sketches show pins 5/4.
  • The reference of Rx/Tx is according to the DFPlayerMini, not the microcontroller (11 goes to DF RX)
  • The #ifdef/#else for SoftwareSerial creates a "not declared in this scope" with a Nano, needing defined(ARDUINO_AVR_NANO)
  • I like this blog page for all the right information: https://www.dfrobot.com/blog-277.html
  • definitely need external power (the web site is using Arduino power)