Hey there, I got this dfr mp3 player modul, installed the dfrobot library, but can't get it to work. I just want it to play a music track with my arduino nano. Could someone help me pls? I wanted to make a small music box with it and it should actually be a christmas present. Now nothing works as it should.
if (!myDFPlayer.begin(mySerial)) {
Serial.println(F("Kann DFPlayer nicht initialisieren:"));
Serial.println(F("1. Überprüfe die Verbindung!"));
Serial.println(F("2. Überprüfe die SD Karte!"));
while (true);
}
Serial.println(F("DFPlayer initialisiert."));
myDFPlayer.volume(30); // Lautstärke setzen (Bereich: 0-30)
myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); // EQ-Modus auf Normal setzen
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); // Ausgang auf SD-Karte setzen
}
void loop() {
static unsigned long timer = 0;
// Alle 5 Sekunden eine Datei abspielen
if (millis() - timer > 5000) {
timer = millis();
myDFPlayer.play(1); // Datei 0001.mp3 abspielen
Serial.println(F("Spiele Datei 0001.mp3"));
}
// Verfügbare Informationen vom DFPlayer prüfen
while (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read());
}
}
void printDetail(uint8_t type, int value) {
switch (type) {
case TimeOut:
Serial.println(F("Zeitüberschreitung!"));
break;
case DFPlayerPlayFinished:
Serial.print(F("Abgespielt: "));
Serial.print(value);
Serial.println(F(" Lied beendet."));
break;
case DFPlayerCardInserted:
Serial.println(F("SD Karte eingesteckt!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("SD Karte entfernt!"));
break;
case DFPlayerCardOnline:
Serial.println(F("SD Karte Online!"));
break;
case WrongStack:
Serial.println(F("Falscher Stack!"));
break;
default:
Serial.println(F("Unbekannter Typ."));
break;
}
}`
can you give a link to the specific DFRplayer?
how have you connected the DFRplay to the nano?
it is possible the Nano may not have sufficient power to drive the player
I have connected the Nano to my laptop currently to look at the serial monitor. I don't know how to connect it otherwise (other than to a plug but then I can't check the errors )
#ifndef MP3TF16P_H
#define MP3TF16P_H
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define MP3_ERROR_ONLY 1
#define MP3_ALL_MESSAGE 2
class MP3Player
{
private:
SoftwareSerial *mySoftwareSerial; // SoftwareSerial für die Kommunikation mit dem MP3-Modul
void statusOnSerial(uint8_t type, int value);
void waitPlayIsTerminated(void);
int p_RX; // Empfangspin
int p_TX; // Sendepin
public:
DFRobotDFPlayerMini player; // Instanz des DFPlayer
MP3Player(int RX, int TX); // Konstruktor
~MP3Player(); // Destruktor
void playTrackNumber(int trackNumber, int volume, boolean waitPlayTerminated = true);
boolean playCompleted(void);
void initialize(void);
int serialPrintStatus(int errorOnly);
SoftwareSerial* getSoftwareSerial(); // Methode für Zugriff auf mySoftwareSerial
};
// Konstruktor: Initialisiert die RX- und TX-Pins
MP3Player::MP3Player(int RX, int TX)
{
p_TX = TX;
p_RX = RX;
}
// Destruktor: Bereinigt Ressourcen (falls erforderlich)
MP3Player::~MP3Player()
{
}
// Initialisierung des MP3-Players
void MP3Player::initialize(void)
{
mySoftwareSerial = new SoftwareSerial(p_RX, p_TX); // Erstelle SoftwareSerial-Instanz
mySoftwareSerial->begin(9600); // Baudrate für die Kommunikation
Serial.println(F("Initializing MP3Player ..."));
// Starte den MP3-Player
if (!player.begin(*mySoftwareSerial, true, false)) // Beginne Kommunikation mit Modul
{
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)
; // Endlosschleife bei Fehler
}
player.volume(10); // Setzt die Lautstärke (Skala: 0-30)
Serial.println(F("MP3Player online."));
}
// Zugriffsmethode für mySoftwareSerial
SoftwareSerial* MP3Player::getSoftwareSerial()
{
return mySoftwareSerial;
}
// Spielt eine Datei basierend auf der Track-Nummer und Lautstärke
void MP3Player::playTrackNumber(int trackNumber, int volume, boolean waitPlayTerminated)
{
player.volume(volume); // Setze Lautstärke
player.play(trackNumber); // Spiele Datei mit angegebener Nummer
if (waitPlayTerminated)
{
waitPlayIsTerminated(); // Warte, bis Track beendet ist
}
}
// Wartet, bis das Abspielen des Tracks beendet ist
void MP3Player::waitPlayIsTerminated(void)
{
while (!playCompleted())
{
// Warte passiv
}
}
// Prüft, ob das Abspielen abgeschlossen ist
boolean MP3Player::playCompleted(void)
{
if (player.available())
{
return player.readType() == DFPlayerPlayFinished; // Rückmeldung: Track beendet
}
return false;
}
// Gibt Statusmeldungen des MP3-Moduls auf der seriellen Schnittstelle aus
int MP3Player::serialPrintStatus(int verbose)
{
if (player.available())
{
uint8_t type = player.readType(); // Typ der Nachricht
int value = player.read(); // Wert der Nachricht
if (verbose == MP3_ERROR_ONLY)
{
if (type == DFPlayerError)
{
statusOnSerial(type, value);
}
}
else
{
statusOnSerial(type, value);
}
if (type == DFPlayerError)
{
return value; // Fehlercode zurückgeben
}
else
{
return 0; // Kein Fehler
}
}
return 0; // Standard-Rückgabe
}
// Gibt detaillierte Fehlermeldungen auf der seriellen Konsole aus
void MP3Player::statusOnSerial(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 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:
Serial.println(F("Unknown Error"));
break;
}
break;
default:
Serial.println(F("Unknown Message Type"));
break;
}
}
#endif // MP3TF16P_H
Hope the code is more readable now. I changed it to this code now. Not on my own though, used ChatGPT for this because I'm desperate now and can't figure it out anymore.
// Arduino Nano Classic DFRobotDFPlayer player
// **** Once the card is formatted, MP3 files can be copied to it.
// **** They are played in the order in which they were copied to the card
// names make no difference
#include "Arduino.h"
#include <AltSoftSerial.h>
#include "DFRobotDFPlayerMini.h"
// Nano connections
// Nano VIN (5V) to DFPlayer VCC
// Nano GND to DFPlayer GND
// Nano pin 8 RX to DFPlayer TX
// Nano pin 9 TX to DFPlayer RX
// Nano pin 4 to DFPlayer BUSY
AltSoftSerial mySoftwareSerial(8, 9); // nano RX, TX
#define BUSY 4
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
void setup() {
pinMode(4, INPUT_PULLUP); // GPIO 4 is Busy signal
mySoftwareSerial.begin(9600);
Serial.begin(115200);
delay(3000);
Serial.println();
Serial.println(F("\nNano 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.volume(25); //Set volume value. From 0 to 30
//myDFPlayer.play(1); //Play the first mp3
delay(10);
Serial.println("enter track to play (1, 2, 3, etc)");
}
void loop() {
static unsigned long timer = millis();
static int busy = -1;
// check if player Busy status has changed
if (digitalRead(BUSY) != busy) {
if ((busy = digitalRead(BUSY)))
Serial.println("busy " + String(busy) + " NOT playing");
else
Serial.println("busy " + String(busy) + " playing");
;
}
if (millis() - timer > 3000) {
timer = millis();
//myDFPlayer.next(); //Play next mp3 every 3 second.
}
// if new track entered play it
if (Serial.available()) {
int x = Serial.parseInt();
Serial.println("playing " + String(x));
myDFPlayer.play(x);
while (Serial.available()) Serial.read();
delay(10);
}
// if player status changed display
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 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;
}
}
serial monitor output (I press 1 then 2 then 3 to play tracks 1 etc)
Nano DFRobot DFPlayer Mini Demo
Initializing DFPlayer ... (May take 3~5 seconds)
DFPlayer Mini online.
enter track to play (1, 2, 3, etc)
busy 1 NOT playing
playing 1
busy 0 playing
playing 2
busy 1 NOT playing
busy 0 playing
playing 3
busy 1 NOT playing
busy 0 playing
it says this `C:\Users\jeann\Documents\Arduino\mp3try\mp3try.ino:8:10: fatal error: AltSoftSerial.h: No such file or directory #include <AltSoftSerial.h>
^~~~~~~~~~~~~~~~~
compilation terminated.
exit status 1
Compilation error: AltSoftSerial.h: No such file or directory`
Is it because I have this other mp3tf16p.h in my sketch folder with code? this currently. Should I remove it? Verwende dieses Symbol um Code zu posten
#ifndef MP3TF16P_H
#define MP3TF16P_H
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#define MP3_ERROR_ONLY 1
#define MP3_ALL_MESSAGE 2
class MP3Player
{
private:
SoftwareSerial *mySoftwareSerial; // SoftwareSerial für die Kommunikation mit dem MP3-Modul
void statusOnSerial(uint8_t type, int value);
void waitPlayIsTerminated(void);
int p_RX; // Empfangspin
int p_TX; // Sendepin
public:
DFRobotDFPlayerMini player; // Instanz des DFPlayer
MP3Player(int RX, int TX); // Konstruktor
~MP3Player(); // Destruktor
void playTrackNumber(int trackNumber, int volume, boolean waitPlayTerminated = true);
boolean playCompleted(void);
void initialize(void);
int serialPrintStatus(int errorOnly);
SoftwareSerial* getSoftwareSerial(); // Methode für Zugriff auf mySoftwareSerial
};
// Konstruktor: Initialisiert die RX- und TX-Pins
MP3Player::MP3Player(int RX, int TX)
{
p_TX = TX;
p_RX = RX;
}
// Destruktor: Bereinigt Ressourcen (falls erforderlich)
MP3Player::~MP3Player()
{
}
// Initialisierung des MP3-Players
void MP3Player::initialize(void)
{
mySoftwareSerial = new SoftwareSerial(p_RX, p_TX); // Erstelle SoftwareSerial-Instanz
mySoftwareSerial->begin(9600); // Baudrate für die Kommunikation
Serial.println(F("Initializing MP3Player ..."));
// Starte den MP3-Player
if (!player.begin(*mySoftwareSerial, true, false)) // Beginne Kommunikation mit Modul
{
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)
; // Endlosschleife bei Fehler
}
player.volume(10); // Setzt die Lautstärke (Skala: 0-30)
Serial.println(F("MP3Player online."));
}
// Zugriffsmethode für mySoftwareSerial
SoftwareSerial* MP3Player::getSoftwareSerial()
{
return mySoftwareSerial;
}
// Spielt eine Datei basierend auf der Track-Nummer und Lautstärke
void MP3Player::playTrackNumber(int trackNumber, int volume, boolean waitPlayTerminated)
{
Serial.print(F("Setting volume to "));
Serial.println(volume);
player.volume(volume); // Setze Lautstärke
Serial.print(F("Playing track number: "));
Serial.println(trackNumber);
player.play(trackNumber); // Spiele Datei mit angegebener Nummer
if (waitPlayTerminated)
{
waitPlayIsTerminated(); // Warte, bis Track beendet ist
}
}
// Wartet, bis das Abspielen des Tracks beendet ist
void MP3Player::waitPlayIsTerminated(void)
{
Serial.println(F("Waiting for track to finish..."));
while (!playCompleted())
{
// Warte passiv
}
Serial.println(F("Track finished."));
}
// Prüft, ob das Abspielen abgeschlossen ist
boolean MP3Player::playCompleted(void)
{
if (player.available())
{
return player.readType() == DFPlayerPlayFinished; // Rückmeldung: Track beendet
}
return false;
}
// Gibt Statusmeldungen des MP3-Moduls auf der seriellen Schnittstelle aus
int MP3Player::serialPrintStatus(int verbose)
{
if (player.available())
{
uint8_t type = player.readType(); // Typ der Nachricht
int value = player.read(); // Wert der Nachricht
if (verbose == MP3_ERROR_ONLY)
{
if (type == DFPlayerError)
{
statusOnSerial(type, value);
}
}
else
{
statusOnSerial(type, value);
}
if (type == DFPlayerError)
{
return value; // Fehlercode zurückgeben
}
else
{
return 0; // Kein Fehler
}
}
return 0; // Standard-Rückgabe
}
// Gibt detaillierte Fehlermeldungen auf der seriellen Konsole aus
void MP3Player::statusOnSerial(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 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:
Serial.println(F("Unknown Error"));
break;
}
break;
default:
Serial.println(F("Unknown Message Type"));
break;
}
}
#endif // MP3TF16P_H
No, I don't have sth like this. In order to work it should light up, right? The Led on the mp3 mini. It never did so far. The RX sometimes lit up/blinked for a few seconds but that's it . Nothing else. And the result would be a song playing through the speakers. That's all I want