El tercer sketch: The LED with button and fade

Sketch 'The LED with button and fade'
Sketch 'The LED with button and fade'

Descripción.

Este sketch es la continuación del anterior, The LED with button and state, agregándole el efecto de desvanecimiento mientras se modifica la intensidad del LED.

Si se mantiene presionado el botón (mas de 500 ms.) la intensidad del LED aumenta hasta llegar a su máximo, momento en el cual se apaga por completo y vuelve a iniciar el proceso.  Si se presiona el botón por un momento corto (menos de 500 ms.) la luz del LED se desvanece hasta llegar a cero brillo.

El proceso aparente de desvanecimiento se logra con la combinación de pulsos cada vez mas largos (o mas cortos) que se traducen longitudes de tiempo en que el LED permanece encendido, esto unido al efecto de persistencia del ojo humano (lentitud en el refrescamiento de la imagen de la retina).

Implementación.

Hardware.

Para hacer esto se utilizan los pines digitales 9, 10 u 11 que soportan Modulación por ancho de pulsos (PWM) y permiten manipular la longitud de los pulsos, por esto se movió el LED del pin 13 que había sido habitual hasta ahora, al 9.  Probablemente habría sido precavido agregar una resistencia entre el LED y la tierra (cable azul).

La magia del desvanecimiento se observa en el software.

Software.

En términos generales el sketch realiza lo siguiente.

  • Si se presionó el botón:
    • Cambia el estado a encendido (HIGH).
    • Almacena el momento en que fue presionado.
  • Si se presionó el botón y se mantiene presionado (mas de 500 ms.):
    • Aumenta el brillo.
    • Reinicia el brillo (0) si este excede el máximo (255).
  • Si se presionó el botón corto tiempo (menos de 500 ms.):
    • Cambia el estado a apagado (LOW).
  • Almacena el estado actual del botón como último estado para la siguiente iteración.
  • Si el estado es encendido aumenta el brillo con la instrucción: analogWrite(LED, brightness).
  • Si el estado es apagado disminuye gradualmente el brillo del LED hasta llegar a cero.

Se debe tener siempre en cuenta que la función analogRead retorna un entero entre 0 y 1023 mientras que analogWrite recibe un entero entre 0 y 255, un cuarto del rango del valor retornado por la lectura.

#define LED 9              // Digital PIN for the LED
#define BUTTON 7           // Digital PIN for the Button

int brightness          = 0;      // Amount of light of LED
int lastValue           = LOW;    // Last button status
int state               = LOW;    // Current button status
unsigned long startTime = 0;      // Time of last button pressed

/**
 * Executes only once when the sketch starts, sets initial values
 */

void setup ()
{
  pinMode(LED, OUTPUT);      // LED pin is output
  pinMode(BUTTON, INPUT);    // Button pin is input
}

/**
 * Executes continuously and infinitely
 */

void loop()
{
  int button = digitalRead(BUTTON);         // Reads the button status

  if(button == HIGH && lastValue == LOW)    // The button is pressed
  {
    state = HIGH;                           // The state is ON now

    startTime = millis();                   // Gets the current time

    delay(10);                              // Waits 10 ms.
  }

  if(button == HIGH && lastValue == HIGH)   // The button keeps beign pressed
  {
    if(millis() - startTime >= 500)         // Checks if the button is pressed by
    {                                       // more than 500 ms.
      brightness ++;                        // Amounts the brightness of the LED
      delay(15);                            // Waits for 15 ms.

      if(brightness > 255)                  // If the brightness exceeds 255
        brightness = 0;                     // backs to 0, its a byte
    }
  }

  if(button == LOW && lastValue == HIGH)    // The button is released
  {
    if(millis() - startTime < 500)          // and was pressed less than 500 ms.
      state = LOW;                          // The state is OFF now
  }

  lastValue = button;                       // Sets the current button status as
                                            // last value for the next iteration

  if(state == HIGH)                         // If the state is ON ...
    analogWrite(LED, brightness);           // Make the LED shine with its new brightness
  else                                      // Else, because its OFF ...
    fadeOut();                              // Turn it off gracefully
}

/**
 * Turns off the LED by reducing its brightness until total darkness
 */

void fadeOut()
{
  for(int i=brightness; i>=0; i--)          // Begins with the current level of brightness
  {                                         // decreasing by units until complete off
    analogWrite(LED, i);                    // Sends the reduced brightness to the LED
    delay(10);                              // Waits for 10 ms.
  }

  brightness = 0;                           // Resets the brightness reference to zero
}

One thought on “El tercer sketch: The LED with button and fade”

Leave a Reply

Your email address will not be published. Required fields are marked *