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 * 1/3) {
81 timer += pausa * 1/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;
134 led2.Red(); // Aggiorniamo il LED in questo stato invece che nel precedente
135 // per entrare nel primo ciclo di esecuzione con il LED rosso
138 default: // In caso di default si fa giallo lampeggiante
146 Serial.print(millis());
147 Serial.print(" \t Stato attuale FSM1: ");
149 Serial.print(" - FSM2: ");
150 Serial.println(FSM2);
154 1. E' piu' semplice ora inserire degli altri oggetti nello sketch?
155 2. Gli eventi sono condivisi? Le varie FSM hanno modo di scambiarsi
156 informazioni sui relativi stati?
157 3. Creare un dispatcher degli eventi al quale le varie FSM possono
170 1. Si, per quanto le 2 FSM non siano indipendenti l'una dall'altra.
171 2. No, c'e' un solo flusso degli eventi, il blocco di una delle FSM
172 puo' causare lo stop di tutto il sistema.