Hallo zusammen,
ich habe mich die Tage damit auseinander gesetzt, via RTC einzelne Funktionen zu einer bestimmten Zeit zu schalten.
Die Bibliotheken für Scheduler die ich mir angeschaut habe, waren für meine Zwecke zu mächtig und groß, daher habe ich mir eine kleine Funktion geschrieben, mit der ich zu dem gewünschten Ergebnis komme.
Würde mich um Feedback bzw. weitere Anregungen freuen.
Scheduler (Core)
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
tmElements_t tm;
int makeTask(int taskHour, int taskMinute, int taskSecond, int repeat, int lastRepeat){
//Repeat (In welchem Intervall soll wiederholt werden?) => 0=second, 1 = minute, 2 = hour, 3 = day
if (RTC.read(tm)) {
if (repeat == 0 and lastRepeat != tm.Second){
//Wiederholung jeder Sekunde => return meldet Sekunde der Ausführung
return tm.Second;
} else if (repeat == 1 and tm.Second == taskSecond and lastRepeat != tm.Minute) {
//Wiederholung bei Sekunde "taskSecond" jeder Minute => return meldet Minute der Ausführung
return tm.Minute; //for lastRepeat
} else if (repeat == 2 and tm.Minute == taskMinute and tm.Second == taskSecond and lastRepeat != tm.Hour){
//Wiederholung bei Minute "taskMinute" und Sekunde "taskSecond" jeder Stunde => return meldet Stunde der Ausführung
return tm.Hour; //for lastRepeat
} else if (repeat == 3 and tm.Hour == taskHour and tm.Minute == taskMinute and tm.Second == taskSecond and lastRepeat != tm.Day) {
//Wiederholung bei Stunde "taskHour", Minute "taskMinute" und Sekunde "taskSecond" jeden Tages => return meldet Tag der Ausführung
return tm.Day; //for lastRepeat
} else {
//keine Ausführung da Zeit nicht erreicht => retrun meldet lastRepeat wieder zurück
return lastRepeat; //for lastRepeat
}
}
}
SchedulerTasks
void TaskBoarding(){ //Funktion für void loop()
//Hier alle Tasks auflisten
TEST_TASK();
}
//############# Beispiel für Task #############
//der Block wird für jeden weiteren Task benötigt
//Variable für Wert der letzten Ausführung
int CTRL_TEST = 0;
//Cache-Variable für Rückgabewert des Scheduler Cores
int CTRL_TEST_CACHE=0;
void TEST_TASK(){
//Füllt Cachevariable mit dem Rückgabewert des Cores
CTRL_TEST_CACHE = makeTask(8, 00, 00, 3, CTRL_TEST);
//Wenn die letzte Ausführung ungleich der aktuellen Ausführung ist
//gehen wir davon aus, dass der Task ausgeführt werden kann
//Wenn makeTask meint, dass es noch nicht an der Zeit ist, meldet er
//den Wert von CTRL_TEST wieder zurück und CTRL_TEST ist identisch mit CTRL_TEST_CACHE
if(CTRL_TEST != CTRL_TEST_CACHE){
//Funktion die ausgeführt wird
PrintText(); //Funktion die ausgeführt werden soll
//Zeit der letzten Ausführung aus Cachevariable übergeben
CTRL_TEST = CTRL_TEST_CACHE;
}
}
Beispiele für makeTask (makeTask(int taskHour, int taskMinute, int taskSecond, int repeat, int lastRepeat)
makeTask(00, 00, 00, 0, CTRL_TEST);
Ausführung jede Sekunde
makeTask(00, 00, 30, 1, CTRL_TEST);
Ausführung jede Minute bei 30 Sekunden (10:00:30 ; 10:01:30 ; 10:02:30 ...)
makeTask(00, 10, 15, 2, CTRL_TEST);
Ausführung jede Stunde bei 10 Minuten und 15 Sekunden (12:10:15 ; 13:10:15 ; 14:10:15 ...)
makeTask(08, 00, 00, 3, CTRL_TEST);
Ausführung jeden Tag um 08:00 Uhr (01.01. 08:00 ; 02.01. 08:00 ; 03.01. 08:00 ...)
Noch eine kleine Anmerkung: Ich verzichte wenn es geht auf delays in den aufgerufenen Funktionen,
falls dies nicht möglich ist, führe ich die Tasks seltener aus und achte darauf, dass zum nächsten Task genug Zeit bleibt.