Go Down

Topic: Blink LED während MP3 abspielt (Read 213 times) previous topic - next topic

crazysky

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. 


Code: [Select]
#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();


}



agmue

Was mache ich falsch?
Du verwendest das blockierende delay.

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

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Rentner

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

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

michael_x

Quote
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...

uxomm

#5
Nov 03, 2020, 06:12 pm Last Edit: Nov 03, 2020, 06:18 pm by uxomm
Die Library von PowerBroker2 (hier aus dem engl. Forum) für den DFPlayer ist zu empfehlen.
https://github.com/PowerBroker2/DFPlayerMini_Fast

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.
Always decouple electronic circuitry.

crazysky

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:

Code: [Select]
#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);
}
}

agmue

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.

Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

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. 

HotSystems

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). ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up