]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/state_machine/semaforo_2_1_stimolo/semaforo_2_1_stimolo.ino
b15183824b4962b4f226ea22f9ff451f360d06a4
[sketchbook_andrea] / advanced_projects / state_machine / semaforo_2_1_stimolo / semaforo_2_1_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 - Schema per un led RGB: https://lab.piffa.net/schemi/rgb.jpg
11 - Schema per un bottone: https://www.arduino.cc/en/uploads/Tutorial/inputPullupButton.png
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,   // Evento - Stimolo
21     turn_red,      // Dinamico, transizione
22     red            // Statico
23 };
24
25 states_available state  ;
26
27
28 void setup() {
29   pinMode(input, INPUT_PULLUP);
30   Serial.begin(9600);
31   Serial.flush();
32 }
33
34 RGBLed led(11, 10, 9); //Istanziamo un oggetto led facente parte
35                        // della classe RGBLed
36
37 void loop() {
38 switch (state) {
39     case turn_green :
40     led.Green();
41     state = green ; // Setta il prossimo state
42     break;
43
44     case green:
45     delay(pausa * 2/3);
46     state = wait_button ;
47     break;
48
49     case wait_button:
50     if (digitalRead(input) == LOW) { 
51     state = turn_red ; // Il passaggio di stato avviene alla pressione di un bottone
52     delay(20);
53     };
54
55     break;
56
57     case turn_red :
58     led.Yellow();
59     delay(pausa/3);
60     state = red ;
61     break;
62
63     case red :
64     led.Red();
65     delay(pausa);
66     state = turn_green ;
67     break;
68
69     default:    // In caso di default si fa giallo lampeggiante
70     led.Yellow();
71     delay(pausa/3);
72     led.Off();
73     delay(pausa/3);
74     break;
75
76 }
77 Serial.print(millis()); 
78 Serial.print(" \t Stato attuale ");
79 Serial.println(state);
80
81 }
82
83 /* Domande:
84  1. Introdurre una memoria nello stato green che tenga traccia della pressione del bottone per lo stato successivo.
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 1. Vedi sketch: semaforo_rgb
100 3. Si potrebbe utilizzare un interrupt per gli stimoli oppure millis()
101    per gestire le pause.
102  */