2 Semaforo con doppia FSM
4 Due FSM indipendenti per la gestione di ognuno dei 2 semafori
5 che costituiscono un incrocio. Le due FSM possono modificare
8 Un singolo semaforo costruito col paradigma delle macchine a stato.
9 Viene utilizzato un oggetto della libreria common per gestire il LED.
11 Uno stimolo esterno rappresentato dalla pressione di un bottone
12 causa il passaggio di stato.
14 Implementata con millis() invece che con delay(),
15 sono stati aggiuntu due stati per meglio gestire lo stato yellow.
17 - Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg
18 - Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
22 const byte input = 2; // PIN del bottone
25 enum states_available { // Stati della FMS
26 turn_green, // Transizione
28 wait_button, // Evento - Stimolo
29 turn_yellow, // transizione
31 turn_red, // transizione
35 states_available FSM1 ;
36 states_available FSM2 ;
40 pinMode(input, INPUT_PULLUP);
45 RGBLed led1(11, 10, 9); //Istanziamo un oggetto led facente parte
46 RGBLed led2(8,7,6); //Istanziamo un oggetto led facente parte
47 // della classe RGBLed
53 FSM1 = green ; // Setta il prossimo state
54 FSM2 = red ; // Setta il prossimo state
58 if (millis() - timer >= pausa * 2/3) {
65 if (digitalRead(input) == LOW) {
66 delay(20); // Debouncing, si potrebbe fare con millis() o un interrupt
79 if (millis() - timer >= pausa * 2/3) {
81 timer += pausa * 2/3 ;
94 default: // In caso di default si fa giallo lampeggiante
105 FSM2 = green ; // Setta il prossimo state
109 if (millis() - timer >= pausa * 2/3) {
111 timer += pausa * 2/3;
121 if (millis() - timer >= pausa / 3) {
123 timer += pausa * 2/3;
133 led2.Red(); // Aggiorniamo il LED in questo stato invece che nel precedente
134 // per entrare nel primo ciclo di esecuzione con il LED rosso
137 default: // In caso di default si fa giallo lampeggiante
145 Serial.print(millis());
146 Serial.print(" \t Stato attuale FSM1: ");
148 Serial.print(" - FSM2: ");
149 Serial.println(FSM2);
153 1. E' piu' semplice ora inserire degli altri oggetti nello sketch?
154 2. Gli eventi sono condivisi? Le varie FSM hanno modo di scambiarsi
155 informazioni sui relativi stati?
156 3. Creare un dispatcher degli eventi al quale le varie FSM possono
169 1. Si, per quanto le 2 FSM non siano indipendenti l'una dall'altra.
170 2. No, c'e' un solo flusso degli eventi, il blocco di una delle FSM
171 puo' causare lo stop di tutto il sistema.