]> git.piffa.net Git - sketchbook_andrea/blobdiff - libraries/common/common.cpp
RGB common anodo
[sketchbook_andrea] / libraries / common / common.cpp
index 2de42e975d4bc038ec21bde50c87c5b76b3ba70d..b77c04602ee55539ed315f9198e56ab124aa0b9d 100644 (file)
@@ -9,12 +9,26 @@
 
 //////////////////////
 // RGB LED
-// Common anode
+// Common anode / cat
 
 RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
       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, byte com) {
+    // Per un common catode, inverte il valore max / min
+      redPin    = pinR ;
+      greenPin  = pinG ;
+      bluePin   = pinB ;
+      common    = com ;
 
       // Equvalente del Setup() per inizializzare i PIN
       pinMode(redPin, OUTPUT);
@@ -24,9 +38,9 @@ RGBLed::RGBLed(byte pinR, byte pinG, byte pinB) {
 
 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);
+      analogWrite(redPin,   common - r);
+      analogWrite(greenPin, common - g);
+      analogWrite(bluePin,  common - b);
     };
 
 void RGBLed::Red () {
@@ -83,10 +97,12 @@ Lampeggiatore::Lampeggiatore(int pin)
     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
 
@@ -136,6 +152,9 @@ void Lampeggiatore::Blink(long up, long down) {
 // 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);
@@ -147,13 +166,12 @@ Pwm::Pwm(int pin)
 void Pwm::Up(long speed) {
     // Aumenta progressivamente la luminosita' usanndo millis()
     // quindi senza bloccare il processore
+    // Viene usato un float, in alternativa un coseno
 
-    analogWrite(ledPin, brightness);  // La funziona analogWrite utilizza il PWM
-    // a 8 bit integrato nel MCU: simula un serie di valori intermedi
-    // nell'intervallo discreto con minimo 0 (spento) e  massimo 255 (acceso).
+    if (millis() != previousMillis)  { // si potrebbe togliere
+            brightness = 255.0 /(float)speed * millis() ;
+            analogWrite(ledPin, brightness);
 
-    if ((millis() - previousMillis) > speed / 256) {
-        brightness++; // Incrementiamo la luminosita'
         previousMillis = millis();
     };
 }
@@ -162,28 +180,91 @@ void Pwm::Down(long speed ) {
     // Riduce progressivamente la luminosita' usanndo millis()
     // quindi senza bloccare il processore
 
-    analogWrite(ledPin, brightness);  // La funziona analogWrite utilizza il PWM
-    // a 8 bit integrato nel MCU: simula un serie di valori intermedi
-    // nell'intervallo discreto con minimo 0 (spento) e  massimo 255 (acceso).
+    if (millis() != previousMillis)  {
+            brightness = 255 - 255.0 /(float)speed * millis() ;
+            analogWrite(ledPin, brightness);
 
-    if ((millis() - previousMillis) > speed / 256) {
-        brightness--; // Incrementiamo la luminosita'
         previousMillis = millis();
     };
 }
 
 void Pwm::UD(long speed ) {
     // Aumenta e riduce in sequenza la luminosita' usanndo millis()
-    if ((millis() - previousMillis) > speed / 512) {
-        brightness = brightness + increment; // Incrementiamo la luminosita'
+    brightness = 128 + 127 * cos(2 * PI / speed * millis());
+    analogWrite(ledPin, 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 (brightness == 0 || brightness == 255) { // Reverse direction
-            increment = -increment ;
-        };
-    };
-    analogWrite(ledPin, brightness);
+
+        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 ;
+        }
+    }
+}
 
 
 //////////////////
@@ -202,3 +283,9 @@ pinMode(pin, OUTPUT);
   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);
+};