Sbarazzati di cicli e ritardi.
Come sbarazzarsi del ciclo e renderlo asincrono in modo che non blocchi l'esecuzione? Molto semplice: il ciclo viene sostituito con un contatore e una condizione. Supponiamo di avere un ciclo for che stampa il valore di un contatore:
for (int i = 0; i < 10; i++)
{
Serial.println(i);
}
Per sbarazzarci del ciclo, dobbiamo creare la nostra variabile globale, mettere tutto in loop() e aumentare in modo indipendente la variabile e controllare la condizione:
int counter = 0;
void loop()
{
Serial.println(counter);
counter++;
if (counter >= 10) counter = 0;
}
Ma cosa succede se ci fosse un delay()
nel ciclo? Ecco un esempio:
for (int i = 0; i < 30; i++)
{
Serial.println(i);
delay(100);
}
Sbarazzati di loop e delay(). Introduciamo un timer per millis() e lavoriamoci sopra:
int counter = 0; // variabile di sostituzione
uint32_t timer = 0; // variabile timer
#define T_PERIOD 100 // periodo di commutazione
void loop()
{
if (millis() - timer >= T_PERIOD) // timer su millis()
{
timer = millis(); // ripristina.
counter++; // aggiungi.
if (counter > 30) counter = 0; // cambia in un cerchio continuo.
}
}
Invece della variabile di ciclo i, ora abbiamo il nostro contatore globale counter, che va da 0 a 30 (in questo esempio) con un periodo di 100 ms.