]> git.piffa.net Git - aerei/blob - aerei/cirso/trigger_transition/trigger_transition.ino
bcb36d5909e4c00bcd1a57425c2851d8e39f6341
[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 attachInterrupt(0, chRise, RISING); // PIN 2 su 328p / 168
46     right.Invert() ;  // Invertiamo uno dei due lampeggiatori
47 }
48
49 void loop() {
50     currentMillis = millis();
51
52 switch (toggle) {
53     case Off:
54     // Spento
55         left.Low();
56         right.Low();
57         coda.Low();
58
59         if (chValue > soglia) {
60             FSM_lastMillis = currentMillis;
61             toggle = toOn ; 
62         leftPWM.Set(0);   
63         rightPWM.Set(0);
64         codaPWM.Set(0);
65         }
66         break;
67
68     case On:
69     // Acceso
70         left.Blink();   // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW)
71         right.Blink();
72         coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo
73
74         if (chValue <= soglia) {
75             FSM_lastMillis = currentMillis;
76             toggle = toOff ; 
77         leftPWM.Set(255);   
78         rightPWM.Set(255);
79         codaPWM.Set(255);
80         }
81         break;
82
83     case toOn:
84     // Trans off -> on
85         leftPWM.lUp(pausa);   
86         rightPWM.lUp(pausa);
87         codaPWM.lUp(pausa);
88
89         if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) { 
90             toggle = On ; 
91         } else if  (chValue <= soglia) {
92             toggle = Off ; 
93         }
94         break;
95
96     case toOff:
97     // Trans on -> off
98         leftPWM.lDown(pausa);   
99         rightPWM.lDown(pausa);
100         codaPWM.lDown(pausa);
101
102         if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) { 
103             toggle = Off ; 
104         } else if  (chValue > soglia) {
105             toggle = On ; 
106         }
107         break;
108 } ;
109 }
110
111 // Functions
112 void chRise() {
113     attachInterrupt(0, chFall, FALLING);
114     chStart = micros();
115 };
116
117 void chFall() {
118     attachInterrupt(0, chRise, RISING);
119     chValue = micros() - chStart;
120 };