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
}
}
}