Delay-Ersatz

Ich grüße die Arduino_Gemeinde im neuen Jahr und komme auch gleich mit einem AnfängerProblem:

Meine Programm "liest" von einer SD-Card Sprachdateien (.wav) und "spricht" über Ohrhörer den jeweiligen Text <TMRpcm.h> . Damit die Ansagen sich nicht gegenseitig stören (ineinander quatschen, weil unterschiedliche Wiederholungsraten) brauche ich zeitliche Verzögerungen von 1000 und 1500 millis. Das mache ich jetzt mit entsprechenden delays, was gut funktioniert. Es handelt sich insgesamt um 16 delays innerhalb des Programmablaufs. Welche einfachen Alternativen sind vorzuziehen?

Ich danke im Voraus.
Rüdiger R.

Siehe blinkwithoutdelay aus den Beispielen und im Forum nach Nachtwächtererklärung suchen.

Ich kenne die Lib nicht, aber wenn sie evtl. einen Status zum aktuellen Playback liefert könnte man auch das auswerten.

Wenn es diese Library ist: GitHub - TMRh20/TMRpcm: Arduino library for asynchronous playback of PCM/WAV files direct from SD card. Arduino Uno,Nano,Mega etc supported, dann schau Dir mal die Beispiele an.
Dort gibt es den Befehl "isPlaying()" welcher Dir den Status zurückgibt, ob gerade eine Datei gespielt wird.

Greyhaired:
Welche einfachen Alternativen sind vorzuziehen?

Warum benutzt Du nicht einfach die Methode isPlaying()? Damit sollte sich das mit den Delays doch vermeiden lassen.

Gruß

Gregor

music.play(titelnummer); //Aufruf der Abspiel-Funktion - soll's zumindest skizzieren
while (music.isplaying());
delay(100); //wieder ein delay :) Pause zwischen den WAV's
while (music.isplaying());

Schön postmaster-ino
Du ersetzt ein delay() mit fixer Zeit durch ein delay mit del Länge des Musikstücks. :wink: :wink: :smiley: 8)

Ich sehe da nicht viel Vorteile.
Grüße Uwe

:o

uwefed:

while (music.isplaying());

Du ersetzt ein delay() mit fixer Zeit durch ein delay mit del Länge des Musikstücks. :wink: :wink: :smiley: 8)

Wo tut er das?

Beziehst Du Dich auf den Code der isPlaying()-Methode oder meinst Du etwas Anderes?

Meiner Meinung nach tut die while()-Konstruktion genau das, was richtig ist - nämlich einfach nichts, solange etwas abgespielt wird.

Gruß

Gregor

PS: Schöner wär's IMO halt, wenn es einen leere while()-Körper gäbe, also

while(...) [b]{}[/b]

Danke für die Unterstüzung. Ich kannte die TMRpcm-Beispiele nicht.

Hiermit sollte es gehen : if bzw. while (tmrpcm.isPlaying()......., muß dazu einiges im Programm umbauen.

Rüdiger R.

gregorss:
Wo tut er das?

Beziehst Du Dich auf den Code der isPlaying()-Methode oder meinst Du etwas Anderes?

Meiner Meinung nach tut die while()-Konstruktion genau das, was richtig ist - nämlich einfach nichts, solange etwas abgespielt wird.

Gruß

Gregor

PS: Schöner wär's IMO halt, wenn es einen leere while()-Körper gäbe, also

while(...) [b]{}[/b]

[/quote]

Ja, das tut es. Ist aber gut daß der Arduino blockiert wird. Sollte nicht in der Abspielzeit Tastendrücke kontrolliert werden und darauf reagiert werden?

Grüße Uwe

Hi

Wenn ich dem While einen Schleifenkörper spendiere, kann ich darin auch auf Tastendrücke o.Ä. reagieren.
Ob oder wie ich die Musik dann aus bekomme, müsste in der Lib nachgelesen werden.

Diese Funktionalität hätte ich vorher aber auch in yield() machen könne, wobei die Version eben nicht nur solange wartet, wie die Musik an ist, sonder so lange, bis das delay() vorbei ist.

MfG

uwefed:
... Sollte nicht in der Abspielzeit Tastendrücke kontrolliert werden und darauf reagiert werden?

Oh, das habe ich übersehen.

Naja. Für die Kontrolle auf Eingaben könnte es eine separate Funktion geben, die im while()-Körper immer wieder aufgerufen wird.

Gruß

Gregor

Nachtrag: Tasten drücken kommt in meinem Programm nicht vor. Das Programm entwickelt aus eingehenden Daten (von einer Datenleitung kommend) die Dateinamen selbst. Das funktioniert auch. Probleme machen mir die unregelmäßigen Dateizugriffe auf die SD. Dafür brauche ich zur zeitlichen Trennung Pausen.
Nun aber nicht mehr mittels delay, sondern so:

unsigned long millisekunden = 2000;
unsigned long zeit ;
void setup() {
  Serial.begin(9600);
}
void loop() {
  zeit = millis() ;
  Serial.println( zeit);  while ( millis() - zeit < millisekunden) {};   Serial.println( zeit);
  zeit = 0;
}