Zeitgesteuerter DFPlayer mini [gelöst]

Hallo in die Runde,
ich stehe schon seit langem vor einem Problem. ich möchte, das der DFPlayer Mini zu in einem bestimmten Zeitraum eine Melodie abspielt. Das ganze hatte ich schon mal im Forum unter " [Timer mit DFPlayer Mini". Dieser Timer funktionierte nur einen Tag, danach musste der Arduino immer wieder neu gestartet werden. Nun habe ich einen neuen Timer. Dafür nutze ich einen Arduino Uno R3 mit I2C- LCD und einem RTC (DS3231) . Den passenden Sketch für die Zeitsteuerung habe ich im Netz gefunden. Die Steuerung eines Relay und einer LED funktioniert. Das einfügen des DFPlayers bereitet mir Probleme. Zur eingestellten Startzeit schaltet das Relay, die LED leuchtet und der DFPlayer startet. Leider spielt er nur kurz den ersten Ton der gewünschten mp3 ab und das wiederholt sich aller ca. 0,5 Sekunden bis die Stopzeit erreicht ist. Ich vermute das die mp3 mit jedem Durchlauf der Loop-Schleife neu startet. Deshalb hatte ich in der Relayfunktion eine Forschleife eingefügt. Leider ohne Erfolg.
Hier ein Bild von der Schaltung.

Den Sketch hab ich auch mal mit angefügt . Vielleicht kann mir jemand helfen.
Ultra_Mega_Timer.ino (16.6 KB)

Versorgen Sie all das Zeug vom Arduino 5V-Pin?

Zur Zeit habe ich es wieder auf einem Steckbrett aufgebaut ohne einer zusätzlichen Spannungsquelle. Die selbe Schaltung hatte ich aber auch mit einer einer 5V Netzteil betrieben. Es war das gleiche Ergebnis.

Habe gerade noch mal das Netzteil angesteckt. daran liegt es nicht.

Es wird unbedingt diese andere Stromversorgung und eine Signalmasse zum Arduino benötigen.
Ich vermute, Ihr Problem liegt in den interessanten if-Strukturen, die Sie für das Timing verwenden.

Die Vermutung habe ich auch. Da der Timer-Sketch nicht von mir selber ist, kann ich ihn auch nicht in allen nachvollziehen. darum suche ich auch hier Hilfe.

Sehr gut. Dann reißen Sie die Maschine ab und lernen Sie einen Teil nach dem anderen.
Sie müssen lernen, wie man millis() für das Timing verwendet. Ich würde Ihnen Links zur Verfügung stellen, aber diese sind nicht in Ihrer Sprache und helfen möglicherweise nicht weiter.

Ich empfehle millis () mit ein paar LEDs zuerst, um das Konzept zu erhalten.

Fügen Sie dann die Tasten hinzu, aber verbinden Sie sie mit Masse anstelle von 5 V und verwenden Sie INPUT_PULLUP. Dann können Sie nach niedrig statt nach hoch suchen und Ihre Verkabelung ist viel einfacher.

Fügen Sie dann die Echtzeituhr und den Bildschirm hinzu und verwenden Sie sie, um die aktuelle Uhrzeit anzuzeigen. All diese Dinge fügen Sie als millis() zeitgesteuerte Ereignisse hinzu.

Lassen Sie dann die Schaltflächen das anzeigen, was Sie auf dem Bildschirm wünschen.

Als letztes fügen Sie den MP3-Player hinzu.

Erklärst Du, was Du hier machst:

      for (int i = 0; i = 1; i++)
      {
        myDFPlayer.play(2);                      // spiele das 2. MP3  von der SD-Karte
      }

???

Ich nehme an, daß der Play Befehl mit jedem Durchlauf der Schleife die Mp3 neu startet. Deshalb wollte ich mit der For-Schleife diesen Ablauf nur ein mal ausführen. Das funktioniert aber auch nicht. Habe es schon wieder raus genommen.

Der Gedanke mit einer for-Schleife war schon richtig. Mein Fehler war "i" im loop zu deklarieren. Habe "i" im setup deklariert. Das gleich noch mal für die Stop_Funktion. Und es läuft.

Wenn Du "i" im setup() deklarierst gibt es diese Variable im loop() nicht.

Siehe globale un lokale Variablen.

Grüße Uwe

Ja, hab es anders gemeint.
An Stelle von i habe ich eine int Variable "Start" bzw. "Stop" eingesetzt.
Wie genau es aussieht, zeige ich heute Abend. Sitze gerade in der Bahn in Richtung Arbeit.

a) statte alle deine if mit Seria.println("ich bin jetzt hier oder da"); aus damit du siehst was dein Programm macht.
Serial.print/println sind dein Tool zum Programm debuggen!

b) wenn du dir das ansiehst

 if (Time >= on_Time1 && Time < off_Time1) { //Start
      digitalWrite(Relay, HIGH);
      digitalWrite(LED, HIGH);
      for (int i = 0; i = 1; i++) {
        myDFPlayer.play(2);                      // spiele das 2. MP3  von der SD-Karte

      }
    }

solange
Time >= on_Time1 && Time < off_Time1

erfüllt ist, springt er immer wieder da rein und startet deinen player track 2
Du wills das aber vermutlich nur EINMAL starten. wenn es erreicht ist.
Also wirst du noch eine Variable benötigen in der du dir merkst dass du gestartet hast.
Natürlich musst du die Variable am Ende dieser Zeit wieder zurücksetzen.

z.B. eine globale

bool isActive = false;

wenn du den player startest setzt du isActive = true; das heißt:

  • dort wo du den Player startest, fragst du für den Player auf diese Variable ab
    if (isActive==false) , schaltest den player ein und setzt die Variable auf true
  • dort wo du nur die Relays abschaltest, setzt du die Variable auf false

Wie ich heute morgen geschrieben hatte, habe ich zwei Variablen angelegt. Eine für Start und eine für Stop. Mit einer For-Schleife lasse ich das ganze nur einmal durchlaufen. Play-Funktion geht wie gewollt. Vielleicht habe ich mich nicht verständlich genug ausgedrückt.
hier ein paar Zeilen.

  //----Relay Function----//
  if (onhour1 == offhour1 && onmin1 == offmin1 && onsec1 == offsec1) {
    digitalWrite(Relay, LOW);
    digitalWrite(LED, LOW);
    digitalWrite(Start, LOW);
    for (Stop; Stop <= 1; Stop++) {
        myDFPlayer.stop();                      // stopt MP3
      }

  }

  if (on_Time1 < off_Time1) {

    if (Time >= on_Time1 && Time < off_Time1) { //Start
      digitalWrite(Relay, HIGH);
      digitalWrite(LED, HIGH);
      digitalWrite(Stop, LOW);
      for (Start; Start <= 1; Start++) {
        myDFPlayer.loop(2);                      // spiele die 2. MP3  von der SD-Karte
      }

Danke an alle die mir hier auf die Spünge geholfen haben.
Mein Zeitgesteuerter DFPlayer Mini funktioniert wie er soll, auch wenn der Sketch nicht so perfekt ist.