Learning Examples | Foundations | Hacking | Links
/*
* Mezclador de colores "taza de café":
* Código para mezclar un color y presentarlo mediante PWM.
* Para versiones de Arduino 0004 o superiores, se utilizan funciones de comunicación serie para el depurado.
* Control de 3 LEDs con 3 potenciómetros.
* Si los LEDs son de diferentes colores y se dirigen hacia una superficie difusora los colores se mezclarán.
* Cuando encuentres el color que buscas deja de ajustar los potenciómetros.
* Los valores que han creado el color serán enviados por el puerto serie.
* Los colores estándar para mezclar luces son el rojo, el verde y el azul, pero puedes
* probar con otros tres colores; rojo + azul + blanco te permitirán mezclar gamas de rojo.
* Utiliza resistencias de 220 Ohm en serie con los potenciómetros para prevenir la puesta a tierra del
* circuito cuando los potenciómetros estén a cero.
*/
// Establecemos los pines analógicos
int aIn = 0; // Potenciómetros conectados a los pines analógicos 0, 1 y 2
int bIn = 1; // (Conectar alimentación a 5V y masa a GND)
int cIn = 2;
// Establecemos los pines digitales
int aOut = 9; // LEDs conectados a los pines digitales 9, 10 y 11
int bOut = 10; // (Conectar los cátodos a GND)
int cOut = 11;
// Valores
int aVal = 0; // Variables para almacenar las entradas de los potenciómetros
int bVal = 0;
int cVal = 0;
// Variables para comparar valores entre ciclos
int i = 0; // contador de ciclo
int wait = (1000); // retardo entre el mas reciente ajuste de potenciómetro y salida
int checkSum = 0; // sumar al valor del potenciómetro
int prevCheckSum = 0;
int sens = 3; // umbral de sensivilidad, para prevenir pequeños cambios en
// los valores de los potenciómetros debidos al ruido
// BANDERAS
int PRINT = 1; // puesto a 1 para dar salida a los valores
int DEBUG = 1; // puesto a 1 para conectar la salida de depurado
void setup()
{
pinMode(aOut, OUTPUT); // establece los pines digitales como salidas
pinMode(bOut, OUTPUT);
pinMode(cOut, OUTPUT);
Serial.begin(9600); // inicializa la comunicación serie
}
void loop()
{
i += 1; // contador de ciclos
aVal = analogRead(aIn) / 4; // lee los pines de entrada y escala 0-255
bVal = analogRead(bIn) / 4;
cVal = analogRead(cIn) / 4;
analogWrite(aOut, aVal); // envía los nuevos valores a los LEDs
analogWrite(bOut, bVal);
analogWrite(cOut, cVal);
if (i % wait == 0) // si ha pasado suficiente tiempo...
{
checkSum = aVal+bVal+cVal; // ...suma los tres valores.
if ( abs(checkSum - prevCheckSum) > sens ) // Si los viejos y los nuevos valores son diferentes
// por encima del umbral de sensivilidad
{
if (PRINT) // ...y si la bandera PRINT está establecida...
{
Serial.print("A: "); // ...imprime los valores.
Serial.print(aVal);
Serial.print("\t");
Serial.print("B: ");
Serial.print(bVal);
Serial.print("\t");
Serial.print("C: ");
Serial.println(cVal);
PRINT = 0;
}
}
else
{
PRINT = 1; // resetea la bandera
}
prevCheckSum = checkSum; // actualiza los valores
if (DEBUG) // si queremos salida de depurado...
{
Serial.print(checkSum);
Serial.print("<=>");
Serial.print(prevCheckSum);
Serial.print("\tPrint: ");
Serial.println(PRINT);
}
}
}