]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/state_machine/semaforo_2_stimolo/semaforo_2_stimolo.ino
e31949ffd88225048b6f13bd1d1d3c2e030ac77f
[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 un secondo semaforo che cambia stato quando viene attivato
84     lo stimolo.
85  2. L'uso di delay() puo' essere limitativo: come rimediare?
86 .
87 .
88 .
89 .
90 .
91 .
92 .
93 .
94 .
95 .
96   Soluzioni
97 2. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis()
98    per gestire le pause.
99  */