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
47 analogWrite(redPin, common - r);
48 analogWrite(greenPin, common - g);
49 analogWrite(bluePin, common - b);
53 Serial.print(common - r);
55 Serial.print(common - g);
57 Serial.print(common - b);
63 void RGBLed::Rand () {
64 // Imposta il colore di un LED RGB
65 analogWrite(redPin, random(0,256));
66 analogWrite(greenPin, random(0,256));
67 analogWrite(bluePin, random(0,256));
71 // Accende il LED di rosso
75 void RGBLed::Green () {
76 // Accende il LED di verde
80 void RGBLed::Blue () {
81 // Accende il LED di blu
85 void RGBLed::Magenta () {
86 // Accende il LED di magenta
90 void RGBLed::Cyano () {
91 // Accende il LED di Cyano
95 void RGBLed::Yellow () {
96 // Accende il LED di giallo
100 void RGBLed::White () {
102 SetColor(255,255,255);
105 void RGBLed::Off () {
112 /////////////////////////////////////
116 // Esempi incrementali: https://lab.piffa.net/sketchbook_andrea/multitasking/
117 Lampeggiatore::Lampeggiatore(int pin)
120 pinMode(ledPin, OUTPUT);
126 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
127 void Lampeggiatore::Invert() {
128 // Inverte il lampeggio
132 void Lampeggiatore::Blink() {
133 // Illumina il led a 500ms
135 if(millis() + shift - previousMillis > interval) {
137 // if the LED is off turn it on and vice-versa:
138 ledState = !ledState ; // Inverti il LED
139 // set the LED with the ledState of the variable:
140 digitalWrite(ledPin, ledState);
141 // save the last time you blinked the LED
142 previousMillis += interval;
146 void Lampeggiatore::Blink(long time, long drift ) {
147 // Illumina il led secondo un intervallo passato come argomento
150 if(millis() + shift - previousMillis > time) {
151 // if the LED is off turn it on and vice-versa:
152 ledState = !ledState ; // Inverti il LED
153 // set the LED with the ledState of the variable:
154 digitalWrite(ledPin, ledState);
155 // save the last time you blinked the LED
156 previousMillis += time;
160 void Lampeggiatore::Blink(long up, long down, long drift ) {
161 // Illumina il ledB precisando ontime e downtime
164 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
165 // save the last time you blinked the LED
166 previousMillis += up;
169 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
170 previousMillis += down;
174 // set the LED with the ledState of the variable:
175 digitalWrite(ledPin, ledState);
178 void Lampeggiatore::High() {
180 digitalWrite(ledPin, HIGH);
183 void Lampeggiatore::Low() {
185 digitalWrite(ledPin, LOW);
188 void Lampeggiatore::Swap() {
189 // Inverte lo stato del LED
190 digitalWrite(ledPin, !digitalRead(ledPin));
193 /////////////////////////////////////
197 // Gestione del PWM utilizzando millis
198 // per non bloccare il processore con delay
199 // Warning: serialWrite puo' interferire con i tempi.
202 pinMode(ledPin, OUTPUT);
204 byte brightness = 0 ;
208 void Pwm::Up(long speed, long drift) {
209 // Aumenta linearmente la luminosita' usanndo millis()
210 // quindi senza bloccare il processore
211 // Viene usato un float, in alternativa un coseno
213 if (millis() != previousMillis) { // si potrebbe togliere
215 brightness = 255.0 /(float)speed * (millis() + shift);
216 analogWrite(ledPin, brightness);
218 previousMillis = millis();
222 void Pwm::lUp(long speed, long drift) {
223 // Aumenta usanndo millis() con correzione luminosita' LED
224 // quindi senza bloccare il processore
225 // Viene usato un float, in alternativa un coseno
227 if (millis() != previousMillis) { // si potrebbe togliere
229 brightness = 255.0 /(float)speed * (millis() + shift);
230 analogWrite(ledPin, lum(brightness));
232 previousMillis = millis();
236 void Pwm::Down(long speed, long drift) {
237 // Riduce linearmente la luminosita' usanndo millis()
238 // quindi senza bloccare il processore
240 if (millis() != previousMillis) {
242 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
243 analogWrite(ledPin, brightness);
245 previousMillis = millis();
249 void Pwm::lDown(long speed, long drift) {
250 // Riduce usanndo millis() con correzione della luminosita'
251 // quindi senza bloccare il processore
253 if (millis() != previousMillis) {
255 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
256 analogWrite(ledPin, lum(brightness));
258 previousMillis = millis();
262 void Pwm::UD(long speed, long drift ) {
263 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
265 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
266 analogWrite(ledPin, brightness);
269 void Pwm::Set(byte brightness) {
270 // Imposta il valore del PWM
271 analogWrite(ledPin, brightness);
275 void Pwm::lSet(byte brightness) {
276 // Imposta il valore del PWM con correzione luminosita' LED
277 analogWrite(ledPin, lum(brightness));
281 /////////////////////////////////////
284 Sequenza::Sequenza (byte passed[], byte dim) {
287 for (int thisPin = 0; thisPin < size; thisPin++) {
288 pinMode(ledPins[thisPin], OUTPUT);
290 previousMillis = millis();
291 digitalWrite(ledPins[0], HIGH);
294 void Sequenza::Update(long value) {
295 // Incrementa dal primo all'ultimo valore dell'array
297 if (millis() - previousMillis >= interval) {
298 previousMillis = millis();
300 if ( i < size - 1 ) {
301 // Spegni precedente led
302 digitalWrite(ledPins[i], LOW);
304 // Accendi successivo led
305 digitalWrite(ledPins[++i], HIGH);
308 else if (i == size - 1 ) {
311 previousMillis = millis();
312 digitalWrite(ledPins[i], HIGH);
313 digitalWrite(ledPins[ size - 1 ], LOW);
319 void Sequenza::Reverse(long value) {
321 if (millis() - previousMillis >= interval) {
322 previousMillis = millis();
324 if (i == 0) { // Entry point, ultimo LED
325 digitalWrite(ledPins[size -1],HIGH);
326 digitalWrite(ledPins[0],LOW);
330 digitalWrite(ledPins[i],LOW);
331 digitalWrite(ledPins[--i],HIGH);
336 void Sequenza::UD(long value) {
338 if (millis() - previousMillis >= interval) {
339 previousMillis = millis();
340 // Spegni precedente led
341 digitalWrite(ledPins[i], LOW);
343 // Accendi successivo led
344 digitalWrite(ledPins[i], HIGH);
346 if (i == 0 || i == size -1) {
357 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
358 // Accende e spegne il LED accetando un argomento
359 // per impostare la velocita'.
361 pinMode(pin, OUTPUT);
362 // sequenze di istruzione: accendere e spegnere il LED
363 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
364 delay(velocita); // wait for a second
365 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
366 delay(velocita); // wait for a second
371 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
373 return pgm_read_byte_near(BCORRECT + val);
377 int calibraTrim(int pin, const byte ledPin) {
378 /* START Calibrazione TRIM canale:
380 calcolo del valore medio esclusi gli 0
382 I canali come alettoni / elevatore possono avere un TRIM
383 (generalmente il throttle non ha un TRIM impostato),
384 questa funzione nel setup serve per trovare il punto medio
385 all'avvio dello sketch.
387 pinMode(ledPin,OUTPUT);
392 Serial.println(">> Calibrazione: ");
395 if (millis() > 10000) {
397 Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
399 middle = 15000; // Return value is divided by 10
402 servoValue = pulseIn(pin, HIGH, 25000);
403 if (servoValue != 0 && servoValue > 950 && servoValue <2000) {
404 middle = middle + servoValue ;
407 Serial.print(servoValue);
409 Serial.println(middle / a);
411 digitalWrite(ledPin, !digitalRead(ledPin));
416 Serial.print(">> Fine Calibrazione, media: ");
417 Serial.println(middle / 10 + 10);
420 return(middle / 10 ) ;