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() {
181 digitalWrite(ledPin, HIGH);
184 void Lampeggiatore::Low() {
187 digitalWrite(ledPin, LOW);
190 void Lampeggiatore::Swap() {
191 // Inverte lo stato del LED
193 digitalWrite(ledPin, !digitalRead(ledPin));
196 /////////////////////////////////////
200 // Gestione del PWM utilizzando millis
201 // per non bloccare il processore con delay
202 // Warning: serialWrite puo' interferire con i tempi.
205 pinMode(ledPin, OUTPUT);
207 byte brightness = 0 ;
211 void Pwm::Up(long speed, long drift) {
212 // Aumenta linearmente la luminosita' usanndo millis()
213 // quindi senza bloccare il processore
214 // Viene usato un float, in alternativa un coseno
216 if (millis() != previousMillis) { // si potrebbe togliere
218 brightness = 255.0 /(float)speed * (millis() + shift);
219 analogWrite(ledPin, brightness);
221 previousMillis = millis();
225 void Pwm::lUp(long speed, long drift) {
226 // Aumenta usanndo millis() con correzione luminosita' LED
227 // quindi senza bloccare il processore
228 // Viene usato un float, in alternativa un coseno
230 if (millis() != previousMillis) { // si potrebbe togliere
232 brightness = 255.0 /(float)speed * (millis() + shift);
233 analogWrite(ledPin, lum(brightness));
235 previousMillis = millis();
239 void Pwm::Down(long speed, long drift) {
240 // Riduce linearmente la luminosita' usanndo millis()
241 // quindi senza bloccare il processore
243 if (millis() != previousMillis) {
245 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
246 analogWrite(ledPin, brightness);
248 previousMillis = millis();
252 void Pwm::lDown(long speed, long drift) {
253 // Riduce usanndo millis() con correzione della luminosita'
254 // quindi senza bloccare il processore
256 if (millis() != previousMillis) {
258 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
259 analogWrite(ledPin, lum(brightness));
261 previousMillis = millis();
265 void Pwm::UD(long speed, long drift ) {
266 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
268 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
269 analogWrite(ledPin, brightness);
272 void Pwm::Set(byte brightness) {
273 // Imposta il valore del PWM
274 analogWrite(ledPin, brightness);
278 void Pwm::lSet(byte brightness) {
279 // Imposta il valore del PWM con correzione luminosita' LED
280 analogWrite(ledPin, lum(brightness));
284 /////////////////////////////////////
287 Sequenza::Sequenza (byte passed[], byte dim) {
290 for (int thisPin = 0; thisPin < size; thisPin++) {
291 pinMode(ledPins[thisPin], OUTPUT);
293 previousMillis = millis();
294 digitalWrite(ledPins[0], HIGH);
297 void Sequenza::Update(long value) {
298 // Incrementa dal primo all'ultimo valore dell'array
300 if (millis() - previousMillis >= interval) {
301 previousMillis = millis();
303 if ( i < size - 1 ) {
304 // Spegni precedente led
305 digitalWrite(ledPins[i], LOW);
307 // Accendi successivo led
308 digitalWrite(ledPins[++i], HIGH);
311 else if (i == size - 1 ) {
314 previousMillis = millis();
315 digitalWrite(ledPins[i], HIGH);
316 digitalWrite(ledPins[ size - 1 ], LOW);
322 void Sequenza::Reverse(long value) {
324 if (millis() - previousMillis >= interval) {
325 previousMillis = millis();
327 if (i == 0) { // Entry point, ultimo LED
328 digitalWrite(ledPins[size -1],HIGH);
329 digitalWrite(ledPins[0],LOW);
333 digitalWrite(ledPins[i],LOW);
334 digitalWrite(ledPins[--i],HIGH);
339 void Sequenza::UD(long value) {
341 if (millis() - previousMillis >= interval) {
342 previousMillis = millis();
343 // Spegni precedente led
344 digitalWrite(ledPins[i], LOW);
346 // Accendi successivo led
347 digitalWrite(ledPins[i], HIGH);
349 if (i == 0 || i == size -1) {
360 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
361 // Accende e spegne il LED accetando un argomento
362 // per impostare la velocita'.
364 pinMode(pin, OUTPUT);
365 // sequenze di istruzione: accendere e spegnere il LED
366 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
367 delay(velocita); // wait for a second
368 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
369 delay(velocita); // wait for a second
374 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
376 return pgm_read_byte_near(BCORRECT + val);
380 int calibraTrim(int pin, const byte ledPin) {
381 /* START Calibrazione TRIM canale:
383 calcolo del valore medio esclusi gli 0
385 I canali come alettoni / elevatore possono avere un TRIM
386 (generalmente il throttle non ha un TRIM impostato),
387 questa funzione nel setup serve per trovare il punto medio
388 all'avvio dello sketch.
390 pinMode(ledPin,OUTPUT);
395 Serial.println(">> Calibrazione: ");
398 if (millis() > 10000) {
400 Serial.println(">> Calibrazione annullata a causa di assenza di seganle. \nAssicurarsi di accendere radio e ricevente \ne ripetere la procedura.");
402 middle = 15000; // Return value is divided by 10
405 servoValue = pulseIn(pin, HIGH, 25000);
406 if (servoValue != 0 && servoValue > 950 && servoValue <2000) {
407 middle = middle + servoValue ;
410 Serial.print(servoValue);
412 Serial.println(middle / a);
414 digitalWrite(ledPin, !digitalRead(ledPin));
419 Serial.print(">> Fine Calibrazione, media: ");
420 Serial.println(middle / 10 + 10);
423 return(middle / 10 + 10) ;