#define VERDE 0
#define GIALLO 1
#define ROSSO 2
struct Semaforo {
int pinVerde;
int pinGiallo;
int pinRosso;
};
struct Pulsante {
int pin;
bool premuto;
};
Semaforo semaforo1 = {8, 9, 10};
Semaforo semaforo2 = {5, 6, 7};
Pulsante pulsantePedonale = {2, false}; // Pin del pulsante per la chiamata pedonale
int tempoVerde = 10000; // Durata del verde per entrambi i semafori (10 secondi)
int tempoGiallo = 3000; // Durata del giallo per entrambi i semafori (3 secondi)
int tempoRosso = 2000; // Durata del rosso per entrambi i semafori (2 secondi)
int tempoChiamataPedonale = 5000; // Durata della chiamata pedonale (5 secondi)
void setup() {
pinMode(semaforo1.pinVerde, OUTPUT);
pinMode(semaforo1.pinGiallo, OUTPUT);
pinMode(semaforo1.pinRosso, OUTPUT);
pinMode(semaforo2.pinVerde, OUTPUT);
pinMode(semaforo2.pinGiallo, OUTPUT);
pinMode(semaforo2.pinRosso, OUTPUT);
pinMode(pulsantePedonale.pin, INPUT_PULLUP); // Configura il pulsante come INPUT con pull-up interno
}
void loop() {
// Semaforo 1: Verde, Semaforo 2: Rosso
cambiaLuce(&semaforo1, VERDE);
delay(tempoVerde);
cambiaLuce(&semaforo1, GIALLO);
delay(tempoGiallo);
cambiaLuce(&semaforo1, ROSSO);
delay(tempoRosso);
// Chiamata pedonale
if (chiamataPedonale()) {
attivaChiamataPedonale();
}
// Semaforo 1: Rosso, Semaforo 2: Verde
cambiaLuce(&semaforo2, VERDE);
delay(tempoVerde);
cambiaLuce(&semaforo2, GIALLO);
delay(tempoGiallo);
cambiaLuce(&semaforo2, ROSSO);
delay(tempoRosso);
}
void cambiaLuce(Semaforo* semaforo, int luce) {
digitalWrite(semaforo->pinVerde, LOW);
digitalWrite(semaforo->pinGiallo, LOW);
digitalWrite(semaforo->pinRosso, LOW);
switch (luce) {
case VERDE:
digitalWrite(semaforo->pinVerde, HIGH);
break;
case GIALLO:
digitalWrite(semaforo->pinGiallo, HIGH);
break;
case ROSSO:
digitalWrite(semaforo->pinRosso, HIGH);
break;
default:
break;
}
}
bool chiamataPedonale() {
if (digitalRead(pulsantePedonale.pin) == LOW) {
pulsantePedonale.premuto = true;
} else {
pulsantePedonale.premuto = false;
}
return pulsantePedonale.premuto;
}
void attivaChiamataPedonale() {
// Imposta semaforo 1 a rosso e semaforo 2 a giallo
cambiaLuce(&semaforo1, ROSSO);
cambiaLuce(&semaforo2, GIALLO);
delay(tempoGiallo);
// Chiamata pedonale
cambiaLuce(&semaforo2, ROSSO);
delay(tempoChiamataPedonale);
// Ripristina il funzionamento normale
cambiaLuce(&semaforo1, VERDE);
cambiaLuce(&semaforo1, GIALLO);
delay(tempoGiallo);
cambiaLuce(&semaforo1, ROSSO);
delay(tempoRosso);
}