DFPlayer wiederholt immer einen Track, spingt nicht zum nächsten Track

Servus zusammen,
ich bin absoluter Neuling was den Arduino anbelangt. Möchte mir in eine AC/DC Hells Bell die ich gedruckt habe einen Arduino Nano V3.0 samt DFPlayer einbauen damit die Glocke brav das Back In Black Album spielt.

Der Sketch dafür habe ich von Musik mit dem MP3 Player Modul abspielen | projekt von az-delivery.de – AZ-Delivery genommen. Ist zwar eigentlich für den Arduino Uno, funktioniert aber auch auf dem Arduino Nano V3. Ich habe einfach um rauszufinden wie es geht noch etwas Code eingebaut um einen play/pause Taster anzuschließen (größtenteils aus dem Buch "Getting started wirh Arduino" abgekupfert). Das funktioniert so weit auch alles ganz gut. Aber der DFPlayer spielt mir so immer nur ein Lied ab. Also er wiederholt ständig das selbe Lied. Wenn ich (via Taster direkt am DFPlayer angeschlossen) zum nächsten Track spinge wird dieser abgespielt und dann dauerhaft wiederholt. Wunsch wäre natürlich das ein Track nach dem anderen automatisch abgespielt wird.

Hier der Sketch:

/* 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 "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  pinMode(BUTTON, INPUT);
  mySoftwareSerial.begin(9600);
  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(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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(15);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}


void loop(){
  val = digitalRead(BUTTON); // read input value and store it
  // yum, fresh
  // check if there was a transition
  delay(100);
  if ((val == HIGH) && (old_val == LOW)){
  state = 1 - state;
  delay(10);
}
  old_val = val; // val is now old, let’s store it
  if (state == 1) {
  myDFPlayer.pause();
  } else {
  myDFPlayer.start();

}
/*
  if (val == HIGH) {
  myDFPlayer.next();  //Play next mp3 eve 
  }
*/  
  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;
  }
}

Das Ganze soll dann im weiteren Verlauf noch um einen MPU-6050 erweitert werden damit play/pause durch "läuten" der Glocke geschaltet werden kann. Und evtl auch noch ein paar RGB-LED´s via 74HC595 Schieberegister die dann bestenfalls auch noch zum Takt der Musik blinken. Aber da habe ich noch nicht den geringsten Schimmer wie ich das umsetzen kann. Momentan scheitert es ja schon an solchen Kleinigkeiten wie das automatische Weiterschalten zum nächsten Track.

Ich hoffe ihr könnt mir da ein bisschen auf die Sprünge helfen. Vielen Dank schon mal. Schöne Grüße,
Nocki

Willkommen im Forum!

nocki:
Wunsch wäre natürlich das ein Track nach dem anderen automatisch abgespielt wird.

Die Library für den DFPlayer bietet verschiedene Funktionen. Ein paar hast du schon verwendet zum Beispiel pause() und start(). Welche es gibt, kannst du den Beispielen für den DFPlayer entnehmen (z.B. hier: DFRobotDFPlayerMini/examples/FullFunction/FullFunction.ino at master · DFRobot/DFRobotDFPlayerMini · GitHub), oder indem du den Inhalt von DFRobotDFPlayerMini.h studierst.

Zum Abspielen aller Tracks nacheinander gibt es die Funktion enableLoopAll(). Dazu musst du diese Funktione einmalig aufrufen. Konkret könntest du dazu z.B. folgende Zeile fast am Ende von Setup einfügen:

myDFPlayer.enableLoopAll();

So, dass die letzten Zeilen von Setup dann so aussehen:

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

Als Alternative zur "originalen" Library zum DFPlayer gibt es die Library "DFPlayerMini_Fast" von PowerBroker2, der im englischsprachigen Teil des Arduino-Forums recht aktiv ist. Diese Library kannst du über den Library-Manager herunterladen (suchen nach DFPlayerMini_Fast) oder hier: GitHub - PowerBroker2/DFPlayerMini_Fast: Fast and easy to understand Arduino library to use the DFPlayer Mini MP3 module from DFRobot.com. This is a huge improvement (both in terms of execution speed and simplicity) to the standard library provided by DFRobot.com..
Diese Library soll besser funktionieren als die originale :slight_smile:

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