MICHELEPISANI.IT
 

Doppio Semaforo con i LED ed Arduino

Simulazione di un Incrocio Stradale Gestito da un Doppio Semaforo

arduino - doppio semaforo con i led
Febbraio 16
07:572017

Definirlo un progetto non è proprio calzante ma reputarlo un valido esercizio da svolgere per chi si approccia ad Arduino direi che è la veste più indicata, mi riferisco alla realizzazione di un doppio semaforo, alternato come in una simulazione di un incrocio stradale, con i led.

L'esercizio prevede pertanto l'utilizzo di 6 led di cui 2 rossi, due gialli e due verdi (e 6 resistori da 220 Ohm) posizionati in modo da sembrare due semafori distinti e, tramite codice, fare in modo che le luci si alternino adeguatamente da evitare incidenti per malfunzionamento.
In breve quello che dovrà succedere è che mentre un semaforo (gruppo di 3 led) avrà la luce rossa accesa (e quella gialla e verde spenta) l'altro semaforo dovrà avere la luce verde accesa, dopo 3 secondi si accenderà contemporaneamente al verde anche il giallo e dopo altri due secondi il rosso (spegnendo il verde ed il giallo dello stesso semaforo), a questo punto ci saranno 2 secondi in cui entrambi i semafori dovranno rimanere con la sola luce rossa accesa (per far defluire le ultime auto passate) e la stessa sequenza dovrà essere prevista per il secondo semaforo per poi ricominciare il ciclo.

Di seguito lo schema elettrico del progetto:

arduino - doppio semaforo con i led
Fig. 1 - Schema per Arduino - Doppio Semaforo con i LED

Ed ecco lo sketch:

const int led_red_01 = 13;
const int led_yel_01 = 12;
const int led_gre_01 = 11;
const int led_red_02 = 7;
const int led_yel_02 = 6;
const int led_gre_02 = 5;

void setup() {
  pinMode(led_red_01, OUTPUT);
  pinMode(led_yel_01, OUTPUT);
  pinMode(led_gre_01, OUTPUT);
  pinMode(led_red_02, OUTPUT);
  pinMode(led_yel_02, OUTPUT);
  pinMode(led_gre_02, OUTPUT);
}

void loop() {
  digitalWrite(led_red_01, HIGH);
  digitalWrite(led_red_02, HIGH);
  delay(2000);
  digitalWrite(led_red_02, LOW);
  digitalWrite(led_gre_02, HIGH);
  delay(3000);
  digitalWrite(led_yel_02, HIGH);
  delay(2000);
  digitalWrite(led_gre_02, LOW);
  digitalWrite(led_yel_02, LOW);
  digitalWrite(led_red_02, HIGH);
  delay(2000);
  digitalWrite(led_red_01, LOW);
  digitalWrite(led_gre_01, HIGH);
  delay(3000);
  digitalWrite(led_yel_01, HIGH);
  delay(2000);
  digitalWrite(led_gre_01, LOW);
  digitalWrite(led_yel_01, LOW);
}

Nel video una breve dimostrazione del funzionamento dei semafori come descritto nell'esercizio:

Data la mancanza di esigenza di utilizzare codice ottimizzato è stato fatto uso della funzione delay() per consentire le pause tra l'accensione e lo spegnimento dei led, facci opresente che tale funzione mette in pausa Arduino che, per il periodo della durata del ritardo impostato, non risponderà ad altri comandi. Per progetti più complessi consiglio di avvalersi della funzione millis() al posto di quella delay(), come ho fatto ad esempio per il progetto "RILEVATORE DI GAS CON ALLARME SONORO E VISIVO, CON ARDUINO UNO".

Per consigli, suggerimenti o chiarimenti sentitevi liberi di lasciare un commento!

Tags
Condividi

Autore

Michele Pisani

Michele Pisani

Ho uno spiccato orientamento al problem-solving, se è troppo facile non mi diverto :)
Credo nella volontà e nel cambiamento perchè hanno fatto della mia passione il mio pane quotidiano.
Se devo descrivermi con una sola parola direi... "Concretezza", la mia stretta di mano è una garanzia.

0 Commenti

Non ci sono commenti

Nessuno ha ancora commentato questo articolo, fallo tu per primo!

Scrivi un Commento

Scrivi un Commento

Il tuo indirizzo email non sarà pubblicato.
I campi contrassegnati da un * sono obbligatori

Articoli e Argomenti correlati

Categorie popolari

Iscriviti alla mia newsletter

La tua e-mail con me sarà al sicuro.
Non fornirò mai le tue informazioni a nessuno!

Ultimi commenti

Michele

Ciao Antonio,
ma il tuo apk si chiama 'HelloWorld-release-unsigned.apk'?

Antonio

Grazie michele per la velocità con cui hai risposto, comunque ho seguito la tua guida passo per …

Michele

Ciao Antonio,
probabilmente stai utilizzando un'opzione non prevista per jarsigner e la …

Antonio

Ricevo questo errore da cosa dipende? Illegal option\: …