const byte input = 2; // PIN del bottone
int pausa = 3000;
long timer ;
+
enum states_available { // Stati della FMS
- turn_green, // Dinamico, transizione
green, // Statico
wait_button, // Evento - Stimolo
turn_yellow, // Dinamico, transizione
void loop() {
switch (state) {
-case turn_green :
- state = green ; // Setta il prossimo state
- break;
case green:
led.Green();
case wait_button:
if (digitalRead(input) == LOW) {
- state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone
+ state = turn_yellow ;
delay(20); // Debouncing, si potrebbe fare con millis()
timer = millis();
};
case red :
led.Red();
if (millis() - timer >= pausa) {
- state = turn_green ;
+ state = green ;
timer += pausa ;
}
break;
}
/* Domande:
- 1. Introdurre un secondo semaforo che cambia stato quando viene attivato
- lo stimolo.
- 2. L'uso di delay() puo' essere limitativo: come rimediare?
+ 1. Fare in modo che nello stato verde venga recepito un'eventuale pressione
+ del bottone, venga comunque garantito un periodo minimo per il verde ma nel caso
+ sia stato premuto il bottone durante questo si passi poi direttamente al giallo.
.
.
.
.
.
Soluzioni
-2. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis()
- per gestire le pause.
+1. Vedi esercizio: semaforo_rgb
*/