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=d7e914609b0d5853ff98ad0b9d2f42655cc9257c;hb=b46e75aacd9a0d7e318d5ef06730bf1e701ae9f5;hp=619b85e2ba20fe3dd752cb0b09e7db3fd0c2adac;hpb=c2419a44138f249012bd7c0661ecd6d7af4c6a9d;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..d7e9146 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 * 1/3) { FSM1 = turn_red ; - timer = millis(); + timer += pausa * 1/3 ; } break; @@ -100,27 +106,28 @@ 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; case turn_yellow : - led2.Yellow(); + led2.Blue(); FSM2 = yellow ; break; case yellow : - if (millis() > timer + pausa / 3) { + if (millis() - timer >= pausa / 3) { FSM2 = turn_red ; - timer = millis(); + //timer += pausa * 2/3; } break; case turn_red : FSM2 = red ; FSM1 = turn_green; + timer = millis(); break; case red :