Controlando un LED RGB con Arduino

TOP meneame.net

Para aprender un poco sobre los LEDs RGB he montado uno dentro de una pelota de ping-pong (como difusor) conectado a mi Freeduino; rojo a 9, verde a 10 y azul a 11. Potenciometro 10K al pin 2.

El sketch que he tulizado es una versión propia del que se puede encontrar en este enlace (foro de arduino) ya que el original usaba un potenciometro para fijar el color del LED. Yo empleo el potenciómetro para regular la velocidad de cambio del ciclo de colores.

int potpin = 2;              // Pot connected to digital pin 2

int rpin = 9;
int gpin = 10;
int bpin = 11;
float h;
int h_int;
int r=0, g=0, b=0;

int val=0;

long wait=0;

void h2rgb(float h, int &R, int &G, int &B);

void setup()                    // run once, when the sketch starts
{
 // Serial.begin(115200);           // set up Serial library at 9600 bps

  analogWrite(rpin, 0);
  analogWrite(gpin, 255);
  analogWrite(bpin, 255);
  delay(1000);

  analogWrite(rpin, 255);
  analogWrite(gpin, 0);
  analogWrite(bpin, 255);
  delay(1000);

  analogWrite(rpin, 255);
  analogWrite(gpin, 255);
  analogWrite(bpin, 0);
  delay(1000);

  analogWrite(rpin, 0);
  analogWrite(gpin, 0);
  analogWrite(bpin, 0);
  delay(5000);
}

void loop()                     // run over and over again
{
  wait=analogRead(potpin);    // Read the pin and display the value
  wait=(wait==0)?100:wait*100; // Min. Value 100, else value*100

  if(wait>1000) {
    wait=wait/1000;
    delay(wait);
  } else
    delayMicroseconds(wait);

  //  Serial.println(wait);

  val++;               // When Value reachs the top color,
  if(val == 1023)      // repeat again from the start.
    val=0;

  h = ((float)val)/1024;
  h_int = (int) 360*h;
  h2rgb(h,r,g,b);

  /*Serial.print("Potentiometer value: ");
  Serial.print(val);
  Serial.print(" = Hue of ");
  Serial.print(h_int);
  Serial.print("degrees. In RGB this is: ");
  Serial.print(r);
  Serial.print(" ");
  Serial.print(g);
  Serial.print(" ");
  Serial.println(b);*/

  analogWrite(rpin, r);
  analogWrite(gpin, g);
  analogWrite(bpin, b);

}

void h2rgb(float H, int& R, int& G, int& B) {

  int var_i;
  float S=1, V=1, var_1, var_2, var_3, var_h, var_r, var_g, var_b;

  if ( S == 0 )                       //HSV values = 0 ÷ 1
  {
    R = V * 255;
    G = V * 255;
    B = V * 255;
  }
  else
  {
    var_h = H * 6;
    if ( var_h == 6 ) var_h = 0;      //H must be < 1
    var_i = int( var_h ) ;            //Or ... var_i = floor( var_h )
    var_1 = V * ( 1 - S );
    var_2 = V * ( 1 - S * ( var_h - var_i ) );
    var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) );

    if      ( var_i == 0 ) {
      var_r = V     ;
      var_g = var_3 ;
      var_b = var_1 ;
    }
    else if ( var_i == 1 ) {
      var_r = var_2 ;
      var_g = V     ;
      var_b = var_1 ;
    }
    else if ( var_i == 2 ) {
      var_r = var_1 ;
      var_g = V     ;
      var_b = var_3 ;
    }
    else if ( var_i == 3 ) {
      var_r = var_1 ;
      var_g = var_2 ;
      var_b = V     ;
    }
    else if ( var_i == 4 ) {
      var_r = var_3 ;
      var_g = var_1 ;
      var_b = V     ;
    }
    else                   {
      var_r = V     ;
      var_g = var_1 ;
      var_b = var_2 ;
    }

    R = (1-var_r) * 255;                  //RGB results = 0 ÷ 255
    G = (1-var_g) * 255;
    B = (1-var_b) * 255;
  }
}
<< Volver

Comentalo

*
Contador