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.
Sfida
MedioRiscrivi la temporizzazione senza delay():
- mantieni il verde acceso per 3000 ms, il giallo per 1000 ms e il rosso per 3000 ms
- usa un
enumper i tre stati, unoswitchemillis() - accendi il verde in
setup()e chiamashowLight()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);
}
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