X-Git-Url: http://git.piffa.net/web?a=blobdiff_plain;f=libraries%2Fcommon%2Fcommon.cpp;h=359896976b81b3a0676fc232d54235dbc215bb1b;hb=51f324396aad33efa1b0218ffee334a1f7d7c084;hp=1eed6a2c3a7353115bed2e0c033e09ce0ffe0628;hpb=b15c46840c12896bd1b29dc360db4f30f8b5dfa4;p=sketchbook_andrea diff --git a/libraries/common/common.cpp b/libraries/common/common.cpp index 1eed6a2..3598969 100644 --- a/libraries/common/common.cpp +++ b/libraries/common/common.cpp @@ -1,11 +1,6 @@ /* Common - Collezione di funzioni e oggetti comuni incontrati durante - i vari esercizi. - - Source file - Contiene il codice C++ delle funzioni e degli oggetti, - nel file common.h ci sono gli headers: prototipi. - + * + * Oggetti di uso comune */ #include "Arduino.h" @@ -14,12 +9,27 @@ ////////////////////// // RGB LED -// Common anode +// Common anode / cat + +RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { + // Per un common catodo, valore max / min invertiti + redPin = pinR ; + greenPin = pinG ; + bluePin = pinB ; + common = 0 ; + + // Equvalente del Setup() per inizializzare i PIN + pinMode(redPin, OUTPUT); + pinMode(greenPin, OUTPUT); + pinMode(greenPin, OUTPUT); +}; -RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { +RGBLed::RGBLed(byte pinR, byte pinG, byte pinB, byte com) { + // Per un common anode, valore max / min normali redPin = pinR ; greenPin = pinG ; bluePin = pinB ; + common = com ; // Equvalente del Setup() per inizializzare i PIN pinMode(redPin, OUTPUT); @@ -27,88 +37,296 @@ RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) { pinMode(greenPin, OUTPUT); }; +void RGBLed::SetColor (byte r, byte g, byte b) { +// Imposta il colore di un LED RGB + analogWrite(redPin, common - r); + analogWrite(greenPin, common - g); + analogWrite(bluePin, common - b); + }; + void RGBLed::Red () { // Accende il LED di rosso - analogWrite(redPin, 0); - analogWrite(greenPin, 255); - analogWrite(bluePin, 255); + SetColor(0,255,255); }; void RGBLed::Green () { // Accende il LED di verde - analogWrite(redPin, 255); - analogWrite(greenPin, 0); - analogWrite(bluePin, 255); + SetColor(255,0,255); }; void RGBLed::Blue () { // Accende il LED di blu - analogWrite(redPin, 255); - analogWrite(greenPin, 255); - analogWrite(bluePin, 0); + SetColor(255,255,0); }; void RGBLed::Magenta () { // Accende il LED di magenta - analogWrite(redPin, 0); - analogWrite(greenPin, 255); - analogWrite(bluePin, 0); + SetColor(0,255,0); }; void RGBLed::Cyano () { // Accende il LED di Cyano - analogWrite(redPin, 255); - analogWrite(greenPin, 0); - analogWrite(bluePin, 0); + SetColor(255,0,0); }; void RGBLed::Yellow () { // Accende il LED di giallo - analogWrite(redPin, 0); - analogWrite(greenPin, 0); - analogWrite(bluePin, 255); + SetColor(0,0,255); }; void RGBLed::White () { // Accende il LED - analogWrite(redPin, 0); - analogWrite(greenPin, 0); - analogWrite(bluePin, 0); + SetColor(0,0,0); }; void RGBLed::Off () { // Spegne il LED - analogWrite(redPin, 255); - analogWrite(greenPin, 255); - analogWrite(bluePin, 255); + SetColor(255,255,255); }; -void RGBLed::SetColor (byte r, byte g, byte b) { - // Imposta il colore di un LED RGB - analogWrite(redPin, r); - analogWrite(greenPin, g); - analogWrite(bluePin, b); + +///////////////////////////////////// +// Lampeggiatore +// Constructor +Lampeggiatore::Lampeggiatore(int pin) +{ + ledPin = pin; + pinMode(ledPin, OUTPUT); + ledState = LOW; + previousMillis = 0; + interval = 500; +}; + +// Una funzione facente parte di una classe prende il nome di "metodo" della stessa: +void Lampeggiatore::Invert() { + // Inverte il lampeggio + ledState = HIGH ; +} + +void Lampeggiatore::Blink() { + // Illumina il led a 500ms + + if(millis() - previousMillis > interval) { + // save the last time you blinked the LED + previousMillis = millis(); + + // if the LED is off turn it on and vice-versa: + ledState = !ledState ; // Inverti il LED + } + // set the LED with the ledState of the variable: + digitalWrite(ledPin, ledState); +}; + +void Lampeggiatore::Blink(long time) { + // Illumina il led secondo un intervallo passato come argomento + + if(millis() - previousMillis > time) { + // save the last time you blinked the LED + previousMillis = millis(); + + // if the LED is off turn it on and vice-versa: + ledState = !ledState ; // Inverti il LED + } + // set the LED with the ledState of the variable: + digitalWrite(ledPin, ledState); +}; + +void Lampeggiatore::Blink(long up, long down) { + // Illumina il ledB precisando ontime e downtime + + if((ledState == HIGH)&& (millis() - previousMillis > up)) { + // save the last time you blinked the LED + previousMillis = millis(); + ledState = LOW ; + } + else if((ledState == LOW)&& (millis() - previousMillis > down)) { + previousMillis = millis(); + ledState = HIGH ; + } + + // set the LED with the ledState of the variable: + digitalWrite(ledPin, ledState); +}; + +void Lampeggiatore::High() { + // Accende il LED + + digitalWrite(ledPin, HIGH); +} + +void Lampeggiatore::Low() { + // Spegne il LED + + digitalWrite(ledPin, LOW); +} + +void Lampeggiatore::Swap() { + // Inverte lo stato del LED + + digitalWrite(ledPin, !digitalRead(ledPin)); +} + +///////////////////////////////////// +// Pwm +// Constructor +Pwm::Pwm(int pin) + // Gestione del PWM utilizzando millis + // per non bloccare il processore con delay + // Warning: serialWrite puo' interferire con i tempi. +{ + ledPin = pin; + pinMode(ledPin, OUTPUT); + previousMillis = 0; + byte brightness = 0 ; + increment = 1; +}; + +void Pwm::Up(long speed) { + // Aumenta linearmente la luminosita' usanndo millis() + // quindi senza bloccare il processore + // Viene usato un float, in alternativa un coseno + + if (millis() != previousMillis) { // si potrebbe togliere + brightness = 255.0 /(float)speed * millis() ; + analogWrite(ledPin, brightness); + + previousMillis = millis(); + }; +} + +void Pwm::lUp(long speed) { + // Aumenta usanndo millis() con correzione luminosita' LED + // quindi senza bloccare il processore + // Viene usato un float, in alternativa un coseno + + if (millis() != previousMillis) { // si potrebbe togliere + brightness = 255.0 /(float)speed * millis() ; + analogWrite(ledPin, lum(brightness)); + + previousMillis = millis(); + }; +} + +void Pwm::Down(long speed ) { + // Riduce linearmente la luminosita' usanndo millis() + // quindi senza bloccare il processore + + if (millis() != previousMillis) { + brightness = 255 - 255.0 /(float)speed * millis() ; + analogWrite(ledPin, brightness); + + previousMillis = millis(); + }; +} + +void Pwm::lDown(long speed ) { + // Riduce usanndo millis() con correzione della luminosita' + // quindi senza bloccare il processore + + if (millis() != previousMillis) { + brightness = 255 - 255.0 /(float)speed * millis() ; + analogWrite(ledPin, lum(brightness)); + + previousMillis = millis(); }; +} + +void Pwm::UD(long speed ) { + // Aumenta e riduce in sequenza la luminosita' usanndo millis() + brightness = 128 + 127 * cos(2 * PI / speed * millis()); + analogWrite(ledPin, brightness); +} + +void Pwm::Set(byte brightness) { + // Imposta il valore del PWM + analogWrite(ledPin, brightness); +} + + +void Pwm::lSet(byte brightness) { + // Imposta il valore del PWM + analogWrite(ledPin, lum(brightness)); +} + + +///////////////////////////////////// +// Sequenza +// Constructor +Sequenza::Sequenza (byte passed[], byte dim) { + ledPins = passed ; + size = dim ; + for (int thisPin = 0; thisPin < size; thisPin++) { + pinMode(ledPins[thisPin], OUTPUT); + } + previousMillis = millis(); + digitalWrite(ledPins[0], HIGH); +} + +void Sequenza::Update(long value) { + // Incrementa dal primo all'ultimo valore dell'array + interval = value; + if (millis() - previousMillis >= interval) { + previousMillis = millis(); + + if ( i < size - 1 ) { + // Spegni precedente led + digitalWrite(ledPins[i], LOW); + + // Accendi successivo led + digitalWrite(ledPins[++i], HIGH); + } + + else if (i == size - 1 ) { + // Ultimo caso + i = 0; + previousMillis = millis(); + digitalWrite(ledPins[i], HIGH); + digitalWrite(ledPins[ size - 1 ], LOW); + } + } +} + + +void Sequenza::Reverse(long value) { + interval = value; + if (millis() - previousMillis >= interval) { + previousMillis = millis(); + + if (i == 0) { // Entry point, ultimo LED + digitalWrite(ledPins[size -1],HIGH); + digitalWrite(ledPins[0],LOW); + i = size -1 ; + } + else { + digitalWrite(ledPins[i],LOW); + digitalWrite(ledPins[--i],HIGH); + } + } +} + +void Sequenza::UD(long value) { + interval = value; + if (millis() - previousMillis >= interval) { + previousMillis = millis(); + // Spegni precedente led + digitalWrite(ledPins[i], LOW); + i = i + inc ; + // Accendi successivo led + digitalWrite(ledPins[i], HIGH); + + if (i == 0 || i == size -1) { + inc = -inc ; + } + } +} ////////////////// // Funzioni -void brilla(byte pin) { - // Accende e spegne il LED senza un argomento - // per impostare la velocita' con delay(). - const int velocita = 500; -pinMode(pin, OUTPUT); - // sequenze di istruzione: accendere e spegnere il LED - digitalWrite(pin, HIGH); // turn the LED on (HIGH is the voltage level) - delay(velocita); // wait for a second - digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW - delay(velocita); // wait for a second -}; - -void brilla(byte pin, int velocita) { +void brilla(byte pin, int velocita ) { // Defalt value di velocita' solo nell'Header // Accende e spegne il LED accetando un argomento // per impostare la velocita'. @@ -119,3 +337,10 @@ pinMode(pin, OUTPUT); digitalWrite(pin, LOW); // turn the LED off by making the voltage LOW delay(velocita); // wait for a second }; + + +byte lum(byte val) { + // Mappatura dell'intervallo 0-255 con correzione di luminosita. + // storata in SRAM +return pgm_read_byte_near(BCORRECT + val); +};