3 * Oggetti di uso comune
6 * Link: http://git.andreamanni.com/
15 //////////////////////
19 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
20 // Per un common catodo, valore max / min invertiti
26 // Equvalente del Setup() per inizializzare i PIN
27 pinMode(redPin, OUTPUT);
28 pinMode(greenPin, OUTPUT);
29 pinMode(greenPin, OUTPUT);
32 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
33 // Per un common anode, valore max / min normali
39 // Equvalente del Setup() per inizializzare i PIN
40 pinMode(redPin, OUTPUT);
41 pinMode(greenPin, OUTPUT);
42 pinMode(greenPin, OUTPUT);
45 void RGBLed::SetColor (byte r, byte g, byte b) {
46 // Imposta il colore di un LED RGB
48 analogWrite(redPin, r);
49 analogWrite(greenPin, g);
50 analogWrite(bluePin, b);
52 analogWrite(redPin, 255 - r);
53 analogWrite(greenPin, 255 - g);
54 analogWrite(bluePin, 255 - b);
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));
78 // Accende il LED di rosso
82 void RGBLed::Green () {
83 // Accende il LED di verde
87 void RGBLed::Blue () {
88 // Accende il LED di blu
92 void RGBLed::Magenta () {
93 // Accende il LED di magenta
97 void RGBLed::Cyano () {
98 // Accende il LED di Cyano
102 void RGBLed::Yellow () {
103 // Accende il LED di giallo
107 void RGBLed::White () {
109 SetColor(255,255,255);
112 void RGBLed::Off () {
119 /////////////////////////////////////
123 // Esempi incrementali: https://lab.piffa.net/sketchbook_andrea/multitasking/
124 Lampeggiatore::Lampeggiatore(int pin)
127 pinMode(ledPin, OUTPUT);
133 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
134 void Lampeggiatore::Invert() {
135 // Inverte il lampeggio
139 void Lampeggiatore::Blink() {
140 // Illumina il led a 500ms
142 if(millis() + shift - previousMillis > interval) {
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;
153 void Lampeggiatore::Blink(long time, long drift ) {
154 // Illumina il led secondo un intervallo passato come argomento
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;
167 void Lampeggiatore::Blink(long up, long down, long drift ) {
168 // Illumina il ledB precisando ontime e downtime
171 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
172 // save the last time you blinked the LED
173 previousMillis += up;
176 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
177 previousMillis += down;
181 // set the LED with the ledState of the variable:
182 digitalWrite(ledPin, ledState);
185 void Lampeggiatore::High() {
187 digitalWrite(ledPin, HIGH);
190 void Lampeggiatore::Low() {
192 digitalWrite(ledPin, LOW);
195 void Lampeggiatore::Swap() {
196 // Inverte lo stato del LED
197 digitalWrite(ledPin, !digitalRead(ledPin));
200 /////////////////////////////////////
204 // Gestione del PWM utilizzando millis
205 // per non bloccare il processore con delay
206 // Warning: serialWrite puo' interferire con i tempi.
209 pinMode(ledPin, OUTPUT);
211 byte brightness = 0 ;
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
220 if (millis() != previousMillis) { // si potrebbe togliere
222 brightness = 255.0 /(float)speed * (millis() + shift);
223 analogWrite(ledPin, brightness);
225 previousMillis = millis();
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
234 if (millis() != previousMillis) { // si potrebbe togliere
236 brightness = 255.0 /(float)speed * (millis() + shift);
237 analogWrite(ledPin, lum(brightness));
239 previousMillis = millis();
243 void Pwm::Down(long speed, long drift) {
244 // Riduce linearmente la luminosita' usanndo millis()
245 // quindi senza bloccare il processore
247 if (millis() != previousMillis) {
249 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
250 analogWrite(ledPin, brightness);
252 previousMillis = millis();
256 void Pwm::lDown(long speed, long drift) {
257 // Riduce usanndo millis() con correzione della luminosita'
258 // quindi senza bloccare il processore
260 if (millis() != previousMillis) {
262 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
263 analogWrite(ledPin, lum(brightness));
265 previousMillis = millis();
269 void Pwm::UD(long speed, long drift ) {
270 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
272 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
273 analogWrite(ledPin, brightness);
276 void Pwm::Set(byte brightness) {
277 // Imposta il valore del PWM
278 analogWrite(ledPin, brightness);
282 void Pwm::lSet(byte brightness) {
283 // Imposta il valore del PWM con correzione luminosita' LED
284 analogWrite(ledPin, lum(brightness));
288 /////////////////////////////////////
291 Sequenza::Sequenza (byte passed[], byte dim) {
294 for (int thisPin = 0; thisPin < size; thisPin++) {
295 pinMode(ledPins[thisPin], OUTPUT);
297 previousMillis = millis();
298 digitalWrite(ledPins[0], HIGH);
301 void Sequenza::Update(long value) {
302 // Incrementa dal primo all'ultimo valore dell'array
304 if (millis() - previousMillis >= interval) {
305 previousMillis = millis();
307 if ( i < size - 1 ) {
308 // Spegni precedente led
309 digitalWrite(ledPins[i], LOW);
311 // Accendi successivo led
312 digitalWrite(ledPins[++i], HIGH);
315 else if (i == size - 1 ) {
318 previousMillis = millis();
319 digitalWrite(ledPins[i], HIGH);
320 digitalWrite(ledPins[ size - 1 ], LOW);
326 void Sequenza::Reverse(long value) {
328 if (millis() - previousMillis >= interval) {
329 previousMillis = millis();
331 if (i == 0) { // Entry point, ultimo LED
332 digitalWrite(ledPins[size -1],HIGH);
333 digitalWrite(ledPins[0],LOW);
337 digitalWrite(ledPins[i],LOW);
338 digitalWrite(ledPins[--i],HIGH);
343 void Sequenza::UD(long value) {
345 if (millis() - previousMillis >= interval) {
346 previousMillis = millis();
347 // Spegni precedente led
348 digitalWrite(ledPins[i], LOW);
350 // Accendi successivo led
351 digitalWrite(ledPins[i], HIGH);
353 if (i == 0 || i == size -1) {
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'.
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
378 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
380 return pgm_read_byte_near(BCORRECT + val);
384 int calibraTrim(int pin, const byte ledPin) {
385 /* START Calibrazione TRIM canale:
387 calcolo del valore medio esclusi gli 0
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.
394 pinMode(ledPin,OUTPUT);
399 Serial.println(">> Calibrazione: ");
402 if (millis() > 10000) {
404 Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
406 middle = 15000; // Return value is divided by 10
409 servoValue = pulseIn(pin, HIGH, 25000);
410 if (servoValue != 0 && servoValue > 950 && servoValue <2000) {
411 middle = middle + servoValue ;
414 Serial.print(servoValue);
416 Serial.println(middle / a);
418 digitalWrite(ledPin, !digitalRead(ledPin));
423 Serial.print(">> Fine Calibrazione, media: ");
424 Serial.println(middle / 10 + 10);
427 return(middle / 10 ) ;