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