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