Un doppio semaforo con Arduino

Per i miei bimbi ho voluto realizzare un vero semaforo, come quelli che si trovano per strada, quindi 4 torrette con i tre colori rosso, giallo e verde, pilotate in parallelo due a due. Lo sketch al momento ha dei tempi impostati per il cambio di stato, in futuro penso di aggiungere un potenziometro collegato ad un ingresso analogico per variare a posteriori il tempo di persistenza del rosso. Essendo uno dei miei primi progetti ho usato l’istruzione goto e le labels, andrebbero evitate. Probabilmente oggi scriverei un programma strutturato meglio e piu corto, ma ho altri progetti, per cui questo funziona, i bimbi sono felici e lo lascio così :-)

Il pulsante cambia la modalità diurna (semaforo attivo) in notturna (semaforo lampeggiante).

Ecco lo sketch molto semplice, nessuna libreria richiesta; progettato con UNO poi attivato nel progetto finale con Iduino micro che è grande come una moneta, alimentato da pila 9V:

bool swap = 0; // se 1 lampeggia il giallo, se 0 va il semaforo, commuta su button premuto

void setup() {
// PINS: 2 pulsante – 3 verde – 4 giallo – 5 rosso – 8 verde2 – 9 giallo2 – 10 rosso2
pinMode(2, INPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
}

void loop() {
inizio:
delay (500);
while (swap == 0 ) {
digitalWrite(3, HIGH); digitalWrite (8, LOW);
digitalWrite(4, LOW); digitalWrite (9, LOW);
digitalWrite(5, LOW); digitalWrite (10, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
for (int i = 0; i <= 30; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, HIGH); digitalWrite (3, LOW);
digitalWrite(9, LOW); digitalWrite (4, LOW);
digitalWrite(10, LOW); digitalWrite (5, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
for (int i = 0; i <= 30; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (100);
}
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
for (int i = 0; i <= 50; i++) {
if (digitalRead(2) == 1) {
swap = 1;
goto inizio;
}
delay (5);
}
}
while (swap == 1 ) {
digitalWrite(3, LOW); digitalWrite (8, LOW);
digitalWrite(4, HIGH); digitalWrite (9, LOW);
digitalWrite(5, LOW); digitalWrite (10, LOW);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 0;
goto inizio;
}
delay (100);
}
digitalWrite(3, LOW); digitalWrite (8, LOW);
digitalWrite(4, LOW); digitalWrite (9, HIGH);
digitalWrite(5, LOW); digitalWrite (10, LOW);
for (int i = 0; i <= 5; i++) {
if (digitalRead(2) == 1) {
swap = 0;
goto inizio;
}
delay (100);
}
}

}

Lascia un commento