Sistema semaforico con Arduino

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:

Componenti necessari

Circuito

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

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 1Semaforo 2Semaforo pedonale
rossoverderosso
rossogiallorosso
rossorossorosso
verderossoverde
giallorossoverde lampeggiante
rossorossorosso

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
}