3 * Oggetti di uso comune
6 * Link: http://git.andreamanni.com/
14 //////////////////////
18 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
19 // Per un common catodo, valore max / min invertiti
25 // Equvalente del Setup() per inizializzare i PIN
26 pinMode(redPin, OUTPUT);
27 pinMode(greenPin, OUTPUT);
28 pinMode(greenPin, OUTPUT);
31 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) {
32 // Per un common anode, valore max / min normali
38 // Equvalente del Setup() per inizializzare i PIN
39 pinMode(redPin, OUTPUT);
40 pinMode(greenPin, OUTPUT);
41 pinMode(greenPin, OUTPUT);
44 void RGBLed::SetColor (byte r, byte g, byte b) {
45 // Imposta il colore di un LED RGB
46 analogWrite(redPin, common - r);
47 analogWrite(greenPin, common - g);
48 analogWrite(bluePin, common - b);
52 // Accende il LED di rosso
56 void RGBLed::Green () {
57 // Accende il LED di verde
61 void RGBLed::Blue () {
62 // Accende il LED di blu
66 void RGBLed::Magenta () {
67 // Accende il LED di magenta
71 void RGBLed::Cyano () {
72 // Accende il LED di Cyano
76 void RGBLed::Yellow () {
77 // Accende il LED di giallo
81 void RGBLed::White () {
88 SetColor(255,255,255);
93 /////////////////////////////////////
96 Lampeggiatore::Lampeggiatore(int pin)
99 pinMode(ledPin, OUTPUT);
105 // Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
106 void Lampeggiatore::Invert() {
107 // Inverte il lampeggio
111 void Lampeggiatore::Blink() {
112 // Illumina il led a 500ms
114 if(millis() + shift - previousMillis > interval) {
116 // if the LED is off turn it on and vice-versa:
117 ledState = !ledState ; // Inverti il LED
118 // set the LED with the ledState of the variable:
119 digitalWrite(ledPin, ledState);
120 // save the last time you blinked the LED
121 previousMillis += interval;
125 void Lampeggiatore::Blink(long time, long drift ) {
126 // Illumina il led secondo un intervallo passato come argomento
129 if(millis() + shift - previousMillis > time) {
130 // if the LED is off turn it on and vice-versa:
131 ledState = !ledState ; // Inverti il LED
132 // set the LED with the ledState of the variable:
133 digitalWrite(ledPin, ledState);
134 // save the last time you blinked the LED
135 previousMillis += time;
139 void Lampeggiatore::Blink(long up, long down, long drift ) {
140 // Illumina il ledB precisando ontime e downtime
143 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
144 // save the last time you blinked the LED
145 previousMillis += up;
148 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
149 previousMillis += down;
153 // set the LED with the ledState of the variable:
154 digitalWrite(ledPin, ledState);
157 void Lampeggiatore::High() {
160 digitalWrite(ledPin, HIGH);
163 void Lampeggiatore::Low() {
166 digitalWrite(ledPin, LOW);
169 void Lampeggiatore::Swap() {
170 // Inverte lo stato del LED
172 digitalWrite(ledPin, !digitalRead(ledPin));
175 /////////////////////////////////////
179 // Gestione del PWM utilizzando millis
180 // per non bloccare il processore con delay
181 // Warning: serialWrite puo' interferire con i tempi.
184 pinMode(ledPin, OUTPUT);
186 byte brightness = 0 ;
190 void Pwm::Up(long speed, long drift) {
191 // Aumenta linearmente la luminosita' usanndo millis()
192 // quindi senza bloccare il processore
193 // Viene usato un float, in alternativa un coseno
195 if (millis() != previousMillis) { // si potrebbe togliere
197 brightness = 255.0 /(float)speed * (millis() + shift);
198 analogWrite(ledPin, brightness);
200 previousMillis = millis();
204 void Pwm::lUp(long speed, long drift) {
205 // Aumenta usanndo millis() con correzione luminosita' LED
206 // quindi senza bloccare il processore
207 // Viene usato un float, in alternativa un coseno
209 if (millis() != previousMillis) { // si potrebbe togliere
211 brightness = 255.0 /(float)speed * (millis() + shift);
212 analogWrite(ledPin, lum(brightness));
214 previousMillis = millis();
218 void Pwm::Down(long speed, long drift) {
219 // Riduce linearmente la luminosita' usanndo millis()
220 // quindi senza bloccare il processore
222 if (millis() != previousMillis) {
224 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
225 analogWrite(ledPin, brightness);
227 previousMillis = millis();
231 void Pwm::lDown(long speed, long drift) {
232 // Riduce usanndo millis() con correzione della luminosita'
233 // quindi senza bloccare il processore
235 if (millis() != previousMillis) {
237 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
238 analogWrite(ledPin, lum(brightness));
240 previousMillis = millis();
244 void Pwm::UD(long speed, long drift ) {
245 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
247 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
248 analogWrite(ledPin, brightness);
251 void Pwm::Set(byte brightness) {
252 // Imposta il valore del PWM
253 analogWrite(ledPin, brightness);
257 void Pwm::lSet(byte brightness) {
258 // Imposta il valore del PWM con correzione luminosita' LED
259 analogWrite(ledPin, lum(brightness));
263 /////////////////////////////////////
266 Sequenza::Sequenza (byte passed[], byte dim) {
269 for (int thisPin = 0; thisPin < size; thisPin++) {
270 pinMode(ledPins[thisPin], OUTPUT);
272 previousMillis = millis();
273 digitalWrite(ledPins[0], HIGH);
276 void Sequenza::Update(long value) {
277 // Incrementa dal primo all'ultimo valore dell'array
279 if (millis() - previousMillis >= interval) {
280 previousMillis = millis();
282 if ( i < size - 1 ) {
283 // Spegni precedente led
284 digitalWrite(ledPins[i], LOW);
286 // Accendi successivo led
287 digitalWrite(ledPins[++i], HIGH);
290 else if (i == size - 1 ) {
293 previousMillis = millis();
294 digitalWrite(ledPins[i], HIGH);
295 digitalWrite(ledPins[ size - 1 ], LOW);
301 void Sequenza::Reverse(long value) {
303 if (millis() - previousMillis >= interval) {
304 previousMillis = millis();
306 if (i == 0) { // Entry point, ultimo LED
307 digitalWrite(ledPins[size -1],HIGH);
308 digitalWrite(ledPins[0],LOW);
312 digitalWrite(ledPins[i],LOW);
313 digitalWrite(ledPins[--i],HIGH);
318 void Sequenza::UD(long value) {
320 if (millis() - previousMillis >= interval) {
321 previousMillis = millis();
322 // Spegni precedente led
323 digitalWrite(ledPins[i], LOW);
325 // Accendi successivo led
326 digitalWrite(ledPins[i], HIGH);
328 if (i == 0 || i == size -1) {
339 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
340 // Accende e spegne il LED accetando un argomento
341 // per impostare la velocita'.
343 pinMode(pin, OUTPUT);
344 // sequenze di istruzione: accendere e spegnere il LED
345 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
346 delay(velocita); // wait for a second
347 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
348 delay(velocita); // wait for a second
353 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
355 return pgm_read_byte_near(BCORRECT + val);
359 int calibraTrim(int pin, byte ledPin) {
360 /* START Calibrazione TRIM canale:
362 calcolo del valore medio esclusi gli 0
364 I canali come alettoni / elevatore possono avere un TRIM
365 (generalmente il throttle non ha un TRIM impostato),
366 questa funzione nel setup serve per trovare il punto medio
367 all'avvio dello sketch.
372 Serial.println(">> Calibrazione: ");
374 if (millis() > 10000) {
375 Serial.print(">> Calibrazione annullata: segnale assente.");
379 ailIn = pulseIn(pin, HIGH, 25000);
386 digitalWrite(ledPin, !digitalRead(ledPin));
390 Serial.println(">> Fine Calibrazione: ");
391 Serial.print(ail / 10);
392 Serial.println("--");