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) {
115 // save the last time you blinked the LED
116 previousMillis = millis();
118 // if the LED is off turn it on and vice-versa:
119 ledState = !ledState ; // Inverti il LED
121 // set the LED with the ledState of the variable:
122 digitalWrite(ledPin, ledState);
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 // save the last time you blinked the LED
131 previousMillis = millis();
133 // if the LED is off turn it on and vice-versa:
134 ledState = !ledState ; // Inverti il LED
136 // set the LED with the ledState of the variable:
137 digitalWrite(ledPin, ledState);
140 void Lampeggiatore::Blink(long up, long down, long drift ) {
141 // Illumina il ledB precisando ontime e downtime
144 if((ledState == HIGH)&& (millis() + shift - previousMillis > up)) {
145 // save the last time you blinked the LED
146 previousMillis = millis();
149 else if((ledState == LOW)&& (millis() + shift - previousMillis > down)) {
150 previousMillis = millis();
154 // set the LED with the ledState of the variable:
155 digitalWrite(ledPin, ledState);
158 void Lampeggiatore::High() {
161 digitalWrite(ledPin, HIGH);
164 void Lampeggiatore::Low() {
167 digitalWrite(ledPin, LOW);
170 void Lampeggiatore::Swap() {
171 // Inverte lo stato del LED
173 digitalWrite(ledPin, !digitalRead(ledPin));
176 /////////////////////////////////////
180 // Gestione del PWM utilizzando millis
181 // per non bloccare il processore con delay
182 // Warning: serialWrite puo' interferire con i tempi.
185 pinMode(ledPin, OUTPUT);
187 byte brightness = 0 ;
191 void Pwm::Up(long speed, long drift) {
192 // Aumenta linearmente la luminosita' usanndo millis()
193 // quindi senza bloccare il processore
194 // Viene usato un float, in alternativa un coseno
196 if (millis() != previousMillis) { // si potrebbe togliere
198 brightness = 255.0 /(float)speed * (millis() + shift);
199 analogWrite(ledPin, brightness);
201 previousMillis = millis();
205 void Pwm::lUp(long speed, long drift) {
206 // Aumenta usanndo millis() con correzione luminosita' LED
207 // quindi senza bloccare il processore
208 // Viene usato un float, in alternativa un coseno
210 if (millis() != previousMillis) { // si potrebbe togliere
212 brightness = 255.0 /(float)speed * (millis() + shift);
213 analogWrite(ledPin, lum(brightness));
215 previousMillis = millis();
219 void Pwm::Down(long speed, long drift) {
220 // Riduce linearmente la luminosita' usanndo millis()
221 // quindi senza bloccare il processore
223 if (millis() != previousMillis) {
225 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
226 analogWrite(ledPin, brightness);
228 previousMillis = millis();
232 void Pwm::lDown(long speed, long drift) {
233 // Riduce usanndo millis() con correzione della luminosita'
234 // quindi senza bloccare il processore
236 if (millis() != previousMillis) {
238 brightness = 255 - 255.0 /(float)speed * (millis() + shift) ;
239 analogWrite(ledPin, lum(brightness));
241 previousMillis = millis();
245 void Pwm::UD(long speed, long drift ) {
246 // Aumenta e riduce in sequenza la luminosita' usanndo millis()
248 brightness = 128 + 127 * cos(2 * PI / speed * (millis() + shift));
249 analogWrite(ledPin, brightness);
252 void Pwm::Set(byte brightness) {
253 // Imposta il valore del PWM
254 analogWrite(ledPin, brightness);
258 void Pwm::lSet(byte brightness) {
259 // Imposta il valore del PWM
260 analogWrite(ledPin, lum(brightness));
264 /////////////////////////////////////
267 Sequenza::Sequenza (byte passed[], byte dim) {
270 for (int thisPin = 0; thisPin < size; thisPin++) {
271 pinMode(ledPins[thisPin], OUTPUT);
273 previousMillis = millis();
274 digitalWrite(ledPins[0], HIGH);
277 void Sequenza::Update(long value) {
278 // Incrementa dal primo all'ultimo valore dell'array
280 if (millis() - previousMillis >= interval) {
281 previousMillis = millis();
283 if ( i < size - 1 ) {
284 // Spegni precedente led
285 digitalWrite(ledPins[i], LOW);
287 // Accendi successivo led
288 digitalWrite(ledPins[++i], HIGH);
291 else if (i == size - 1 ) {
294 previousMillis = millis();
295 digitalWrite(ledPins[i], HIGH);
296 digitalWrite(ledPins[ size - 1 ], LOW);
302 void Sequenza::Reverse(long value) {
304 if (millis() - previousMillis >= interval) {
305 previousMillis = millis();
307 if (i == 0) { // Entry point, ultimo LED
308 digitalWrite(ledPins[size -1],HIGH);
309 digitalWrite(ledPins[0],LOW);
313 digitalWrite(ledPins[i],LOW);
314 digitalWrite(ledPins[--i],HIGH);
319 void Sequenza::UD(long value) {
321 if (millis() - previousMillis >= interval) {
322 previousMillis = millis();
323 // Spegni precedente led
324 digitalWrite(ledPins[i], LOW);
326 // Accendi successivo led
327 digitalWrite(ledPins[i], HIGH);
329 if (i == 0 || i == size -1) {
340 void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header
341 // Accende e spegne il LED accetando un argomento
342 // per impostare la velocita'.
344 pinMode(pin, OUTPUT);
345 // sequenze di istruzione: accendere e spegnere il LED
346 digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level)
347 delay(velocita); // wait for a second
348 digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW
349 delay(velocita); // wait for a second
354 // Mappatura dell'intervallo 0-255 con correzione di luminosita.
356 return pgm_read_byte_near(BCORRECT + val);
360 int calibraTrim(int pin, byte ledPin) {
361 /* START Calibrazione TRIM canale:
363 calcolo del valore medio esclusi gli 0
365 I canali come alettoni / elevatore possono avere un TRIM
366 (generalmente il throttle non ha un TRIM impostato),
367 questa funzione nel setup serve per trovare il punto medio
368 all'avvio dello sketch.
373 Serial.println(">> Calibrazione: ");
375 ailIn = pulseIn(pin, HIGH, 25000);
382 digitalWrite(ledPin, !digitalRead(ledPin));
386 Serial.print(">> Fine Calibrazione: ");
387 Serial.print(ail / 10);
388 Serial.println("--");