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