X-Git-Url: http://git.piffa.net/web?a=blobdiff_plain;f=advanced_projects%2Fstate_machine%2Fsemaforo_5_doppia_fsm%2Fsemaforo_5_doppia_fsm.ino;h=db72e6a95ee642a0f27089f5cef78deb28461d48;hb=7467d081c3e1ca22c977f50d81b5167dbe432f2a;hp=619b85e2ba20fe3dd752cb0b09e7db3fd0c2adac;hpb=b15c46840c12896bd1b29dc360db4f30f8b5dfa4;p=sketchbook_andrea diff --git a/advanced_projects/state_machine/semaforo_5_doppia_fsm/semaforo_5_doppia_fsm.ino b/advanced_projects/state_machine/semaforo_5_doppia_fsm/semaforo_5_doppia_fsm.ino index 619b85e..db72e6a 100644 --- a/advanced_projects/state_machine/semaforo_5_doppia_fsm/semaforo_5_doppia_fsm.ino +++ b/advanced_projects/state_machine/semaforo_5_doppia_fsm/semaforo_5_doppia_fsm.ino @@ -1,15 +1,21 @@ /* - Semaforo RGB + Semaforo con doppia FSM - Un singolo semaforo costruito col paradigma delle macchine a stato. - Viene utilizzato un oggetto della libreria common per gestire il LED. +Due FSM indipendenti per la gestione di ognuno dei 2 semafori +che costituiscono un incrocio. Le due FSM possono modificare +i rispettivi stati. - Uno stimolo esterno rappresentato dalla pressione di un bottone - causa il passaggio di stato. +Un singolo semaforo costruito col paradigma delle macchine a stato. +Viene utilizzato un oggetto della libreria common per gestire il LED. - Implementata con millis() invece che con delay(), - sono stati aggiuntu due stati per meglio gestire lo stato yellow. +Uno stimolo esterno rappresentato dalla pressione di un bottone +causa il passaggio di stato. +Implementata con millis() invece che con delay(), +sono stati aggiuntu due stati per meglio gestire lo stato yellow. + +- Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg +- Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png */ #include @@ -49,17 +55,17 @@ switch (FSM1) { break; case green: - if (millis() > timer + pausa * 2/3) { + if (millis() - timer >= pausa * 2/3) { FSM1 = wait_button ; - timer = millis(); + timer += pausa * 2/3; } break; case wait_button: if (digitalRead(input) == LOW) { + delay(20); // Debouncing, si potrebbe fare con millis() o un interrupt FSM1 = turn_yellow ; timer = millis(); - delay(20); // Debouncing, si potrebbe fare con millis() }; break; @@ -70,9 +76,9 @@ switch (FSM1) { break; case yellow : - if (millis() > timer + pausa * 2/3) { + if (millis() - timer >= pausa * 2/3) { FSM1 = turn_red ; - timer = millis(); + timer += pausa * 2/3 ; } break; @@ -100,9 +106,9 @@ switch (FSM2) { break; case green: - if (millis() > timer + pausa * 2/3) { + if (millis() - timer >= pausa * 2/3) { FSM2 = turn_yellow; - timer = millis(); + timer += pausa * 2/3; } break; @@ -112,9 +118,9 @@ switch (FSM2) { break; case yellow : - if (millis() > timer + pausa / 3) { + if (millis() - timer >= pausa / 3) { FSM2 = turn_red ; - timer = millis(); + timer += pausa * 2/3; } break;