2 Semaforo RGB single FSM
5 Doppio semaforo, una via prinicipale (led) e una secondaria (secondary):
6 la via secondaria ottiene la precedenza alla pressione di un bottone.
8 Implementata con millis() invece che con delay(),
9 sono stati aggiuntu due stati per gestire lo stato yellow
10 del semafor secondario.
12 Lo sketch e' stato implementato con una sola FSM in cui si incrociano
13 gli stati dei due semafori.
15 - Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg
16 - Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
20 const byte input = 2; // PIN del bottone
23 boolean wait = 0; // Memoria bottone
25 enum states_available { // Stati della FMS
26 turn_green, // Dinamico, transizione
29 turn_red, // Dinamico, transizione
30 turn_sec_yellow,// Yellow per semaforo secondario
31 sec_yellow, // Statico
35 states_available state ;
39 pinMode(input, INPUT_PULLUP);
44 RGBLed led(11, 10, 9); // Semaforo principale
45 RGBLed secondary(8,7,6); // Semaforo secondario
53 state = green ; // Setta il prossimo state
58 if (wait && (millis() - timer >= pausa * 2/3)) {
63 if (digitalRead(input) == LOW) {
70 if (millis() - timer >= pausa / 3) {
84 if (millis() - timer >= pausa /3) {
85 state = turn_sec_yellow ;
90 case turn_sec_yellow :
96 if (millis() - timer >= pausa / 3) {
102 default: // In caso di default si fa giallo lampeggiante
112 Serial.print(millis());
113 Serial.print(" \t Stato attuale ");
114 Serial.println(state);
119 1. E' agevole inserire degli altri semafori?
120 2. Provare a inserire un altro semafori implementando una FSM
133 1. Be' bisogna ragionare sul loro comportamente in rapporto alla FSM principale, diciamo che non e' un approccio plug and play.
134 2. Vedi esercizio successivo.