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