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!?
Delay ist immer schlecht, damit blockierst du den kompletten Controller.
Ich verstehe nur nicht, was genau du erreichen möchtest. Pause oder Wiederholzeit ?
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!
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".
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.
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?
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.
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)