Aber gern doch.
Hier mal ein paar Auszüge aus dem Code des XPlorer1, da wird das auch so gehandhabt.
Zuerst bauen wir und nen Timner zusammen, der anhand von den millis() bei Bedarf "Ticks" erzeugt:
Code:
void timer() //***************** mehrere Sekundenticks erzeugen **********************************
{
unsigned long aktuelleMillis = millis();
if (aktuelleMillis - vergangeneMillis >= interval) // Sekunde um
{
vergangeneMillis = aktuelleMillis;
halbeTick ++; // 500ms sind um
if(halbeTick>2) // hier ist eine volle Sekunde vorbei
{
halbeTick=1; // wechselt alle halbe Sekunde
sekundenTick++; // wechselt jede volle Sekunde
gemachtFlag=0; // Aufgabe-erledigt-Flag zurücksetzen
}
if(sekundenTick==5) // mehr brauchen wir nicht
{
sekundenTick=0;
}
}
}
Der hier erzeugt jede halbe Sekunde nen Tick, und zusätzlich zählt er die Sekunden jedesmal bis fünf hoch.
Im Grunde ein umgeschriebenes "blink_without_delay"...
Im Hauptprogramm muss dieser Timer natürlich auch "hin und wieder" aufgerufen werden (immer, wenn Zeit ist), das Stück Code ist tatsächlich das _komplette_ Hauptprogramm:
Code:
void loop()
{
timer();
manageLichter();
sekundenAufgaben(); // je nachdem, was der Timer grade hat...
delay(2); // Zeit lassen für Anfragen vom NodeMCU
}
Im Unterprogramm "sekundenAufgaben" wird nun aufgedröselt, je nachdem, welchen Wert der Timer gerade hat:
Code:
void sekundenAufgaben()
{
if((sekundenTick==0)&&(gemachtFlag==0)) //wenns nicht schon erledigt wurde...
{
messeAkku();
}
if((sekundenTick==1)&&(gemachtFlag==0))
{
berechneLichtstaerke();
gemachtFlag=1;
}
}
Die gewünschten Intervalle (in denen der Timer halt "tickt") stellt man dann einfach mit passenden Konstanten ein:
Code:
unsigned long vergangeneMillis = 0; // hier der letzte Tick
const long interval = 500; // Intervall, 500 Millisekunden
Die Variable "gemachtFlag" verhindert, dass die jeweilige Aufgabe innerhalb des einen Intervalls ...zigmal erledigt wird- nur wenn die auch 0 ist, wird die Aufgabe abgearbeitet, und nachdem sie erledigt wurde, wird das Flag auf 1 gesetzt.
Im Code zum XP2 hab ich inzwischen fünf oder sechs solche Flags-der hat einiges mehr zu tun, hehe.
Der zählt aber auch die Sekunden bis 20 hoch....das Beispiel ist in alle möglichen Richtungen anpassbar, man kann den Timer schneller oder langsamer ticken lassen, man kann ihn weiter oder weniger weit hochzählen lassen, ganz wie man es gerade braucht.
Das ist natürlich keine Atomuhr- da der nur abgefragt wird, wenn keine anderen Aufgaben zu erledigen sind (hier z.B. kommt noch das manageLichter() dazwischen), geht er nicht supergenau, aber wen jucken Abweichungen von nen paar Millisekunden denn- meistens ist das Wurst.
Falls du noch Fragen dazu hast- frag einfach.
Lesezeichen