Raffaele Ilardo
Semaforo bidirezionale con Arduino
modalità standard o con luci gialle lampeggianti
© La parziale riproduzione dei contenuti di questa pagina è consentita a patto di citare l'indirizzo del sito e l'autore.
Le simulazioni del funzionamento di un semaforo tramite la piattaforma Arduino sono sicuramente tante; il progetto descritto in questa pagina è forse un tantino diverso, sia come realizzazione hardware, sia perchè consente di scegliere tra due modalità di funzionamento: il funzionamento o "mode" standard ed il funzionamento con sole luci gialle lampeggianti.
figura 1
Naturalmente, chi volesse realizzare l'impianto completo, per esempio in ambito modellistico, dovrà semplicemente raddoppiare i due gruppi di led, collegando quelli aggiunti in parallelo ai primi.
Dal punto di vista hardware, siccome per ogni gruppo di led quello acceso è sempre uno solo, ho preferito usare, per ciascun gruppo, una sola resistenza comune.
Lo schema del progetto è riportato in figura 1. Come già accennato, per ciascun gruppo di led è stata usata una sola resistenza; il suo valore è di 220 ohm.
Notiamo la presenza dello switch "mode" (un comune interruttore), che permette appunto di passare dal funzionamento standard con l'abituale sequenza verde, giallo, rosso, al funzionamento con sole luci gialle lampeggianti.
Ed ecco il codice da caricare nella memoria di Arduino:
#define red1 13
#define yel1 12
#define gre1 11
#define red2 7
#define yel2 6
Breve commento al codice:
- inizialmente vengono attribuiti i nomi da red1 a gre2 ai sei pin che comandano i led
- vengono poi definite la costante booleana "mode" e la costante multip; tale costante agisce da moltiplicatore: aumentando il suo valore, la durata dei cicli del semaforo aumenta
- i sei pin interessati vengono poi definiti come OUTPUT
- con mode = digitalRead(2); viene letto il pin 2 per attribuire un valore alla costante "mode": se l'interruttore mode-switch è chiuso, la costante "mode" assume valore 1; in caso contrario, la costante "mode" vale zero
-se è mode=1, viene eseguita tutta la sequenza verde, rosso, giallo
- se è mode=0 vengono eseguite le sole istruzioni che fanno lampeggiare i led gialli
Attenzione: nel passare dalla modalità standard a quella con giallo lampeggiante, occorre attendere alcuni secondi prima che il ciclo si stabilisca in modo regolare
#define gre2 5- inizialmente vengono attribuiti i nomi da red1 a gre2 ai sei pin che comandano i led
- vengono poi definite la costante booleana "mode" e la costante multip; tale costante agisce da moltiplicatore: aumentando il suo valore, la durata dei cicli del semaforo aumenta
- i sei pin interessati vengono poi definiti come OUTPUT
- con mode = digitalRead(2); viene letto il pin 2 per attribuire un valore alla costante "mode": se l'interruttore mode-switch è chiuso, la costante "mode" assume valore 1; in caso contrario, la costante "mode" vale zero
-se è mode=1, viene eseguita tutta la sequenza verde, rosso, giallo
- se è mode=0 vengono eseguite le sole istruzioni che fanno lampeggiare i led gialli
Attenzione: nel passare dalla modalità standard a quella con giallo lampeggiante, occorre attendere alcuni secondi prima che il ciclo si stabilisca in modo regolare
boolean mode=0;
int multip=3;
void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
mode = digitalRead(2);
if (mode==1){
digitalWrite(red2, HIGH);
digitalWrite(red1, LOW);
digitalWrite(gre1, HIGH);
delay(1000*multip);
digitalWrite(gre1, LOW);
digitalWrite(yel1, HIGH);
delay(200*multip);
digitalWrite(yel1, LOW);
digitalWrite(gre1, LOW);
digitalWrite(red1, HIGH);
digitalWrite(red2, LOW);
digitalWrite(gre2, HIGH);
delay(1000*multip);
digitalWrite(gre2, LOW);
digitalWrite(yel2, HIGH);
delay(200*multip);
digitalWrite(yel2, LOW);
}
if (mode==0){
digitalWrite(red1, LOW);
digitalWrite(red2, LOW);
digitalWrite(gre1, LOW);
digitalWrite(gre2, LOW);
digitalWrite(yel1, HIGH);
digitalWrite(yel2, HIGH);
delay(1000);
digitalWrite(yel1, LOW);
digitalWrite(yel2, LOW);
delay(1000);
}
}