X-Git-Url: http://git.piffa.net/web?a=blobdiff_plain;f=advanced_projects%2Fstate_machine%2Fsemaforo_3_millis%2Fsemaforo_3_millis.ino;h=0b3c41563d7a8650d2c3de11f57f4e9506ef47b2;hb=98f12e9ba20d5b505b1b6506569e31af9ac3ba89;hp=fea0a67c367a64210eb68d645c831f0ac50b7ce5;hpb=0c94aa8e6fc849a034ad670198a3f1248eb173af;p=sketchbook_andrea diff --git a/advanced_projects/state_machine/semaforo_3_millis/semaforo_3_millis.ino b/advanced_projects/state_machine/semaforo_3_millis/semaforo_3_millis.ino index fea0a67..0b3c415 100644 --- a/advanced_projects/state_machine/semaforo_3_millis/semaforo_3_millis.ino +++ b/advanced_projects/state_machine/semaforo_3_millis/semaforo_3_millis.ino @@ -18,8 +18,8 @@ const byte input = 2; // PIN del bottone int pausa = 3000; long timer ; + enum states_available { // Stati della FMS - turn_green, // Dinamico, transizione green, // Statico wait_button, // Evento - Stimolo turn_yellow, // Dinamico, transizione @@ -42,9 +42,6 @@ RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte void loop() { switch (state) { -case turn_green : - state = green ; // Setta il prossimo state - break; case green: led.Green(); @@ -56,7 +53,7 @@ case green: case wait_button: if (digitalRead(input) == LOW) { - state = turn_yellow ; // Il passaggio di stato avviene alla pressione di un bottone + state = turn_yellow ; delay(20); // Debouncing, si potrebbe fare con millis() timer = millis(); }; @@ -81,7 +78,7 @@ case turn_red : case red : led.Red(); if (millis() - timer >= pausa) { - state = turn_green ; + state = green ; timer += pausa ; } break; @@ -102,9 +99,9 @@ Serial.println(state); } /* Domande: - 1. Introdurre un secondo semaforo che cambia stato quando viene attivato - lo stimolo. - 2. L'uso di delay() puo' essere limitativo: come rimediare? + 1. Fare in modo che nello stato verde venga recepito un'eventuale pressione + del bottone, venga comunque garantito un periodo minimo per il verde ma nel caso + sia stato premuto il bottone durante questo si passi poi direttamente al giallo. . . . @@ -116,6 +113,5 @@ Serial.println(state); . . Soluzioni -2. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis() - per gestire le pause. +1. Vedi esercizio: semaforo_rgb */