Blink LED während MP3 abspielt

Hallo,

also irgendwie bekomme ich es nicht hin, dass eine LED auf PIN 32 blinkt, während ein MP3 mit dem DFPlayerMini abspielt. Was mache ich falsch?
Momentan spielt die MP3, danach geht die LED an, dann spielt wieder die MP3, dann geht die LED aus, dann spielt die MP3, dann geht sie wieder an....usw
(als Hintergrundinfo: durch digitalWrite(powerLatch, LOW); nach abspielen der MP3 wird dann normalerweise der Strom abgeschaltet, da es sich um eine Klingel handelt. )
Ich bekomme es einfach nicht hin, dass die LED WÄHREND die MP3 abgespielt wird, blinkt.

#include <DFPlayer_Mini_Mp3.h>
#include <SoftwareSerial.h>
const int powerLatch = 4; 
// ledPin refers to ESP32 GPIO 32
const int ledPin = 32;
int ledState = LOW; 
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 100;           // interval at which to blink (milliseconds)

SoftwareSerial mp3Serial(16,17); // RX, TX

void setup() {
   // Define pin as an OUTPUT
  // initialize digital pin ledPin as an output.
  pinMode(ledPin, OUTPUT);
    // initialize digital pin powerlatch as an output.
  pinMode(powerLatch, OUTPUT); 
  digitalWrite(powerLatch, HIGH);
  Serial.begin(9600);
  Serial.setTimeout(2000);
  
  Serial.println("Setting up software serial");
  mp3Serial.begin (9600);
  Serial.println("Setting up mp3 player");
  mp3_set_serial (mp3Serial);  
  // Delay is required before accessing player. From my experience it's ~1 sec
  delay(1000); 
  mp3_set_volume (25);
  // Wait for serial to initialize.
  while(!Serial) { }
  
  



}

void mp3player () {
  Serial.println("Stop");
  mp3_stop ();
  delay(500);
  
  Serial.println("play next");
  mp3_next ();
  delay (12000);
  Serial.println("Stop");
  mp3_stop ();
  

  Serial.println("switch off in 5 seconds");
  delay(3000);
  digitalWrite(powerLatch, LOW);
}

void loop() {

unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
      mp3player();


}

crazysky:
Was mache ich falsch?

Du verwendest das blockierende delay.

Lösung dürfte eine Schrittkette (=endlicher Automat, =finite state machine) in mp3player sein.

Hallo,
du musst die delay aus deiner funktion mp3player rausnehmen. Die Zeit für das mp3_next() musst Du ebenfalls mit millis() machen damit der loop ständig durchlaufen wird. Wie soll die LED denn blinken wenn Du in deiner function 12s in einem delay festhängst.

Heinz

Der Grund deines Fehlers wurde ja schon genannt.
Dann noch ein Tipp:
Schreibe eine Funktion in der die Led ständig blinkt mithilfe des Beispiels "BlinkWithoutDelay" und starte diese Funktion wenn du den Player startest. Ist der Player aus, musst du diese Funktion wieder stoppen.

Du verwendest das blockierende delay.
Lösung dürfte eine Schrittkette (=endlicher Automat, =finite state machine) in mp3player sein.

Kannst du außerdem den mp3player abfragen, ob er sein aktuelles Stück noch spielt oder damit fertig ist?
Wenn ja, könntest du das gut verwenden, statt einfach 12 sec zu warten.

Dein <DFPlayer_Mini_Mp3.h> ist vermutlich diese: github.com/DFRobot/DFPlayer-Mini-mp3 Da steht übrigens "Deprecated" dran...

Die Library von PowerBroker2 (hier aus dem engl. Forum) für den DFPlayer ist zu empfehlen.

Da gibt es "isPlaying();". Damit kann man abfragen, ob gerade ein Track spielt.

Alternativ: Den Pin "BUSY" des DFPlayers abfragen (LOW: Track spielt gerade. HIGH: spielt nicht). Das würde ich empfehlen.

Danke an alle, ich habe es jetzt mit der DFPlayerMini_Fast library gelöst. zwar nicht mit "isPlaying();". Das funktionierte zwar prinzipiell auch aber irgendwie war der Sound da schlecht. Es hörte sich so an, als ob bei jedem Schleifendurchlauf (also in sehr schneller Abfolge) ein kurzes Knacken generiert werden würde.
Daher habe ich jetzt einen etwas unkonventionellen Sketch, der einige delays hat, die aber weder kürzer sein noch fehlen dürfen. Ansonsten läuft es nicht. Auch das Volume ließ sich nicht anders auf 25 setzen. Habe die Lösung diesbezüglich aus einem älteren Beitrag des Library Autors.

Hier der Code:

#include <SoftwareSerial.h>
#include <DFPlayerMini_Fast.h>

SoftwareSerial mySerial(16, 17); // RX, TX
const int powerLatch = 4; 
// ledPin refers to ESP32 GPIO 32
const int ledPin = 32;
int ledState = LOW; 
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 100;           // interval at which to blink (milliseconds)


DFPlayerMini_Fast myMP3;

void setup()
{
      // initialize digital pin powerlatch as an output.
  pinMode(powerLatch, OUTPUT); 
  digitalWrite(powerLatch, HIGH);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
 Serial.setTimeout(2000);
 Serial.println("Setting up software serial");
  mySerial.begin(9600);
  delay(20);
  Serial.println("Setting up mp3 player");
  myMP3.begin(mySerial);
    while(!Serial) { }
  delay(1000);
   myMP3.play(1);
   myMP3.volume(1); 
  delay(100); 
  myMP3.volume(25); 

}

void loop()
{
  
 unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
if (millis() >= 10000) {
  Serial.println("Schalte aus");
    digitalWrite(powerLatch, LOW);
}
}

crazysky:
zwar nicht mit "isPlaying();". Das funktionierte zwar prinzipiell auch aber irgendwie war der Sound da schlecht. Es hörte sich so an, als ob bei jedem Schleifendurchlauf (also in sehr schneller Abfolge) ein kurzes Knacken generiert werden würde.

Das hatte ich ich auch und habe daher BUSY mit einem digitalen Eingang verbunden. BUSY entspricht der LED auf dem Player.

Wenn es für funktioniert, dann ist es ok.
Allerdings bedauerlich, dass du all unsere Vorschläge und Tipps ignorierst.
Dein aktueller Sketch wird dich vermutlich später noch ärgern.

sorry, hatte vergessen zu sagen, dass das teil schon ziemlich kompakt verlötet ist und deshalb die Option mit dem busy pin nicht in Frage kam. Davon abgesehen habe ich doch den Vorschlag mit der anderen Library aufgegriffen.

crazysky:
sorry, hatte vergessen zu sagen, dass das teil schon ziemlich kompakt verlötet ist und deshalb die Option mit dem busy pin nicht in Frage kam. Davon abgesehen habe ich doch den Vorschlag mit der anderen Library aufgegriffen.

Ahh....ok. Das mit der geänderten Lib habe ich im Sketch übersehen.
Wäre doch gut gewesen, das auch kurz zu schreiben (für lesefaule wie mich). :wink: