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

Share