Vogliamo realizzare il controllo di un sistema di semafori ad un incrocio stradale, composto da due semafori per le auto e uno per i pedoni, come rappresentato nella figura seguente:
I LED sono collegati tra le uscite digitali di Arduino e massa, in serie ad un resistore necessario a limitare la corrente che scorre in essi.
Generalmente si utilizza un resistore per ogni LED. In questo caso, perņ, i LED relativi alle luci dello stesso semaforo non sono mai accesi contemporaneamente, quindi si possono collegare al medesimo resistore. In questa configurazione, quando uno dei LED č acceso, l'altro (nel caso del semaforo pedonale) o gli altri due (nel caso dei semafori per le automobili) sono sottoposti ad una tensione inversa di pochi volt, che possono sopportare senza problemi.
Il programma č costituito essenzialmente dai comandi che gestiscono la sequenza di accensione e spegnimento dei vari LED, in modo tale da consentire la corretta alternanza nel transito di automobili sulle due strade. Contemporaneamente, viene comandato adeguatamente anche il semaforo pedonale.
Prima di ciņ, perņ, nella funzione setup()
, si devono inizializzare come uscite i pin dal numero 6 al numero 13, attraverso i quali comanderemo i LED:
void setup() {
pinMode(11, OUTPUT); // luce verde semaforo 1
pinMode(12, OUTPUT); // luce gialla semaforo 1
pinMode(13, OUTPUT); // luce rossa semaforo 1
pinMode(8, OUTPUT); // luce verde semaforo 2
pinMode(9, OUTPUT); // luce gialla semaforo 2
pinMode(10, OUTPUT); // luce rossa semaforo 2
pinMode(6, OUTPUT); // verde pedonale
pinMode(7, OUTPUT); // rosso pedonale
}
Nella funzione loop()
inseriamo le istruzioni di scrittura sulle uscite digitali necessarie ad accendere e spegnere i LED secondo la sequenza rappresentata dalla seguente tabella:
Semaforo 1 | Semaforo 2 | Semaforo pedonale |
---|---|---|
rosso | verde | rosso |
rosso | giallo | rosso |
rosso | rosso | rosso |
verde | rosso | verde |
giallo | rosso | verde lampeggiante |
rosso | rosso | rosso |
Ecco il codice:
void loop() {
digitalWrite(11, LOW); // spegnimento verde semaforo 1
digitalWrite(12, LOW); // spegnimento giallo semaforo 1
digitalWrite(13, HIGH); // accensione rosso semaforo 1
digitalWrite(10, LOW); // spegnimento rosso semaforo 2
digitalWrite(9, LOW); // spegnimento giallo semaforo 2
digitalWrite(8, HIGH); // accensione verde semaforo 2
digitalWrite(6, LOW); // spegnimento verde semaforo pedonale
digitalWrite(7, HIGH); // accensione rosso semaforo pedonale
delay(12000); // attesa di 12 secondi
digitalWrite(8, LOW); // spegnimento verde semaforo 2
digitalWrite(9, HIGH); // accensione giallo semaforo 2
delay(6000); // attesa di 6 secondi
digitalWrite(9, LOW); // spegnimento giallo semaforo 2
digitalWrite(10, HIGH); // accensione rosso semaforo 2
delay(4000); // attesa di 4 secondi
digitalWrite(13, LOW); // spegnimento rosso semaforo 1
digitalWrite(12, LOW); // spegnimento giallo semaforo 1
digitalWrite(11, HIGH); // accensione verde semaforo 1
digitalWrite(8, LOW); // spegnimento verde semaforo 2
digitalWrite(9, LOW); // spegnimento giallo semaforo 2
digitalWrite(10, HIGH); // accensione rosso semaforo 2
digitalWrite(7, LOW); // spegnimento rosso semaforo pedonale
digitalWrite(6, HIGH); // accensione verde semaforo pedonale
delay(16000); // attesa di 16 secondi
digitalWrite(11, LOW); // spegnimento verde semaforo 1
digitalWrite(12, HIGH); // accensione giallo semaforo 1
// ciclo per il lampeggiamento del verde del semaforo pedonale
for (int i=0; i<10; i++) {
digitalWrite(6, LOW);
delay(500);
digitalWrite(6, HIGH);
delay(500);
}
digitalWrite(6, LOW);// spegnimento verde semaforo pedonale
digitalWrite(7, HIGH);// accensione rosso semaforo pedonale
digitalWrite(12, LOW); // spegnimento giallo semaforo 1
digitalWrite(13, HIGH); // accensione rosso semaforo 1
delay(4000); // attesa di 4 secondi
}