Il mio primo "grande" progetto: Fading RGB LED con controllo IR

Per quanto alla fine sia molto semplice, con grande orgoglio pubblico il mio primo “grande” progetto realizzato.

Descrizione:

Si tratta di un LED RGB collegato a 3 uscite PWM che passano diverse intensità per regolare il colore.
Inoltre, tramite un apposito ricevitore IR, posso da telecomando aumentare o diminuire la velocità con cui il colore cambia o mettere anche in pausa.

Note curiose:

  • Per la prima volta ho sperimentato un conflitto tra timer e pin PWM, ho dovuto quindi spostare qualche collegamento.
  • Il pin del red rosso è collegato a una 220 Ohm, i pin dei led verde e blu a delle 2000 Ohm. Ho dovuto fare ciò per cercare di equlibrare l’intensità del verde e blu che è molto maggiore.

Board:

Codice:

#include <IRremote.h>

int redPin = 9;
int greenPin = 10;
int bluePin = 6;
int irPin = 11;
int RGBDelay = 10;
int RGBPause = 2000;
bool RGBStatus = true;

#define codePlayPause  49725
#define codeSpeedUp  765
#define codeSlowDown  8925

IRrecv irrecv(irPin);
decode_results results;

void setup(){
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  //pinMode(irPin, INPUT);
  Serial.begin(9600);
  irrecv.enableIRIn();
  irrecv.blink13(true);
}

void loop(){
  
  // Red -> Orange -> Yellow
  for(int i = 0; i < 256; i++){
    rgb(255, i, 0);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
  // Yellow -> Light Green -> Green
  for(int i = 0; i < 256; i++){
    rgb(255-i, 255, 0);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
  // Green -> Aqua -> Azure
  for(int i = 0; i < 256; i++){
    rgb(0, 255, i);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
  // Azure -> Indaco -> Blue
  for(int i = 0; i < 256; i++){
    rgb(0, 255-i, 255);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
  // Blue -> Violet -> Purple
  for(int i = 0; i < 256; i++){
    rgb(i, 0, 255);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
  // Purple -> Scarlet -> Red
  for(int i = 0; i < 256; i++){
    rgb(255, 0, 255-i);
    if(i == 127) {
       delay(RGBPause);
    }
  }
  delay(RGBPause);
  
}

void rgb(int red, int green, int blue){
  if(irrecv.decode(&results)) {
    unsigned int value = results.value;
    switch(value) {
       // Play/Pause
       case codePlayPause:
          RGBStatus = !RGBStatus;
          break;
       // Increase Speed
       case codeSpeedUp:
          RGBDelay -= 10;
          if(RGBDelay < 10) {
            RGBDelay = 10;
          }
          break; 
       // Decrease Speed
       case codeSlowDown:
          RGBDelay += 10;
          if(RGBDelay > 200) {
            RGBDelay = 200;
          }
          break;
       // Default
       default:
          break;
    }
    Serial.println(value);
    irrecv.resume();
  }
  
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);

  while( !RGBStatus ) {
    if(irrecv.decode(&results)) {
      unsigned int value = results.value;
      if( value == codePlayPause ) {
        RGBStatus = !RGBStatus;
        Serial.println(value);
        irrecv.resume();
        break;
      }
      Serial.println(value);
      irrecv.resume();
    }
  }

  RGBPause = RGBDelay*200;
  delay(RGBDelay);
  //Serial.println(String(red)+':'+String(green)+':'+String(blue));
}

Nel datasheet del LED vedi l' intensitá dei 3 colori. C'é da dire che i 3 colori invecchiano in modo diverso. Spesso non sono uguali e poi la ricezione della luminositá dell'occhio umano non é uguale per tutti i colori. Il verde si vede piú luminoso.
Ciao Uwe

Ciao, grazie per la tua risposta, ora do una lettura!