void updateTimers() // continu in void loop aanroepen{ if(millis() != previousMillis) { // als millis() is veranderd previousMillis = millis() ; counter1++; // hoog 3 counters op die je vrij kan gebruiken in je programma. counter2++; counter3++;}
void updateTimers(){ if(millis() != previousMillis) { // als millis() is veranderd previousMillis = millis() ; for(int i = 0; i < nCounters; i++){ if(counter[i].isActive == 1) { // als counter aanstaat if(counter[i].interval > 0) counter[i].interval--; // decrementeer interval als hij groter is dan 0 if(counter[i] == 0) { // als interval 0 is counter.func(); // voer de functie uit counter[i].interval = counter[i].reload; // laadt een nieuwe waarde in interval } } } }}// dan bedien ik ze metstart(COUNTER1, foo, 500); // functie foo() wordt nu elke 0,5s uitgevoerd COUNTER1 is een #define als index voor het struct arrray// enstop(COUNTER1); // stopt de functies /*Toevoegend maak ik ook nog gebruik van een simpel up countertje, is gewoon rete handig*/
Een nadeel van millis() is dat je hem nooit kan resetten.
bool PIGS_CAN_FLY = true;byte counter;void updateTimers(){ if(PIGS_CAN_FLY) { if(millis() & NINTH_BIT_MASK){ PIGS_CAN_FLY = false; } } else { if((millis() & NINTH_BIT_MASK) == 0){ PIGS_CAN_FLY = true; counter++; // elke 1024ms wordt counter opgehoogd } }}
Goed voor die counter kan je makkelijk array maken icm met constantes. Met 2kb ram heb je toch genoeg geheugen. Ik vind het voordeel van deze counters dat je ook unsigned int kan gebruiken als je process korter is dan 65 seconden en je hebt nooit last van overflows.
Beste blijft nog altijd wat ik eerder zei, maak je eigen library of kies er een uit! Dan is de eindgebruiker het beste af.
Stel millis (en onze variabele) zijn maar 4 bit en overflowen van 15 terug naar 0.Als je nu op tijdstip 13 een timeout van 5 wilt, dan krijg je het volgende:millies previous delta13 13 014 13 115 13 20 13 (-13 maar bij een 4 bit type underflowed dat naar:)3....