Menu
CoddyTech

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à.

challenge icon

Sfida

Medio

Il 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);
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Temporizzazione senza delay

Esercitati da solo: Playground Arduino