Lampeggiare senza attese
Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 3 di 18.
delay() blocca l'intero sketch. Mentre un lampeggio attende i suoi 500 ms, in loop() non viene eseguito nient'altro: un pulsante premuto in quel lasso di tempo non viene rilevato finché l'attesa non è terminata.
La soluzione è non aspettare mai. Lascia che loop() venga eseguito più e più volte, molto velocemente, e ogni volta confronta l'orologio con il momento in cui il LED è cambiato l'ultima volta. Finché non sono trascorsi 500 ms, non fare nulla. Poi cambia il LED e memorizza il nuovo momento:
const unsigned long interval = 500;
unsigned long previousMillis = 0; // quando il LED ha cambiato stato l'ultima volta
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // memorizza questo momento
// cambia lo stato del LED qui
}
// qualsiasi altra cosa qui viene eseguita migliaia di volte al secondo
}now - previousMillis è il tempo trascorso dall'ultima modifica. Per commutare il LED, mantieni il suo stato in una variabile, int redState = LOW;, inverti il valore con if/else e scrivilo con digitalWrite(redLed, redState);.
Se dimentichi di aggiornare previousMillis, la condizione resta vera dopo i primi 500 ms, quindi il LED cambia a ogni ciclo e sembra illuminato a metà.
Sfida
MedioIl LED giallo dovrebbe seguire il pulsante, ma reagisce in ritardo perché le chiamate a delay() del LED rosso bloccano il ciclo. Riscrivi il lampeggiamento del LED rosso usando millis():
- mantieni invariata la parte del pulsante
- ogni 500 ms, accendi e spegni il LED rosso sul pin 13
- non usare
delay()da nessuna parte
Premi Run, tieni premuto il pulsante e osserva entrambi i LED, poi premi Check.
Provalo tu
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// Il LED giallo segue lo stato del pulsante. Mantieni questa parte.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// Il LED rosso lampeggia, ma ogni delay() blocca le righe qui sopra
// per mezzo secondo. Riscrivi questa parte usando millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Temporizzazione senza delay
1millis()
L'orologio millis()Tempi in unsigned longLampeggiare senza atteseDue LED, due velocitàLampeggiare mentre un pulsante cambia statoUna luce temporizzataEsercitati da solo: Playground Arduino