Learning   Examples | Foundations | Hacking | Links

/*
* Código para hacer que un potenciometro  controle 3 LEDs, uno rojo, uno verde y otro azul, o un LED RGB.
* El programa hace un fundido de rojo a verde, de verde a azul y de azul a rojo.
* Para el depurado del código se utilizan funciones de comunicación serie.
* Clay Shirky <clay.shirky@nyu.edu> 
*/

// Entrada: un potenciómetro conectado a 5v y a GND

int potPin = 3; // salida del potenciómetro conectada a la entrada analógica 3
int potVal = 0; // Variable en la que se guardará la entrada del pontenciómetro

// Salida: usamos los pines digitales del 9 al 11, son pines PWM
// los cátodos de los LED's se conectan a GND
int redPin = 9;   // LED rojo, en pin 9
int grnPin = 10;  // LED verde, en pin 10
int bluPin = 11;  // LED azul, en pin 11

// Variables
int redVal = 0;   // Variables en las que se guardan los valores a enviar a los pines
int grnVal = 0;
int bluVal = 0;

int DEBUG = 1;          // Se pone a 1 para enviar códigos de depuración al puerto serie

void setup()
{
  pinMode(redPin, OUTPUT);   // establece los pines como salidas
  pinMode(grnPin, OUTPUT);   
  pinMode(bluPin, OUTPUT); 

  if (DEBUG) {           // si queremos ver los valores de los pines para el depurado...
    Serial.begin(9600);  // ...inicializamos el puerto serie
  }
}

// Programa principal

void loop()
{
  potVal = analogRead(potPin);   // lee el valor del potenciómetro
  if (potVal < 341)  // tercio más bajo del rango del potenciómetro (0-340)
  {                  
    potVal = (potVal * 3) / 4; // Normaliza a 0-255

    redVal = 256 - potVal;  // rojo de todo a nada
    grnVal = potVal;        // verde de nada a todo
    bluVal = 1;             // azul apagado
  }
  else if (potVal < 682) // tercio central del rango del potenciómetro (341-681)
  {
    potVal = ( (potVal-341) * 3) / 4; // Normaliza a 0-255

    redVal = 1;            // rojo apagado
    grnVal = 256 - potVal; // verde de todo a nada
    bluVal = potVal;       // azul de nada a todo
  }
  else  // tercio superior del rango del potenciómetro (682-1023)
  {
    potVal = ( (potVal-683) * 3) / 4; // Normaliza a 0-255

    redVal = potVal;       // rojo de nada a todo
    grnVal = 1;            // verde apagado
    bluVal = 256 - potVal; // azul de todo a nada
  }
  analogWrite(redPin, redVal);   // escribe los valores de los pines de salida
  analogWrite(grnPin, grnVal); 
  analogWrite(bluPin, bluVal);  

  if (DEBUG) { // si queremos leer la salida
    DEBUG += 1;      // incrementamos el contador DEBUG
    if (DEBUG > 100) // damos salida a los datos cada 100 lecturas
    {
      DEBUG = 1;     // reseteamos el contador
                             // salida serie
      Serial.print("R:");    // indica que la salida es la roja
      Serial.print(redVal);  // imprime el valor rojo
      Serial.print("\t");    // carácter de tabulación
      Serial.print("G:");    // repite para el verde y el azul
      Serial.print(grnVal);
      Serial.print("\t");    
      Serial.print("B:");    
      Serial.println(bluVal); // println, para terminar con un retorno de carro
    }
  }
}

Share