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
21 enum states_available { // Stati della FMS
23 wait_button, // Evento - Stimolo
24 turn_yellow, // Dinamico, transizione
26 turn_red, // Dinamico, transizione
30 states_available state ;
34 pinMode(input, INPUT_PULLUP);
39 RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte
40 // della classe RGBLed
47 if (millis() - timer >= pausa * 2/3) {
49 timer += pausa * 2/3 ;
54 if (digitalRead(input) == LOW) {
55 state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone
56 delay(20); // Debouncing, si potrebbe fare con millis()
67 if (millis() - timer >= pausa / 3) {
79 if (millis() - timer >= pausa) {
85 default: // In caso di default si fa giallo lampeggiante
94 Serial.print(millis());
95 Serial.print(" \t Stato attuale ");
96 Serial.println(state);
101 1. Fare in modo che nello stato verde venga recepito un'eventuale pressione
102 del bottone, venga comunque garantito un periodo minimo per il verde ma nel caso
103 sia stato premuto il bottone durante questo si passi poi direttamente al giallo.
115 1. Vedi esercizio: semaforo_rgb