Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

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