Oder gibt es hier andere Ansätze für die Umsetzung?
Die millis() Funktion ist ja schon genannt worden. Aber millis() taktet tausendmal pro Sekunde hoch, aus der Funktion mußt Du noch einen sauberen und langsameren Takt ableiten, was durch eine Ganzzahldivision möglich ist.
So erhöht sich der Wert von "millis()/500" alle 500 Millisekunden, also jede halbe Sekunde.
Der Wert von "millis()/3000" erhöht sich alle drei Sekunden.
Für exakte Taktung mache ich mir immer eine Funktion, die sich intern den alten Taktwert merkt, beliebig oft aufgerufen werden kann, aber immer nur bei einer Änderung des Wertes "true" zurückliefert, so dass dann bestimmte Aktionen gestartet werden können.
Codebeispiel mit einem Halbsekundentakt und einem Dreisekundentakt als Demo anbei.
Die loop-Funktion muß man für genau getaktete Funktionen natürlich immer auf maximaler Drehzahl laufen lassen, d.h. keine delays verwenden!
void setup() {
Serial.begin(9600);
}
boolean halbSekundenTakt()
// liefert true falls seit dem letzten Aufruf die Halbsekunde gewechselt hat
{
static long alterWert;
long halbeSekunden=millis()/500;
if (halbeSekunden!=alterWert)
{
alterWert=halbeSekunden;
return(true);
}
else return(false);
}
boolean dreiSekundenTakt()
// liefert true falls seit dem letzten Aufruf ein neues 3-sec-Intervall begonnen hat
{
static long alterWert;
long dreiSekunden=millis()/3000;
if (dreiSekunden!=alterWert)
{
alterWert=dreiSekunden;
return(true);
}
else return(false);
}
void loop()
{
if (halbSekundenTakt())
{
Serial.print("1/2 sec Tick ");
Serial.println(millis());
}
if (dreiSekundenTakt())
{
Serial.print("Jetzt sind 3 Sekunden um! ");
Serial.println(millis());
}
// Rest des loop-Codes hier
}