Hallo allerseits,
ich bin auf der suche nach einem Codeschnippsel, der statt delay eine RTC verwendet.
Konkret, ich habe ein Projekt in dem eine RTC verbaut ist.
Immer zu einer bestimmten Uhrzeit wird ein Code ausgeführt, was super klappt.
Nun möchte ich noch einen kleinen Code alle 30 min ausführen lassen und dabei happerts...
Ich weiss nicht wie ich statt dem delay(1800000); die RTC benutzen kann ?
Kann mir jemand helfen ? Hoffe ihr versteht was ich meine...
Klingt für mich noch nichteinmal nach der Notwendigkeit, eine RTC zu verwenden. Delays() zu vermeiden gehört hier ja schon zum guten Ton, da wird dann oft das mit der IDE mitgelieferte Beispiel blinkWithoutDelay angeführt.
Definiere eine Variable mit der Minute in welcher Dein Code ausgeführt werden soll. (minute = 20)
Hol Dir in loop() einfach von der RTC immer die Minuten und vergleiche den Wert mit der Variablen.
Wenn RTC.minute == gemerket_minute (z.B. Minute 30), dann führe Deinen Code aus und setze die Variable auf den nächsten Minutenwert.
minute = (minute + 30) % 60
Dann vergleichst Du wieder wie oben den aktuellen Wert mit Deiner Variable.
Wie man die time Klasse mit dem RTC synchronisiert steht auch dort beschrieben.
Man kann das aber auf so kurzen Intervallen immer noch mit millis() machen.
Bei diesem Code hast Du das Problem, das der Code vermutlich mehrmals in der gleichen Minute abgearbeitet wird, denn loop() benötigt in der Regel weniger als eine Minute zum Durchlauf. Du musst also verhindern, das in der gleichen Minute der Code nochmal ausgeführt wird.
Außerdem gibt es eine time_alarm lib. Die arbeitet dann mit einem Callback auf eine Funktion. Die Lib braucht aber jede Menge speicher und ist m.M.n. nicht besonders schnell.
J3RE:
Wenn du eine RTC hast, hast du sicher auch eine Variable für die Minuten oder?
Wenn diese Variable 0 oder 30, ist soll dein Code ausgeführt werden.
Bei diesem Code hast Du das Problem, das der Code vermutlich mehrmals in der gleichen Minute abgearbeitet wird, denn loop() benötigt in der Regel weniger als eine Minute zum Durchlauf. Du musst also verhindern, das in der gleichen Minute der Code nochmal ausgeführt wird.
Ja aber nur wenn der Code länger als eine Sekunde benötigt. Der Nachteil zu den anderen Lösungen ist halt, dass man nach dem Einschalten auf die volle/halbe Stunde warten muss.
Dann wird der Code immernoch mehrmals in der Sekunde ausgefgührt.
Am einfachsten ist die Stunden, Minuten und Sekunden in Sekunden umzurechnen und nur mit eine Variable kontrolieren.
Benute eine Variable die auf 1 gesetzt wenn das erste mal die Zeit übereinstimmt und 0 gersetzt wird enn sie nicht übereinstimmt.
Die Aktion wird durchgeführt und die Variable auf 1 gesetzt, wenn die Zeit richtig ist, und die Variable 0 ist. So wird die Aktionnur einmal aufgerufen.
Grüße Uwe
uwefed:
Dann wird der Code immernoch mehrmals in der Sekunde ausgefgührt.
Am einfachsten ist die Stunden, Minuten und Sekunden in Sekunden umzurechnen und nur mit eine Variable kontrolieren.
Benute eine Variable die auf 1 gesetzt wenn das erste mal die Zeit übereinstimmt und 0 gersetzt wird enn sie nicht übereinstimmt.
Die Aktion wird durchgeführt und die Variable auf 1 gesetzt, wenn die Zeit richtig ist, und die Variable 0 ist. So wird die Aktionnur einmal aufgerufen.
Bei diesem Code hast Du das Problem, das der Code vermutlich mehrmals in der gleichen Minute abgearbeitet wird, denn loop() benötigt in der Regel weniger als eine Minute zum Durchlauf. Du musst also verhindern, das in der gleichen Minute der Code nochmal ausgeführt wird.
Ja aber nur wenn der Code länger als eine Sekunde benötigt. Der Nachteil zu den anderen Lösungen ist halt, dass man nach dem Einschalten auf die volle/halbe Stunde warten muss.
Grüße,
J3RE
Auch kein Problem!
Variable einfach mit etwas größer 1800 initialisieren.
Habs entweder übersehen, oder hat bisher keiner erklärt, was man bei millis() - Überlauf macht:
Ganz einfach:
const unsigned long INTERVALL=60000; // einmal jede Minute
static unsigned long alterWert; // oder auch global deklarieren
if ( (millis() - alterWert) >= INTERVALL )
{
alterWert = millis();
// funktioniert selbst bei einem Überlauf, da die Differenz auch dann stimmt
}