//////////////////////
// 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);
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 () {
interval = 500;
};
-
-
-
// Una funzione facente parte di una classe prende il nome di "metodo" della stessa:
void Lampeggiatore::Invert() {
// Inverte il lampeggio
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);
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();
- Serial.println(brightness);
};
}
// 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();
- Serial.println(brightness);
};
}
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();
- Serial.println(brightness);
- analogWrite(ledPin, brightness);
- if (brightness == 0 || brightness == 255) { // Reverse direction
- increment = -increment ;
- };
- };
+
+ 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
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);
+};