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:
Der hier erzeugt jede halbe Sekunde nen Tick, und zusätzlich zählt er die Sekunden jedesmal bis fünf hoch.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; } } }
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:
Im Unterprogramm "sekundenAufgaben" wird nun aufgedröselt, je nachdem, welchen Wert der Timer gerade hat:Code:void loop() { timer(); manageLichter(); sekundenAufgaben(); // je nachdem, was der Timer grade hat... delay(2); // Zeit lassen für Anfragen vom NodeMCU }
Die gewünschten Intervalle (in denen der Timer halt "tickt") stellt man dann einfach mit passenden Konstanten ein:Code:void sekundenAufgaben() { if((sekundenTick==0)&&(gemachtFlag==0)) //wenns nicht schon erledigt wurde... { messeAkku(); } if((sekundenTick==1)&&(gemachtFlag==0)) { berechneLichtstaerke(); gemachtFlag=1; } }
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.Code:unsigned long vergangeneMillis = 0; // hier der letzte Tick const long interval = 500; // Intervall, 500 Millisekunden
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.







Zitieren

Lesezeichen