Misturador de cores com três LEDs e três potenciômetros
/*
* Misturador de Cores com "Copinho de Café"
* Código para misturar e exibir cor mediada por PWM
* Convenciona-se o uso do Arduino 0004 ou superior,
* pois usamos comunicação no estilo Serial.begin()
*
* Controle 3 LEDs com 3 potenciômetros
* Se os LEDs são de cores diferentes e estão apontados a
* uma superfície difusora (presos numa bola de ping-pong
* ou em um copo de café com tampa plástica), as cores
* vão misturar-se.
*
* Quando encontrar uma cor que lhe agrade, pare o ajuste
* nos potenciômetros. Os valores das componentes de cada
* cor serão transmitidos via saída serial.
*
* As cores preferenciais são vermelho, verde e azul, mas
* qualquer combinação de três cores é válida; vermelho +
* azul + branco resultará em tons de vermelho, azul e roxo
* (e nenhum amarelo, alaranjado, verde ou turquesa).
*
* Providencie resistores de 220 ohms em linha com os pots,
* para prevenir o circuito de ser aterrado quando os pots
* estiverem em zero
*/
// Configuração dos pinos analógicos
int aIn = 0; // potenciômetros conectados aos pinos analógicos 0, 1 e 2
int bIn = 1; // (Conecte a energia aos 5V e o terra ao GND)
int cIn = 2;
// Configuração dos pinos digitais
int aOut = 9; // LEDs conectados aos pinos digitais 9, 10 e 11
int bOut = 10; // (Conecte os catodos ao GND)
int cOut = 11;
// Values
int aVal = 0; // Variáveis a guardar a entrada vinda dos potenciômetros
int bVal = 0;
int cVal = 0;
// Variáveis para comparar valores entre voltas do laço
int i = 0; // Contador de laço
int wait = (1000); // Pausa entre o ajuste mais recente do pot e a saída
int checkSum = 0; // Agregue valores dos pots
int prevCheckSum = 0;
int sens = 3; // Limiar de sensibilidade, para prevenir que pequenas variações
// nos valores dos pots causem resultados irregulares
// FLAGS
int PRINT = 1; // Ajustar para 1 para enviar à saída
int DEBUG = 1; // Ajustar para 1 para ligar depuração de erros
void setup()
{
pinMode(aOut, OUTPUT); // ajuste pinos digitais como saída
pinMode(bOut, OUTPUT);
pinMode(cOut, OUTPUT);
Serial.begin(9600); // abra comunicação serial
}
void loop()
{
i += 1; // Count loop
aVal = analogRead(aIn) / 4; // leia entrada e converta para escala 0-255
bVal = analogRead(bIn) / 4;
cVal = analogRead(cIn) / 4;
analogWrite(aOut, aVal); // Transmita novos valores aos LEDs
analogWrite(bOut, bVal);
analogWrite(cOut, cVal);
if (i % wait == 0) // Passado tempo o bastante, ...
{
checkSum = aVal+bVal+cVal; // ...some os 3 valores.
if ( abs(checkSum - prevCheckSum) > sens ) // Se a diferença entre o valor atual e o anterior
// estiver acima do limiar de sensibilidade
{
if (PRINT) // ...e se o flag PRINT estiver vigente...
{
Serial.print("A: "); // ...então imprima os 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; // Renove o flag
}
prevCheckSum = checkSum; // Renove os valores
if (DEBUG) // Caso também queira depurar erros...
{
Serial.print(checkSum);
Serial.print("<=>");
Serial.print(prevCheckSum);
Serial.print("\tPrint: ");
Serial.println(PRINT);
}
}
}