]> git.piffa.net Git - aerei/blob - aerei/cirso/trigger_transition/trigger_transition.ino
5a6c8b1daa142da7a66423dea92445ebf90f28fd
[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 = 1400; // 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
33 // Instanziamo gli oggetti per gli stati On / Off
34 Lampeggiatore left = 5;
35 Lampeggiatore right = 6;
36 Lampeggiatore coda = 9;
37
38 // Instanziamo gli oggetti per gli stati di transizione
39 Pwm leftPWM = 5;
40 Pwm righatPWM = 6;
41 Pwm codaPWM = 9;
42
43 void setup() {
44     // I PINs vengono impostati dal constructor al momento
45     // della dichiarazione dell'ogetto.
46
47     right.Invert() ;  // Opzionale: inverte l'ordine del lampeggio da
48     // HI -> LOW --> LOW -> HI
49     // per avere 2 LED che lampeggiano alternativamente
50 }
51
52 void loop() {
53
54 switch (toggle) {
55     case Off:
56     // Spento
57         left.Low();
58         right.Low();
59         coda.Low();
60
61         if (chValue > soglia) {
62             FSM_lastMillis = millis();
63             toggle = toOn ; 
64         }
65         break;
66
67     case On:
68     // Acceso
69         left.Blink();   // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW)
70         right.Blink();
71         coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo
72
73         if (chValue <= soglia) {
74             FSM_lastMillis = millis();
75             toggle = toOff ; 
76         }
77         break;
78
79     case ToOn:
80     // Trans off -> on
81         leftPWM.lUp(pausa);   
82         rightPWM.lUp(pausa);
83         codaPWM.lUp(pausa);
84
85         if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) { 
86             toggle = On ; 
87         } else if  (chValue <= soglia) {
88             toggle = Off ; 
89         }
90         break;
91
92     case ToOff:
93     // Trans on -> off
94         leftPWM.lDown(pausa);   
95         rightPWM.lDown(pausa);
96         codaPWM.lDown(pausa);
97
98         if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) { 
99             toggle = Off ; 
100         } else if  (chValue > soglia) {
101             toggle = On ; 
102         }
103         break;
104 } ;
105 }
106
107 // Functions
108 void chRise() {
109     attachInterrupt(0, chFall, FALLING);
110     chStart = micros();
111 };
112
113 void chFall() {
114     attachInterrupt(0, chRise, RISING);
115     chValue = micros() - chStart;
116 };