Langzeit Delay (Pause) (Code, Anfänger)

Hallo,

ich habe leider ein Problem bei einem Sketch.
Eine Funktion soll in regelmässigen Abständen (mit sehr langen Pausen, also z.b. etwa alle 2 Stunden) aufgerufen werden.

Dazu habe ich in die Loop-Funktion eine Delay-Pause eingebaut:

void loop() {
    
    play();
    delay(6600000UL);
     
}

Das klappt aber nicht...

Kann mir jemand auf die Sprünge helfen wie ich eine soll lange Pause einbauen kann!?

Vielen Dank im Voraus für eure Hilfe.

MfG

Delay ist immer schlecht, damit blockierst du den kompletten Controller.
Ich verstehe nur nicht, was genau du erreichen möchtest. Pause oder Wiederholzeit ?

Smassard:
Hallo,

ich habe leider ein Problem bei einem Sketch.
Eine Funktion soll in regelmässigen Abständen (mit sehr langen Pausen, also z.b. etwa alle 2 Stunden) aufgerufen werden.

Dazu habe ich in die Loop-Funktion eine Delay-Pause eingebaut:

void loop() {

play();
   delay(6600000UL);
   
}




Das klappt aber nicht...

Kann mir jemand auf die Sprünge helfen wie ich eine soll lange Pause einbauen kann!?

MfG

Eine Stunde hat normalerweise 3600 Sekunden.

Und bei Dir haben zwei Stunden zusammen 6600 Sekunden?

Eine Stunde mit 3600 Sekunden plus eine Stunde mit 3000 Sekunden, oder wie rechnest Du das?
OMG!

for(int x;x<720000;x++){
  delay(10);
  //Code der alle 10ms abgearbeitet werden kann
}

So kannst du es auch machen.

Halle jurs 10 Punkte für klugscheißen - wo ist deine Lösung?

Hallo,

ich habe schon viel gesehen, aber die for Schleife schießt den Vogel ab. :o
So mal Tipp. Sich mit millis() befassen.

Smassard:
Vielen Dank im Voraus für eure Hilfe.

Wenn Du blockierungsfrei programmieren möchtest, könnte Dir mein Geschreibsel von neulich helfen.

Gruß

Gregor

PS: Wenn es Dir auf absolute Genauigkeit (im Ggs. zu relativer G.) ankommt, ist es eine eher blöde Idee, irgendwas mit millis() oder so zu programmieren. Selbst baugleiche Arduinos, die vermutlich aus der gleichen Charge stammten, gingen bei mir ratz-fatz unterschiedlich "schnell".

for(int x;x<720000;x++)

Schau dir mal den Wertebereich von int an

hi,

viele antworten, aber warum funktioniert der code des TO eigentlich nicht. ich kann keinen fehler sehen.

und daß millis für viele sachen besser ist, ist schon klar. aber eben nicht immer. falls nur alle 2 stunden eine aktion ausgelöst werden soll, ist delay genauso gut. und einfacher.

gruß stefan

ar182:

for(int x;x<720000;x++){

delay(10);
  //Code der alle 10ms abgearbeitet werden kann
}




So kannst du es auch machen.


Halle jurs 10 Punkte für klugscheißen - wo ist deine Lösung?

Deine Lösung ist auch keine Lösung.
Grüße Uwe

Hallo,

um das Problem zu lösen, müsste man wissen, was der Code vom TO macht laut seiner Meinung. Was der Code macht wissen wir. Das er 2h warten soll wissen wir auch. Was wir nicht wissen ist, was der Code laut TO falsch machen soll.

Gut, dass hier mehr Leute mitlesen und denken als ich. Bei mir läuft seit 6 oder 7 Stunden ein Uno, der genau das macht, was das Programm ihm sagt. Alle zwei Stunden (so ungefähr) geht die LED auf dem Board an oder aus.

An den OP: Funktionieren denn kurze Pausen? Und was ist, wenn Du eine kurze Pause in einer Schleife wiederholst?

Gruß

Gregor

Hallo,

Dank für die zahlreichen antworten.

Wie gesagt soll nach dem Aufruf der play() Funktion eine lange Pause kommen und dann wieder play() aufgerufen werden.

Das tut es aber nicht. Die Pause sind deutlich kürzer als die 6600 sekunden (110 minuten).

Der Controller muss während der Pause auch keine anderen Sachen machen, der kann also ruhig durch delay blockiert werden/bleiben.

Kann man Delay nicht für so lange Zeitspannen nutzen? Oder wo liegt das Problem?

MfG

Mach es mit einer RTC, wenn es genau sein soll.

OK, aber es muss nicht genau sein.

Kurze Pausen scheinen aber mit dem Code zu funktionieren.

Smassard:
Kurze Pausen scheinen aber mit dem Code zu funktionieren.

Huh?!

Darauf kann ich mir keinen Reim machen. Was könnte dazu führen, dass lange Pausen nicht funktionieren?

Gruß

Gregor

Smassard:
OK, aber es muss nicht genau sein.

Kurze Pausen scheinen aber mit dem Code zu funktionieren.

Dann setze doch einfach zwei funktionierende hintereinander.

Smassard:
Die Pause sind deutlich kürzer als die 6600 sekunden (110 minuten).

Wieviel kürzer ist "deutlich kürzer"? Mehr als zwei Minuten kürzer, also kürzer als 108 Minuten?

Das interne Timing von vielen Arduino-Boards ist nämlich nicht besonders präzise.

Genauer gesagt: Alle Boards, die ihren Systemtakt nicht mit einem "Schwingquarz", sondern mit einem "keramischen Resonator bilden, können um bis zu 0,8% von der tatsächlichen Zeit abweichen.

Also ein delay(1000) kann dann entweder 992 Millisekunden dauern, oder auch 1008 Millisekunden, so hoch kann die Abweichung bei keramischen Resonatoren werden. Das sind im Endeffekt "bis zu einer Sekunde Abweichung pro zwei Minuten. Oder anders gesagt: Eine Minute in zwei Stunden.

ALLE Arduino Boards im sogenannten R3-Design, wie UNO R3 und MEGA2560 R3, haben zur Taktung keramische Resonatoren auf dem Board, und takten daher mit bis zu 0.8% Abweichung, wenn man interne Zeitfunktionen wie delay() oder millis() verwendet.

Genauere Ergebnisse für Langzeit-Timings kann man mit Boards erreichen, die ihren Systemtakt mittels Schwingquarz bilden, aber solche Boards sind in den letzten 10 Jahren selten geworden.

Oder man liest längere Zeitspannen aus einem RTC-Modul aus, die RTC-odule takten die Zeit recht genau, da sie entweder mit Schwingquarz oder sogar einem temperaturkompensierten Schwingquarz getaktet werden.

HI ich habe s so gelöst:
oben rein vor dem Setup:

const long interval = 7200000;

Dann im code wo es anhalten soll: delay(interval);

Funktioniert super

Hast Du mal aufs Datum geschaut?

Gruß Tommy

Hi

Davon ab ist Das DIE Lösung ... wenn man sonst Nichts mit dem Steinchen machen will ... aber was schwätze ich hier ... mach Du Mal Dein delay() und gut ist.

Warum komme ich nicht auf so tolle Ideen?? Achja ... meine Steinchen sollen in der Zwischenzeit noch anderen Kram machen ... darum ... (achja ... millis() wäre der Weg oder eine Ausarbeitung dazu)

MfG