Learning   Examples | Foundations | Hacking | Links


/*
* Código para el fundido de tres LEDs, rojo, verde y azul, o un LED tricolor, usando PWM
* El programa pasa suavemente de rojo a verde, verde a azul y aziul a rojo
* El código de depuración asume Arduino 0004, ya que utiliza el nuevo Serial.begin() estilo de funciones
* Clay Shirky <clay.shirky@nyu.edu> 
*/

// Salida
int redPin   = 9;   // LED rojo,  conectado al pin 9 digital
int greenPin = 10;  // LED verde, conectado al pin 10 digital
int bluePin  = 11;  // LED Azul,  conectado al pin 11 digital

// Variables de programa
int redVal   = 255; // Variables para almacenar los valores a ser enviados a los pines
int greenVal = 1;   // Los valores iniciales son Rojo a tope, Verde y Azul al mínimo
int blueVal  = 1;

int i = 0;     // Contador del bucle
int wait = 50; // 50ms (.05 segundo) retardo; acortar para una transición mas rápida
int DEBUG = 0; // Contador de DEBUG; si está a 1, will escribe los valores vía puerto serie

void setup()
{
  pinMode(redPin,   OUTPUT);   // pone los pines como salida
  pinMode(greenPin, OUTPUT);   
  pinMode(bluePin,  OUTPUT); 
  if (DEBUG) {           // Si queremos ver los valores de los pines para depurar...
    Serial.begin(9600);  // ...establece la salida serie en el estilo 0004
  }
}

// Programa principal
void loop()
{
  i += 1;      // Incrementa el contador
  if (i < 255) // Primera fase de transición
  {
    redVal   -= 1; // Rojo baja
    greenVal += 1; // Verde sube
    blueVal   = 1; // Azul bajo
  }
  else if (i < 509) // Segunda fase de transición
  {
    redVal    = 1; // Rojo bajo
    greenVal -= 1; // Verde baja
    blueVal  += 1; // Azul sube
  } 
  else if (i < 763) // Tercera fase de transición
  {
    redVal  += 1; // Rojo sube
    greenVal = 1; // Verde bajo
    blueVal -= 1; // Azul baja
  }
  else // Reinicia el contador e inicia la transición de nuevo
  {
    i = 1;
  }  

  analogWrite(redPin,   redVal);   // Escribe los valores actuales actuales en los pines de los LEDs
  analogWrite(greenPin, greenVal); 
  analogWrite(bluePin,  blueVal);  

  if (DEBUG) { // Si queremos leer la salida
    DEBUG += 1;     // Incrementa el contador de DEBUG
    if (DEBUG > 10) // Imprime cada 10 bucles
    {
      DEBUG = 1;     // Reinicia el contador

      Serial.print(i);       // Comandos serie en estilo 0004
      Serial.print("\t");    // Visualiza un tabulador
      Serial.print("R:");    // Indica que la salida es el valor de Rojo
      Serial.print(redVal);  // Visualiza el valor de Rojo
      Serial.print("\t");    // Visualiza un tabulador
      Serial.print("G:");    // Repite pra verde y azul...
      Serial.print(greenVal);
      Serial.print("\t");    
      Serial.print("B:");    
      Serial.println(blueVal); // println, para finalizar con un retorno de carro
    }
  }
  delay(wait); // pausa para esperar 'wait' milisegundos antes de reiniciar el bucle
}

Share