Temporizador de cuenta regresiva Arduino con LCD

El temporizador de cuenta atrás Arduino con pulsadores o codificador y pantalla LCD 1602 I2C es un proyecto interesante y útil. Echemos un vistazo a algunas variantes de un temporizador de cuenta atrás en Arduino Nano o Arduino Uno que se puede utilizar en una cocina o acuario para encender una luz y una indicación acústica o relé de Arduino. Y usted mismo puede elegir el temporizador o cuenta atrás más adecuado para su proyecto.

Para esta actividad necesitaremos:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • pantalla LCD 1602 I2C;
  • codificador rotativo / pulsadores;
  • zumbador pasivo o activo;
  • breadboard y cables de conexion;
  • librerias LiquidCrystal_I2C.h y RotaryEncoder.h

Como crear temporizador de cuenta atrás con pulsadores

Temporizador de cuenta atrás con pulsadores
El circuito eléctrico. Temporizador Arduino con pulsadores
LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

La primera variante del proyecto es un temporizador Arduino con control por botones. Haciendo clic en el primer y segundo botón, puedes aumentar y disminuir el intervalo de tiempo en minutos. Al hacer clic en el tercer botón, conectado al pin 6 del Arduino Uno, se inicia la cuenta atrás. Al final de la cuenta atrás, el LED se ilumina y suena el zumbador. El cuarto botón, conectado al pin 8, se utiliza para reiniciar el temporizador.

También puedes parar el temporizador en cualquier momento pulsando el tercer botón. Después de montar el diagrama de cableado, descarga el siguiente programa temporizador de ejemplo en el Arduino. Tenga en cuenta que para ejecutar el temporizador en una pantalla con un módulo I2C, tendrá que instalar la biblioteca LiquidCrystal_I2C. El comando millis permite ejecutar sin retardo añadiendo multitarea al funcionamiento de Arduino.

Programme Arduino temporizador de cuenta atrás

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 16, 2);

boolean button1WasUp = true;
boolean button2WasUp = true;
boolean button3WasUp = true;
boolean button4WasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(2, INPUT_PULLUP);
   pinMode(4, INPUT_PULLUP);
   pinMode(6, INPUT_PULLUP);
   pinMode(8, INPUT_PULLUP);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.begin();
   LCD.backlight(); 

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {
   boolean button1IsUp = digitalRead(2);
   boolean button2IsUp = digitalRead(4);
   boolean button3IsUp = digitalRead(6);
   boolean button4IsUp = digitalRead(8);

    if (button1WasUp && !button1IsUp) {
      delay(10);
      button1IsUp = digitalRead(2);
      if (!button1IsUp) {
         MIN = MIN - 1; SEC = 0;
         if (MIN < 0) { MIN = 0; }
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button1WasUp = button1IsUp;
   
   if (button2WasUp && !button2IsUp) {
      delay(10); 
      button2IsUp = digitalRead(4); 
      if (!button2IsUp) { 
         MIN = MIN + 1; SEC = 0; 
         LCD.clear(); 
         LCD.setCursor(2, 0); 
         LCD.print("TIMER STOP"); 
         LCD.setCursor(5, 1); 
         LCD.print(MIN); 
         LCD.print(" : "); 
         LCD.print(SEC);
      }
   } 
   button2WasUp = button2IsUp;

   if (button3WasUp && !button3IsUp && MIN > 0) {
      delay(10);
      button3IsUp = digitalRead(6);
      if (!button3IsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   button3WasUp = button3IsUp;

   if (button4WasUp && !button4IsUp) {
      delay(10);
      button4IsUp = digitalRead(8);
      if (!button4IsUp) {
         MIN = 0; SEC = 0;
         digitalWrite(10, HIGH);
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
   }
   button4WasUp = button4IsUp;

   while (w == 1 ) {
      if (millis() - timer > 995) {
         timer = millis();
         SEC = SEC - 1;

         if (SEC == 0 && MIN == 0) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER  STOP");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
            digitalWrite(10, HIGH);
            tone(12, 100);
            delay(500);
            noTone(12);
            w = 0;
         }

         if (SEC == 0) {
            SEC = 59; MIN = MIN - 1;
            if (MIN < 0 ) { MIN = 0; }
         }

         if (w == 1) {
            LCD.clear();
            LCD.setCursor(2, 0);
            LCD.print("TIMER START");
            LCD.setCursor(5, 1);
            LCD.print(MIN);
            LCD.print(" : ");
            LCD.print(SEC);
         }
     }
 
     boolean button3IsUp = digitalRead(6);
     if (button3WasUp && !button3IsUp) {
        delay(10);
        button3IsUp = digitalRead(6);
        if (!button3IsUp) {
           LCD.setCursor(2, 0);
           LCD.print("TIMER  STOP");
           w = 0;
        }
     }
     button3WasUp = button3IsUp; 
   }
}

Explicación del código temporizador Arduino con pulsadores:

  1. en el bucle while, se resta un segundo después de 995 milisegundos, ya que otras operaciones tardan algunos milisegundos;
  2. la cuenta atrás sólo puede reiniciarse deteniendo la cuenta atrás.

Temporizador de cuenta atrás Arduino con encoder

Temporizador de cuenta atrás Arduino con encoder
Arduino temporizador de cuenta atrás con encoder

Ahora vamos a ver cómo crear un temporizador Arduino con un codificador rotativo y una pantalla LCD 1602. El principio de control es similar al anterior. Girando el mando del codificador, puedes establecer el intervalo de tiempo deseado, y pulsando el mando, puedes iniciar y detener la cuenta atrás. Aquí hay un diagrama de cómo montar el proyecto en el Arduino Uno. Este proyecto también se puede montar en la placa Arduino Nano.

Programme Arduino para temporizador con codificador

#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

#include "RotaryEncoder.h"
RotaryEncoder encoder(4, 2);

#define STEPS  1
#define POSMIN 0
#define POSMAX 30

int lastPos, newPos;
boolean buttonWasUp = true;

byte w = 0;

int SEC = 0;
int MIN = 0;
unsigned long timer;

void setup() {
   pinMode(6, INPUT_PULLUP);
   encoder.setPosition(0 / STEPS);

   pinMode(10, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(10, HIGH);

   LCD.begin();
   LCD.backlight();

   LCD.setCursor(2, 0);
   LCD.print("TIMER  STOP");
   LCD.setCursor(5, 1);
   LCD.print(MIN);
   LCD.print(" : ");
   LCD.print(SEC);
}

void loop() {

   encoder.tick();
   newPos = encoder.getPosition() * STEPS;
   if (newPos < POSMIN) {
      encoder.setPosition(POSMIN / STEPS);
      newPos = POSMIN;
   }
   else if (newPos > POSMAX) {
      encoder.setPosition(POSMAX / STEPS);
      newPos = POSMAX;
   }

   if (lastPos != newPos) {
      MIN = newPos;
      lastPos = newPos;
      LCD.clear();
      LCD.setCursor(2, 0);
      LCD.print("TIMER  STOP");
      LCD.setCursor(5, 1);
      LCD.print(MIN);
      LCD.print(" : ");
      LCD.print(SEC);
   }

   boolean buttonIsUp = digitalRead(6);
   if (buttonWasUp && !buttonIsUp && MIN > 0) {
      delay(10);
      buttonIsUp = digitalRead(6);
      if (!buttonIsUp) {
         if (SEC == 0) { SEC = 60; MIN = MIN - 1; }
         if (MIN < 0 ) { MIN = 0; }
         digitalWrite(10, LOW);
         w = 1;
      }
   }
   buttonWasUp = buttonIsUp;

   while (w == 1 ) {
      if (millis() - timer > 993) {
         timer = millis();
         SEC = SEC - 1;
 
      if (SEC == 0 && MIN == 0) {
         lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER  STOP");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
         digitalWrite(10, HIGH);
         tone(12, 100);
         delay(500);
         noTone(12);
         w = 0;
      }

      if (SEC == 0 && w==1) {
         SEC = 59; MIN = MIN - 1;
         if (MIN < 0 ) { MIN = 0; }
      }

      if (w == 1) {
         LCD.clear();
         LCD.setCursor(2, 0);
         LCD.print("TIMER START");
         LCD.setCursor(5, 1);
         LCD.print(MIN);
         LCD.print(" : ");
         LCD.print(SEC);
      }
    }

    buttonIsUp = digitalRead(6);
    if (buttonWasUp && !buttonIsUp) {
       delay(10);
       buttonIsUp = digitalRead(6);
       if (!buttonIsUp) {
          lastPos = 0; newPos = 0; MIN = 0; SEC = 0;
          LCD.clear();
          LCD.setCursor(2, 0);
          LCD.print("TIMER  STOP");
          LCD.setCursor(5, 1);
          LCD.print(MIN);
          LCD.print(" : ");
          LCD.print(SEC);
          digitalWrite(10, HIGH);
          w = 0;
       }
    }
    buttonWasUp = buttonIsUp;
  }
}

Explicación del código temporizador con codificador rotativo:

  1. la frecuencia del zumbador de Arduino se puede cambiar usando el comando tone ();
  2. la biblioteca RotaryEncoder debe estar instalada para que el programa funcione.

Conclusión. Esta revisión presenta sólo dos opciones para hacer un reloj con un temporizador para un acuario o la cocina con sus propias manos. En los comentarios, puede dejar preguntas sobre este proyecto (si los hay) o proponer su propia versión del proyecto con un temporizador de cuenta atrás, que se puede añadir a esta revisión.


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *