Pulsante di attraversamento
Fa parte della sezione Progetti del percorso Arduino di Coddy. Lezione 3 di 24.
Le persone a piedi hanno bisogno di un modo per chiedere di attraversare la strada. Il pulsante blu sul pin 2 è il pulsante di attraversamento: se viene premuto durante il verde, il verde termina subito, così le auto passano al giallo e poi al rosso.
Poiché le luci funzionano con millis(), loop() passa per lo stato verde migliaia di volte al secondo e può leggere il pulsante ogni volta, oltre all'orologio. Il verde termina quando una delle due condizioni è vera, come indica || (oppure):
case GREEN:
if (millis() - lightStart >= 3000 || digitalRead(buttonPin) == LOW) {
// passa al giallo
}
break;Il pulsante collega il pin 2 a massa, quindi imposta il pin su INPUT_PULLUP: legge HIGH finché il pulsante non lo porta a LOW.
Solo lo stato verde legge il pulsante. Durante il giallo e il rosso, le auto si stanno già fermando, e il giallo dura per tutto il suo secondo, così i conducenti hanno il tempo di fermarsi.
Sfida
MedioAggiungi il pulsante di attraversamento sul pin 2:
- imposta il pin 2 su
INPUT_PULLUP - mentre la luce è verde, una pressione termina subito il verde (la luce diventa gialla)
- il giallo e il rosso mantengono i propri tempi, che il pulsante sia premuto o meno
Premi Run, attendi che arrivi il verde, premi il pulsante blu, poi Check.
Provalo tu
// Le luci per le auto
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;
// Il LED integrato nella scheda: la spia di stato del controller
const int statusPin = 13;
enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0; // quando si è accesa la luce attuale
bool statusOn = false;
unsigned long lastBlink = 0;
// 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);
pinMode(statusPin, OUTPUT);
showLight(greenPin);
}
void loop() {
unsigned long now = millis();
switch (light) {
case GREEN:
if (now - lightStart >= 3000) {
light = YELLOW;
lightStart = now;
showLight(yellowPin);
}
break;
case YELLOW:
if (now - lightStart >= 1000) {
light = RED;
lightStart = now;
showLight(redPin);
}
break;
case RED:
if (now - lightStart >= 3000) {
light = GREEN;
lightStart = now;
showLight(greenPin);
}
break;
}
// La spia di stato lampeggia ogni 500 ms, indipendentemente dalle luci per le auto.
if (now - lastBlink >= 500) {
lastBlink = now;
if (statusOn) {
statusOn = false;
digitalWrite(statusPin, LOW);
} else {
statusOn = true;
digitalWrite(statusPin, HIGH);
}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Progetti
1Semaforo
Ciclo del semaforoSemaforo con millis()Pulsante di attraversamentoSegnale pedonale e cicalinoEsercitati da solo: Playground Arduino