]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/state_machine/semaforo_2_stimolo/semaforo_2_stimolo.ino
state machine
[sketchbook_andrea] / advanced_projects / state_machine / semaforo_2_stimolo / semaforo_2_stimolo.ino
1 /*
2    Semaforo RGB
3
4    Un singolo semaforo costruito col paradigma delle macchine a stato.
5    Viene utilizzato un oggetto della libreria common per gestire il LED.
6
7    Uno stimolo esterno rappresentato dalla pressione di un bottone
8    causa il passaggio di stato.
9
10    */
11
12 #include <common.h>
13 const byte input = 2; // PIN del bottone
14 int pausa = 3000;
15 enum states_available { // Stati della FMS
16     turn_green,    // Dinamico, transizione
17     green,         // Statico
18     wait_button,   // Evento - Stimolo
19     turn_red,      // Dinamico, transizione
20     red            // Statico
21 };
22
23 states_available state  ;
24
25
26 void setup() {
27   pinMode(input, INPUT_PULLUP);
28   Serial.begin(9600);
29   Serial.flush();
30 }
31
32 RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte
33                        // della classe RGBLed
34
35 void loop() {
36 switch (state) {
37     case turn_green :
38     led.Green();
39     state = green ; // Setta il prossimo state
40     break;
41
42     case green:
43     delay(pausa * 2/3);
44     state = wait_button ;
45     break;
46
47     case wait_button:
48     if (digitalRead(input) == LOW) { 
49     state = turn_red ; // Il passaggio di stato avviene alla pressione di un bottone
50     delay(20);
51     };
52
53     break;
54
55     case turn_red :
56     led.Yellow();
57     delay(pausa/3);
58     led.Red();
59     delay(pausa);
60     state = red ;
61     break;
62
63     case red :
64     delay(pausa);
65     state = turn_green ;
66     break;
67
68     default:    // In caso di default si fa giallo lampeggiante
69     led.Yellow();
70     delay(pausa/3);
71     led.Off();
72     delay(pausa/3);
73     break;
74
75 }
76 Serial.print(millis()); 
77 Serial.print(" \t Stato attuale ");
78 Serial.println(state);
79
80 }
81
82 /* Domande:
83  1. Introdurre una memoria nello stato green che tenga traccia della pressione del bottone
84     per lo stato succiessivo.
85  2. Introdurre un secondo semaforo che cambia stato quando viene attivato
86     lo stimolo.
87  3. L'uso di delay() puo' essere limitativo: come rimediare?
88 .
89 .
90 .
91 .
92 .
93 .
94 .
95 .
96 .
97 .
98   Soluzioni
99 3. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis()
100    per gestire le pause.
101  */