// Semaforo con pulsante precedenza pedoni
// label per switch-case
enum stati {rosso, verde, giallo, pedone};
// dichiaro le funzioni
void go(enum stati st);
// dichiaro variabili
enum stati stato; // variabile stato con valori label
bool led_stato; // variabile stato led (alto/basso)
bool LAMPEGGIO=0; // variabile led fisso o blink
int contatore; // conta blink
unsigned long t1; // timer (delay non bloccante)
void setup() {
pinMode(2, INPUT); // pulsante
pinMode(8, INPUT); // led azzurro
pinMode(10, INPUT); // led rosso
pinMode(11, INPUT); // led giallo
pinMode(12, INPUT); // led verde
digitalWrite(10, LOW); // inizializzo i led come "spenti"
digitalWrite(11, LOW);
digitalWrite(12, LOW);
led_stato=0; // inizia sa spento
contatore=0; // conto parte da 0
t1=millis(); // salvo timer
stato=rosso; // stato iniziale (partenza) ROSSO
}
void loop() {
switch(stato){
case rosso:
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
if((millis()-t1)>3000){
go(verde);
t1=millis();
}
break;
case verde:
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
if((millis()-t1)>3000){
go(giallo);
t1=millis();
}
break;
case giallo:
digitalWrite(12, LOW);
digitalWrite(10, LOW);
digitalWrite(11, !led_stato);
if((millis()-t1)>600){
digitalWrite(11, led_stato);
led_stato=!led_stato;
contatore++;
t1=millis();
}
if(contatore>6){
contatore=0;
led_stato=0;
go(rosso);
t1=millis();
}
break;
case pedone:
digitalWrite(12, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
digitalWrite(8, !led_stato);
if((millis()-t1)>1500 && !LAMPEGGIO){
LAMPEGGIO=1;
t1=millis();
}
if((millis()-t1)>600 && LAMPEGGIO){
digitalWrite(8, led_stato);
led_stato=!led_stato;
contatore++;
t1=millis();
}
if(contatore>6){
contatore=0;
led_stato=0;
LAMPEGGIO=0;
go(rosso);
t1=millis();
}
break;
}
if(digitalRead(2)){ // pressione del pulsante
go(pedone);
t1=millis();
}
}
//________________________________________________________________
// implementazioni Funzioni
void go(enum stati st){ // cambio stato ciclo switch-case
stato=st;
}