Menu
CoddyTech

Semaforo con millis()

Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 2 di 24.

Durante ogni delay(3000) la scheda non fa nient'altro, quindi non potrebbe rilevare il pulsante di attraversamento che verrà aggiunto nel passaggio successivo. La temporizzazione passa a millis().

La luce è una macchina a stati: si trova sempre in uno stato (verde, giallo o rosso) e passa al successivo quando è rimasta in quello stato abbastanza a lungo. Un enum assegna un nome agli stati, una variabile contiene lo stato corrente e un'altra indica quando è iniziato:

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

Il primo stato è verde, quindi accendi la luce verde in setup(). A ogni passaggio di loop(), uno switch verifica se lo stato corrente è durato abbastanza a lungo e solo allora passa allo stato successivo e cambia le luci:

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Non c'è niente che attende, quindi loop() è libero per altre attività. Dimostralo con una spia di stato: fai lampeggiare il LED integrato della scheda, sul pin 13, ogni 500 ms.

challenge icon

Sfida

Medio

Riscrivi la temporizzazione senza delay():

  • mantieni il verde acceso per 3000 ms, il giallo per 1000 ms e il rosso per 3000 ms
  • usa un enum per i tre stati, uno switch e millis()
  • accendi il verde in setup() e chiama showLight() solo quando cambia lo stato
  • fai lampeggiare il pin 13 ogni 500 ms (500 ms acceso, 500 ms spento), sempre

Premi Run, poi Check.

Provalo tu

// Le luci delle auto
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// Accendi una luce e spegni le altre due.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
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 Progetti

Esercitati da solo: Playground Arduino