]> git.piffa.net Git - sketchbook_andrea/blob - advanced_projects/state_machine/blink_2_trans/blink_2_trans.ino
4abe5995e1a984333761785aa9a4b8e28baa4280
[sketchbook_andrea] / advanced_projects / state_machine / blink_2_trans / blink_2_trans.ino
1 /*
2   Blink FSM
3
4   Accensione e spegnimanto di un LED utilizzando
5   una FSM  con 4 stati, statici e di transizione.
6
7 Costrutto switch basato su uno struct.
8
9  */
10
11 // Dichiarazione variabili
12 int led = 11; // PWM
13 int pausa = 1000;  // Variabile richiambile nel corso dell'esecuzione
14 byte lum = 255 ;
15
16 void setup() {
17     // Inizializziamo il PIN 13 come OUTPUT
18     pinMode(led, OUTPUT);
19 }
20
21 enum fsm_stati { // Stati della FMS
22     on,     // Statico
23     to_off, // Transizione
24     off,
25     to_on
26 };
27
28 fsm_stati stato ;
29
30 void loop() {
31     switch (stato) {
32     case on :
33         // Operativa: Machine
34         digitalWrite(led, HIGH);  // Mette il PIN del LED in stato acceso
35         delay(pausa);              
36
37         // Stati
38         stato = to_off ; // Setta il prossimo state
39         // lum = 255;
40         break;
41
42     case to_off :
43         while (lum > 0) {
44             lum-- ;
45             analogWrite(led, lum);  // Mette il PIN del LED in stato acceso
46             delay(1);              
47         }
48
49         stato = off ; // Setta il prossimo state
50         break;
51
52     case off:
53         digitalWrite(led, LOW);   // Mette il PIN del LED in stato spento
54         delay(pausa);             
55
56         stato = to_on ;
57         // lum = 0;
58         break;
59
60     case to_on :
61         while (lum < 255) {
62             lum++ ;
63             analogWrite(led, lum);  // Mette il PIN del LED in stato acceso
64             delay(1);              
65         }
66
67         stato = on ; // Setta il prossimo state
68         break;
69
70     default: // Opzionale, quando non si verificano altre condizioni
71         break;
72     }
73 }
74
75 /* Domande:
76
77  1.Cosa comporta l'uso della funzione delay?
78  2.Come si puo' modificare lo sketch per poter eseguire piu' conpiti contemporaneamente?
79
80 Esercizi successivi:
81 - Creare una FSM con un LED RGB avente due stati Red e Green, una transizione yellow tra i due.
82 - Creare una FSM in cui il passaggio di stato e' causato da un evento esterno, es la pressione di un bottone.
83 - Creare una FSM per la gestione di un semaforo 
84         (esempio disponibile in sketchbook_andrea/advanced_projects/state_machine )
85  .
86  .
87  .
88  .
89  .
90  .
91  .
92  .
93  .
94  .
95  .
96  .
97  .
98  .
99  .
100  .
101  .
102  .
103  .
104  .
105  Soluzioni:
106
107  1.Delay rende il codice blocking, null'altro puo' essere eseguito durante i delay
108  2.Si potrebbe utilizzare millis(), vedi esercizi multitasking
109    oppure: https://www.sparkfun.com/news/1801
110 */