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.
16 const byte input = 2; // PIN del bottone
19 enum states_available { // Stati della FMS
20 turn_green, // Dinamico, transizione
22 wait_button, // Evento - Stimolo
23 turn_yellow, // Dinamico, transizione
25 turn_red, // Dinamico, transizione
29 states_available state ;
33 pinMode(input, INPUT_PULLUP);
38 RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte
39 // della classe RGBLed
44 state = green ; // Setta il prossimo state
49 if (millis() - timer >= pausa * 2/3) {
51 timer += pausa * 2/3 ;
56 if (digitalRead(input) == LOW) {
57 state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone
58 delay(20); // Debouncing, si potrebbe fare con millis()
69 if (millis() - timer >= pausa * 2/3) {
81 if (millis() - timer >= pausa) {
87 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. Introdurre un secondo semaforo che cambia stato quando viene attivato
104 2. L'uso di delay() puo' essere limitativo: come rimediare?
116 2. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis()
117 per gestire le pause.