]> git.piffa.net Git - aerei/blob - esempi/toggle_transition/toggle_transition.ino
0b49d9bdae524d699178ee6855f0ab6b80ecb183
[aerei] / esempi / toggle_transition / toggle_transition.ino
1 /* Toggle con transizioni tra On | OFF
2
3 Output esempio: 
4    1 Lampeggiatore in coda.
5
6 Input:
7    1 interruttore su interrupt 0 per accensione / spegnimento luci
8
9 FSM per la gesrione delle transizioni tra i 2 stati.
10
11 */
12
13 #include <common.h>
14
15 // FSM gestione interruttore luci
16 enum  { // Stati della FMS
17     On,     // Acceso
18     toOff,  // Trans On -> Off
19     Off,    // Spento
20     toOn    // Trans OFF -> On
21 } toggle  = Off;
22
23 // Variabili per interrupt 0
24 volatile unsigned int chValue = 1500; // Valore computato
25 volatile unsigned int chStart = 1500; // Inizio rilevamento
26 const int soglia = 1400; // soglia per scatto toggle a 2 posizioni
27
28 // Var FSM
29 unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni
30 unsigned long pausa = 2000;  // Pausa per la transizione durante gli stati 2, 4 della FSM
31
32 // Instanziamo gli oggetti per gli stati On / Off
33 Lampeggiatore coda = 9;
34
35 // Instanziamo gli oggetti per gli stati di transizione
36 Pwm codaPWM = 9;
37
38 void setup() {
39     // I PINs vengono impostati dal constructor al momento
40     // della dichiarazione dell'ogetto.
41
42     right.Invert() ;  // Opzionale: inverte l'ordine del lampeggio da
43     // HI -> LOW --> LOW -> HI
44     // per avere 2 LED che lampeggiano alternativamente
45 }
46
47 void loop() {
48
49 switch (toggle) {
50     case Off:
51     // Spento
52         coda.Low();
53
54         if (chValue > soglia) {
55             FSM_lastMillis = millis();
56             toggle = toOn ; 
57         }
58         break;
59
60     case On:
61     // Acceso
62         coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo
63
64         if (chValue <= soglia) {
65             FSM_lastMillis = millis();
66             toggle = toOff ; 
67         }
68         break;
69
70     case ToOn:
71     // Trans off -> on
72         codaPWM.lUp(pausa);
73
74         if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) { 
75             toggle = On ; 
76         } else if  (chValue <= soglia) {
77             toggle = Off ; 
78         }
79         break;
80
81     case ToOff:
82     // Trans on -> off
83         codaPWM.lDown(pausa);
84
85         if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) { 
86             toggle = Off ; 
87         } else if  (chValue > soglia) {
88             toggle = On ; 
89         }
90         break;
91 } ;
92 }
93
94 // Functions
95 void chRise() {
96     attachInterrupt(0, chFall, FALLING);
97     chStart = micros();
98 };
99
100 void chFall() {
101     attachInterrupt(0, chRise, RISING);
102     chValue = micros() - chStart;
103 };