Problem mit DFPlayer - Anfängerfrage

Hey,
ich würde gerne bei einem Projekt eine MP3 abspielen (sozusagen als Hintergrundmusik). Sobald ich jedoch einen Schalter drücke, soll eine andere MP3 abgespielt werden. Ist diese zu Ende, soll die Hintergrundmusik erneut von vorne abgespielt werden.

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

const int buttonPin = 2;
int buttonState = 0;

SoftwareSerial mySoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  randomSeed(analogRead(0));
  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)) { 
    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); 
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
}

void loop()
{

myDFPlayer.play(1);  
delay(6000);
buttonState = digitalRead(buttonPin);
randNumber = random(2);
  if (buttonState == LOW) {
   
switch(randNumber){  
  case 0: 
  myDFPlayer.stop();
  myDFPlayer.play(2);  
  delay  (1500);
  break;

  case 1: 
  myDFPlayer.stop();
  myDFPlayer.play(3);  
  delay  (1500);
    
  break;
}

  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
 //   myDFPlayer.next();  //Play next mp3 eve 
  }
  
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); 
}
else {
myDFPlayer.stop();
}
}
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;
  }
}

Leider funktioniert nur das eine oder das andere. Sprich ich kann zwar die MP3 abspielen, dann hat der Schalter aber keine Funktion. Oder aber ich lasse die "Hintergrund-MP3" weg, dann funktioniert der Schalter und es wird mal die eine mal die andere MP3 abgespielt.
Könnt ihr mir evtl. weiterhelfen? Gibt es eine Lösung für das Problem?

Hallo,

das ist ein altes und bekanntes Problem mit delay().

Entferne die delays und setze statt dessen eine Funktion mit millis ein.
Sieh dir dazu BlinkWithoutDelay in den Beispielen der IDE an.

(deleted)

Danke erstmal für eure Antworten!! Ich habe gestern bereits etwas rumprobiert, komme da aber leider nicht ganz klar.
Die MP3 wird in diesem Fall gar nicht abgespielt. Ich dachte auch, dass der Player ohne delay() nicht funktioniert.
Könnt ihr mir evtl. für einen Fall in meinem Code ein Beispiel geben?

(deleted)

Rootrocker:
Die MP3 wird in diesem Fall gar nicht abgespielt. Ich dachte auch, dass der Player ohne delay() nicht funktioniert.
Könnt ihr mir evtl. für einen Fall in meinem Code ein Beispiel geben?

Das Abspielen von MP3 hat auf dem DFPlayer mit delays nix zu tun.
Delay legen deinen Controller schlafen, da macht dieser nix weiter.

Dein Sketch muss nur entsprechend sauber ohne die aufgebaut werden und ein Beispiel hatte ich dir in Post#1 schon genannt.
Da solltest du mit anfangen, lesen und verstehen.

Rootrocker:
Ich dachte auch, dass der Player ohne delay() nicht funktioniert.

Wenn Du BUSY vom Player auswertest, kannst Du das Dateiende erkennen und im Programm darauf reagieren. Zeiten sind da überflüssig, möglicherweise suchst Du aber nach einer Schrittkette (=endlicher Automat, =finite state machine). Also erst dies, dann das, dann jenes.

Das Zauberwort heisst : Advert
Das Modul bietet eine Einblendfunktion, wobei die Hintergrundmusik bei der Einspielung eines Adv. unterbrochen wird.
Dabei müssen die MP3 Files in den entsprechenden Ordner abgelegt werden:
(Card)/MP3/00xx.mp3 - Files für Hintergrund
(Card)/ADVERT/00xx.mp3 - Files für Einblendungen

Im Code unter Setup():

myDFPlayer.playMp3FolderTrack(1);    // Spielt Hintergrundmusik Track 0001.mp3 aus Ordner "MP3"

Im Code unter Loop() bei entsprechendem Event:

myDFPlayer.advertise(3);      // Spielt Einblendmusik Track 0003.mp3 aus Ordner "ADVERT"

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