]> git.piffa.net Git - sketchbook_andrea/blob - libraries/common/common.cpp
Common, cambiato il behaiour di RGB LED:
[sketchbook_andrea] / libraries / common / common.cpp
1 /*  Common
2  *
3  *  Oggetti di uso comune
4  *  Autore: Andrea Manni
5  *
6  *  Link: http://git.andreamanni.com/
7  *  Licenza:    GPLv3
8  */
9
10 #include "Arduino.h"
11 #include "common.h"
12
13 #define DEBUG_not
14
15 //////////////////////
16 // RGB LED
17 // Common anode / cat
18
19 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
20     // Per un common catodo, valore max / min invertiti
21     redPin    = pinR ;
22     greenPin  = pinG ;
23     bluePin   = pinB ;
24     common    = 0 ;
25
26     // Equvalente del Setup() per inizializzare i PIN
27     pinMode(redPin, OUTPUT);
28     pinMode(greenPin, OUTPUT);
29     pinMode(greenPin, OUTPUT);
30 };
31
32 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
33     // Per un common anode, valore max / min normali
34     redPin    = pinR ;
35     greenPin  = pinG ;
36     bluePin   = pinB ;
37     common    = com ;
38
39     // Equvalente del Setup() per inizializzare i PIN
40     pinMode(redPin, OUTPUT);
41     pinMode(greenPin, OUTPUT);
42     pinMode(greenPin, OUTPUT);
43 };
44
45 void RGBLed::SetColor (byte r, byte g, byte b) {
46 // Imposta il colore di un LED RGB
47   if (common == 0) {
48     analogWrite(redPin,    r);
49     analogWrite(greenPin,  g);
50     analogWrite(bluePin,   b);
51   } else {
52     analogWrite(redPin,   255 - r);
53     analogWrite(greenPin, 255 - g);
54     analogWrite(bluePin,  255 - b);
55   }
56
57
58 // Debug
59 #ifdef DEBUG
60    Serial.print(r);
61    Serial.print("-");
62    Serial.print(g);
63    Serial.print("-");
64    Serial.print(b);
65    while(1);
66 #endif
67
68 };
69
70 void RGBLed::Rand () {
71 // Imposta il colore di un LED RGB
72     analogWrite(redPin, random(0,256));
73     analogWrite(greenPin, random(0,256));
74     analogWrite(bluePin, random(0,256));
75 };
76
77 void RGBLed::Red () {
78 // Accende il LED di rosso
79     SetColor(255,0,0);
80 };
81
82 void RGBLed::Green () {
83 // Accende il LED di verde
84     SetColor(0,255,0);
85 };
86
87 void RGBLed::Blue () {
88 // Accende il LED di blu
89     SetColor(0,0,255);
90 };
91
92 void RGBLed::Magenta () {
93 // Accende il LED di magenta
94     SetColor(255,0,255);
95 };
96
97 void RGBLed::Cyano () {
98 // Accende il LED di Cyano
99     SetColor(0,255,255);
100 };
101
102 void RGBLed::Yellow () {
103 // Accende il LED di giallo
104     SetColor(255,255,0);
105 };
106
107 void RGBLed::White () {
108 // Accende il LED
109     SetColor(255,255,255);
110 };
111
112 void RGBLed::Off () {
113 // Spegne il LED
114     SetColor(0,0,0);
115 };
116
117
118
119 /////////////////////////////////////
120 // Lampeggiatore
121 // Constructor
122 //
123 // Esempi incrementali: https://lab.piffa.net/sketchbook_andrea/multitasking/
124 Lampeggiatore::Lampeggiatore(int pin)
125 {
126     ledPin = pin;
127     pinMode(ledPin, OUTPUT);
128     ledState = LOW;
129     previousMillis = 0;
130     interval = 500;
131 };
132
133 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
134 void Lampeggiatore::Invert() {
135     // Inverte il lampeggio
136     ledState = HIGH ;
137 }
138
139 void Lampeggiatore::Blink() {
140     // Illumina il led a 500ms
141
142     if(millis() + shift - previousMillis > interval) {
143
144         // if the LED is off turn it on and vice-versa:
145         ledState = !ledState ; // Inverti il LED
146         // set the LED with the ledState of the variable:
147         digitalWrite(ledPin, ledState);
148         // save the last time you blinked the LED
149         previousMillis += interval;
150     }
151 };
152
153 void Lampeggiatore::Blink(long time, long drift ) {
154     // Illumina il led secondo un intervallo passato come argomento
155
156     shift = drift;
157     if(millis() + shift - previousMillis > time) {
158         // if the LED is off turn it on and vice-versa:
159         ledState = !ledState ; // Inverti il LED
160     // set the LED with the ledState of the variable:
161     digitalWrite(ledPin, ledState);
162         // save the last time you blinked the LED
163         previousMillis += time;
164     }
165 };
166
167 void Lampeggiatore::Blink(long up, long down, long drift ) {
168     // Illumina il ledB precisando ontime e downtime
169
170     shift = drift;
171     if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
172         // save the last time you blinked the LED
173         previousMillis += up;
174         ledState = LOW  ;
175     }
176     else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
177         previousMillis += down;
178         ledState = HIGH  ;
179     }
180
181     // set the LED with the ledState of the variable:
182     digitalWrite(ledPin, ledState);
183 };
184
185 void Lampeggiatore::High() {
186     // Accende il LED
187     digitalWrite(ledPin, HIGH);
188 }
189
190 void Lampeggiatore::Low() {
191     // Spegne  il LED
192     digitalWrite(ledPin, LOW);
193 }
194
195 void Lampeggiatore::Swap() {
196     // Inverte lo stato del LED
197     digitalWrite(ledPin, !digitalRead(ledPin));
198 }
199
200 /////////////////////////////////////
201 // Pwm
202 // Constructor
203 Pwm::Pwm(int pin)
204 // Gestione del PWM utilizzando millis
205 // per non bloccare il processore con delay
206 // Warning: serialWrite puo' interferire con i tempi.
207 {
208     ledPin = pin;
209     pinMode(ledPin, OUTPUT);
210     previousMillis = 0;
211     byte brightness = 0 ;
212     increment = 1;
213 };
214
215 void Pwm::Up(long speed, long drift) {
216     // Aumenta linearmente la luminosita' usanndo millis()
217     // quindi senza bloccare il processore
218     // Viene usato un float, in alternativa un coseno
219
220     if (millis() != previousMillis)  { // si potrebbe togliere
221         shift = drift;
222         brightness = 255.0 /(float)speed * (millis() + shift);
223         analogWrite(ledPin, brightness);
224
225         previousMillis = millis();
226     };
227 }
228
229 void Pwm::lUp(long speed, long drift) {
230     // Aumenta usanndo millis() con correzione luminosita' LED
231     // quindi senza bloccare il processore
232     // Viene usato un float, in alternativa un coseno
233
234     if (millis() != previousMillis)  { // si potrebbe togliere
235         shift = drift;
236         brightness = 255.0 /(float)speed * (millis() + shift);
237         analogWrite(ledPin, lum(brightness));
238
239         previousMillis = millis();
240     };
241 }
242
243 void Pwm::Down(long speed, long drift) {
244     // Riduce linearmente la luminosita' usanndo millis()
245     // quindi senza bloccare il processore
246
247     if (millis() != previousMillis)  {
248         shift = drift;
249         brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
250         analogWrite(ledPin, brightness);
251
252         previousMillis = millis();
253     };
254 }
255
256 void Pwm::lDown(long speed, long drift) {
257     // Riduce  usanndo millis() con correzione della luminosita'
258     // quindi senza bloccare il processore
259
260     if (millis() != previousMillis)  {
261         shift = drift;
262         brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
263         analogWrite(ledPin, lum(brightness));
264
265         previousMillis = millis();
266     };
267 }
268
269 void Pwm::UD(long speed, long drift ) {
270     // Aumenta e riduce in sequenza la luminosita' usanndo millis()
271     shift = drift;
272     brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
273     analogWrite(ledPin, brightness);
274 }
275
276 void Pwm::Set(byte brightness) {
277     // Imposta il valore del PWM
278     analogWrite(ledPin, brightness);
279 }
280
281
282 void Pwm::lSet(byte brightness) {
283     // Imposta il valore del PWM con correzione luminosita' LED
284     analogWrite(ledPin, lum(brightness));
285 }
286
287
288 /////////////////////////////////////
289 // Sequenza
290 // Constructor
291 Sequenza::Sequenza (byte passed[], byte dim) {
292     ledPins = passed ;
293     size = dim ;
294     for (int thisPin = 0; thisPin < size; thisPin++) {
295         pinMode(ledPins[thisPin], OUTPUT);
296     }
297     previousMillis = millis();
298     digitalWrite(ledPins[0], HIGH);
299 }
300
301 void Sequenza::Update(long value) {
302     // Incrementa dal primo all'ultimo valore dell'array
303     interval = value;
304     if (millis() - previousMillis >= interval) {
305         previousMillis = millis();
306
307         if ( i < size - 1 ) {
308             // Spegni precedente led
309             digitalWrite(ledPins[i], LOW);
310
311             // Accendi successivo led
312             digitalWrite(ledPins[++i], HIGH);
313         }
314
315         else if  (i == size - 1 )   {
316             // Ultimo caso
317             i = 0;
318             previousMillis = millis();
319             digitalWrite(ledPins[i], HIGH);
320             digitalWrite(ledPins[ size - 1 ], LOW);
321         }
322     }
323 }
324
325
326 void Sequenza::Reverse(long value) {
327     interval = value;
328     if (millis() - previousMillis >= interval) {
329         previousMillis = millis();
330
331         if  (i == 0)   { // Entry point, ultimo LED
332             digitalWrite(ledPins[size -1],HIGH);
333             digitalWrite(ledPins[0],LOW);
334             i = size -1 ;
335         }
336         else {
337             digitalWrite(ledPins[i],LOW);
338             digitalWrite(ledPins[--i],HIGH);
339         }
340     }
341 }
342
343 void Sequenza::UD(long value) {
344     interval = value;
345     if (millis() - previousMillis >= interval) {
346         previousMillis = millis();
347         // Spegni precedente led
348         digitalWrite(ledPins[i], LOW);
349         i = i + inc ;
350         // Accendi successivo led
351         digitalWrite(ledPins[i], HIGH);
352
353         if (i == 0 || i == size -1) {
354             inc = -inc ;
355         }
356     }
357 }
358
359
360 //////////////////
361 // Funzioni
362
363
364 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
365     // Accende e spegne il LED accetando un argomento
366     // per impostare la velocita'.
367
368     pinMode(pin, OUTPUT);
369     // sequenze di istruzione: accendere e spegnere il LED
370     digitalWrite(pin, HIGH);   // turn the LED on (HIGH is the voltage level)
371     delay(velocita);               // wait for a second
372     digitalWrite(pin, LOW);    // turn the LED off by making the voltage LOW
373     delay(velocita);               // wait for a second
374 };
375
376
377 byte lum(byte val) {
378     // Mappatura dell'intervallo 0-255 con correzione di luminosita.
379     // storata in SRAM
380     return pgm_read_byte_near(BCORRECT + val);
381 };
382
383
384 int calibraTrim(int pin, const byte ledPin) {
385     /* START Calibrazione TRIM canale:
386        Lettura di 10 smaple
387        calcolo del valore medio esclusi gli 0
388
389        I canali come alettoni / elevatore possono avere un TRIM
390        (generalmente il throttle non ha un TRIM impostato),
391        questa funzione nel setup serve per trovare il punto medio
392        all'avvio dello sketch.
393      */
394     pinMode(ledPin,OUTPUT);
395     byte a              = 0;
396     int servoValue      = 0;
397     int middle = 0; 
398 #ifdef DEBUG
399     Serial.println(">> Calibrazione: ");
400 #endif 
401     while (a < 10) {
402         if (millis() > 10000) {
403 #ifdef DEBUG
404             Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
405 #endif 
406             middle = 15000; // Return value is divided by 10
407             break;
408         };
409         servoValue = pulseIn(pin, HIGH, 25000);
410         if (servoValue != 0 && servoValue > 950 && servoValue <2000)  {
411             middle = middle + servoValue ;
412             a++ ;
413 #ifdef DEBUG
414             Serial.print(servoValue);
415             Serial.print(": ");
416             Serial.println(middle / a);
417 #endif 
418             digitalWrite(ledPin, !digitalRead(ledPin));
419             delay(50);
420         }
421     }
422 #ifdef DEBUG
423     Serial.print(">> Fine Calibrazione, media: ");
424     Serial.println(middle / 10 + 10);
425     Serial.flush() ;
426 #endif 
427     return(middle / 10 ) ;
428 // END calibrazione
429 };
430