]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/state_machine/semaforo_2_1_doppio/semaforo_2_1_doppio.ino
State machines
[sketchbook_andrea] / advanced_projects / state_machine / semaforo_2_1_doppio / semaforo_2_1_doppio.ino
1 /*
2    Incrocio RGB
3
4    Un incrocio costituito da due strade, una principale e una secondaria.
5    La via viene concessa al secondario alla pressione di un bottone,
6    il secondario cambia automaticamente dopo una pausa.
7    Viene utilizzato un oggetto della libreria common per gestire i LED.
8
9    Uno stimolo esterno rappresentato dalla pressione di un bottone
10    causa il passaggio di stato.
11
12  */
13
14 #include <common.h>
15 const byte input = 2; // PIN del bottone
16 int pausa = 3000;
17 enum states_available { // Stati della FMS
18     turn_green,    // Dinamico, transizione
19     green,         // Statico
20     wait_button,
21     turn_red,
22     red
23 };
24
25 states_available FSM1  ;
26 states_available FSM2 ;
27
28
29 void setup() {
30   pinMode(input, INPUT_PULLUP);
31   Serial.begin(9600);
32   Serial.flush();
33 }
34
35 RGBLed led_main(11, 10, 9); 
36 RGBLed led_secondary(8, 7, 6); 
37
38 void loop() {
39 switch (FSM1) {
40     case turn_green :
41     led_main.Green();
42     FSM1 = green ; // Setta il prossimo state
43     FSM2 = red ;    // Setta il prossimo state
44     break;
45
46     case green:
47     delay(pausa * 2/3);
48     FSM1 = wait_button ;
49     break;
50
51     case wait_button:
52     if (digitalRead(input) == LOW) { 
53     FSM1 = turn_red ; // Il passaggio di stato avviene alla pressione di un bottone
54     };
55     delay(20);
56     break;
57
58     case turn_red :
59     led_main.Yellow();
60     delay(pausa/3);
61     led_main.Red();
62     FSM1 = red ;
63     FSM2 = turn_green; // Stimolo al semafor secondario
64     break;
65
66     case red :
67     //delay(pausa);
68     //main = turn_green ;
69     break;
70 }
71 switch (FSM2) {
72     case turn_green :
73     led_secondary.Green();
74     FSM2 = green ; // Setta il prossimo state
75     break;
76
77     case green:
78     delay(pausa * 2/3);
79     FSM2 = turn_red ; // Niente stimoli
80     break;
81
82     case turn_red :
83     led_secondary.Yellow();
84     delay(pausa/3);
85     FSM1 = turn_green ;
86     FSM2 = red ;
87     break;
88
89     case red :
90     led_secondary.Red();
91     break;
92 }
93
94 Serial.print(millis()); 
95 Serial.print(" \t Stato attuale Main: ");
96 Serial.print(FSM1);
97 Serial.print(", secondary: ");
98 Serial.println(FSM2);
99
100 }