/*
- Semaforo RGB
+ Semaforo con doppia FSM
- Un singolo semaforo costruito col paradigma delle macchine a stato.
- Viene utilizzato un oggetto della libreria common per gestire il LED.
+Due FSM indipendenti per la gestione di ognuno dei 2 semafori
+che costituiscono un incrocio. Le due FSM possono modificare
+i rispettivi stati.
- Uno stimolo esterno rappresentato dalla pressione di un bottone
- causa il passaggio di stato.
+Un singolo semaforo costruito col paradigma delle macchine a stato.
+Viene utilizzato un oggetto della libreria common per gestire il LED.
- Implementata con millis() invece che con delay(),
- sono stati aggiuntu due stati per meglio gestire lo stato yellow.
+Uno stimolo esterno rappresentato dalla pressione di un bottone
+causa il passaggio di stato.
+Implementata con millis() invece che con delay(),
+sono stati aggiuntu due stati per meglio gestire lo stato yellow.
+
+- Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg
+- Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
*/
#include <common.h>
break;
case green:
- if (millis() > timer + pausa * 2/3) {
+ if (millis() - timer >= pausa * 2/3) {
FSM1 = wait_button ;
- timer = millis();
+ timer += pausa * 2/3;
}
break;
case wait_button:
if (digitalRead(input) == LOW) {
+ delay(20); // Debouncing, si potrebbe fare con millis() o un interrupt
FSM1 = turn_yellow ;
timer = millis();
- delay(20); // Debouncing, si potrebbe fare con millis()
};
break;
break;
case yellow :
- if (millis() > timer + pausa * 2/3) {
+ if (millis() - timer >= pausa * 2/3) {
FSM1 = turn_red ;
- timer = millis();
+ timer += pausa * 2/3 ;
}
break;
break;
case green:
- if (millis() > timer + pausa * 2/3) {
+ if (millis() - timer >= pausa * 2/3) {
FSM2 = turn_yellow;
- timer = millis();
+ timer += pausa * 2/3;
}
break;
break;
case yellow :
- if (millis() > timer + pausa / 3) {
+ if (millis() - timer >= pausa / 3) {
FSM2 = turn_red ;
- timer = millis();
+ timer += pausa * 2/3;
}
break;