3 Pilotare un LED RGB in base al canale degli alettoni:
4 per versione con interrupts vedere esempio successivo.
6 = 3 stati + 2 transizioni:
12 * clean up magic numbers
17 #define dEBUG // Cambiare in DEBUG per il debug
20 unsigned long currentMillis; // timestamp reference per millis per tutto il loop
23 RGBLed ailerons(9,10,7,255); // Common Cat
26 Lampeggiatore sxLamp(10); // Lampeggiatore
27 Lampeggiatore dxLamp(9); // Lampeggiatore
30 // Variabili per lettura canale servo
31 int ail ; // Valore per ailerons
32 int ailIn ; // Valore rilevato del 4 Ch della RX
33 unsigned long ailTimer ; // millis per ail
36 // FSM gestione alettoni
37 enum { // Stati della FMS
39 sxin, // transizione a sx
41 dxin, // transizione a dx
46 unsigned long FSM_lastMillis = 0 ; // Timestamp per la FSM degli alettoni
47 unsigned long pausa = 1000; // Pausa per la transizione durante gli stati 2, 4 della FSM
49 // Variabili per interrupt 0 si PIN 2: Throttle
50 volatile unsigned int chValue2 = 1500; // Valore computato
51 volatile unsigned int chStart2 = 1500; // Inizio rilevamento
53 // Variabili per interrupt 1 su PIN 3: Ailerons
54 volatile unsigned int ail = 1500; // Valore computato
55 volatile unsigned int mid_point = 1560; // Inizio rilevamento
58 // Variabili per autocalibrazione 1
59 const byte chPin3 = 3; // PIN per la calibrazione
60 int mid_point3 = 1000;
63 int mid_point = 1560 ; // centro del segnale, trimmato nel setup
64 const int deviation = 50 ; // deviazione dal punto medio
65 //per entrare nello stato successivo dal centro
67 ///////////////////////////////////////////////////////////
76 // Funzione relativa a calibrazione:
77 mid_point = calibraTrim(ailPin) ; // + LED di servizio per monitor calibrazione
81 currentMillis = millis(); // Timestamp per tutto il loop
89 if (ail > mid_point + deviation + deviation /3) {
90 // extra margine per avere un po' di gioco
92 FSM_lastMillis = currentMillis;
94 else if (ail < mid_point - deviation - deviation / 3) {
96 FSM_lastMillis = currentMillis ;
103 if (currentMillis - pausa > FSM_lastMillis ) {
111 if (ail < mid_point + deviation) {
114 else if (ail < mid_point - deviation) {
115 FSM_lastMillis = currentMillis;
123 if (currentMillis - pausa > FSM_lastMillis ) {
131 if (ail > mid_point - deviation) {
134 else if (ail > mid_point + deviation) {
135 FSM_lastMillis = currentMillis;
141 Serial.print("ailIn: ");
143 Serial.print("\tail: ");
145 Serial.print("\t ailstate:");
146 Serial.println(ailstate);
151 attachInterrupt(0, chFall2, FALLING);
156 attachInterrupt(0, chRise2, RISING);
157 chValue2 = micros() - chStart2;
161 attachInterrupt(1, chFall3, FALLING);
166 attachInterrupt(1, chRise3, RISING);
167 ail = micros() - chStart3;