4 Un singolo semaforo costruito col paradigma delle macchine a stato.
5 Viene utilizzato un oggetto della libreria common per gestire il LED.
7 Uno stimolo esterno rappresentato dalla pressione di un bottone
8 causa il passaggio di stato.
10 Implementata con millis() invece che con delay(),
11 sono stati aggiuntu due stati per meglio gestire lo stato yellow.
13 - Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg
14 - Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
18 const byte input = 2; // PIN del bottone
22 enum states_available { // Stati della FMS
24 wait_button, // Evento - Stimolo
25 turn_yellow, // Dinamico, transizione
27 turn_red, // Dinamico, transizione
31 states_available state ;
35 pinMode(input, INPUT_PULLUP);
40 RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte
41 // della classe RGBLed
48 if (millis() - timer >= pausa * 2/3) {
50 timer += pausa * 2/3 ;
55 if (digitalRead(input) == LOW) {
57 delay(20); // Debouncing, si potrebbe fare con millis()
68 if (millis() - timer >= pausa / 3) {
80 if (millis() - timer >= pausa) {
86 default: // In caso di default si fa giallo lampeggiante
95 Serial.print(millis());
96 Serial.print(" \t Stato attuale ");
97 Serial.println(state);
102 1. Fare in modo che nello stato verde venga recepito un'eventuale pressione
103 del bottone, venga comunque garantito un periodo minimo per il verde ma nel caso
104 sia stato premuto il bottone durante questo si passi poi direttamente al giallo.
116 1. Vedi esercizio: semaforo_rgb