4 2 LED ai lati con lampeggio alternato
5 1 LED in coda lampeggio a freq doppia
8 1 interruttore su interrupt 0 per accensione / spegnimento luci
10 FSM per la gesrione delle transizioni tra i 2 stati.
16 // FSM gestione interruttore luci
17 enum { // Stati della FMS
19 toOff, // Trans On -> Off
21 toOn // Trans OFF -> On
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
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;
34 // Instanziamo gli oggetti per gli stati On / Off
35 Lampeggiatore left = 5;
36 Lampeggiatore right = 6;
37 Lampeggiatore coda = 9;
39 // Instanziamo gli oggetti per gli stati di transizione
45 // I PINs vengono impostati dal constructor al momento
46 // della dichiarazione dell'ogetto.
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
55 currentMillis = millis();
64 if (chValue > soglia) {
65 FSM_lastMillis = millis();
72 left.Blink(); // Lampeggia con un default di 1sec (0.5 HI 0.5 LOW)
74 coda.Blink(1000); // Lampeggio in 1000ms = 1 secondo
76 if (chValue <= soglia) {
77 FSM_lastMillis = millis();
91 if (chValue > soglia && currentMillis - pausa > FSM_lastMillis ) {
93 } else if (chValue <= soglia) {
100 leftPWM.lDown(pausa);
101 rightPWM.lDown(pausa);
102 codaPWM.lDown(pausa);
104 if (chValue <= soglia && currentMillis - pausa > FSM_lastMillis ) {
106 } else if (chValue > soglia) {
115 attachInterrupt(0, chFall, FALLING);
120 attachInterrupt(0, chRise, RISING);
121 chValue = micros() - chStart;