Arduino Tutorial 15: Temporizador

Hoy vamos a realizar con Arduino un temporizador o cuenta atrás. Mediante unos pulsadores se pueden poner las horas, minutos y segundos que quieras y mediante otro pulsador inicias la cuenta atrás.

Esquema:

Esquema de montaje del temporizador
Esquema de montaje del temporizador

El conexionado de la imagén anterior está incompleto, ya que le falta un cable que vaya desde el pin 5V hasta el positivo de la protoboard, y un cable desde el pin GND hasta el negativo de la protoboard. La LCD se conecta como en tutoriales anteriores. Para el contraste de la misma se emplea un potenciómetro.

Código:

#include <LiquidCrystal.h>   //Libreria del display LCD

#define TONO_ERROR 600

#define TIME_INTERVAL 3000


LiquidCrystal lcd(7, 8, 9, 10, 11, 12);    //Inicializamos la libreria con el numero de los pines a utilizar


int buzzer = 5;            //Alarma

int ahoras = 0;            //Variable a mostrar por LCD de las horas

int aminutos = 0;          //Variable a mostrar por LCD de los minutos

int asegundos = 0;         //Variable a mostrar por LCD de los segundos

int segundostotal = 0;     //Tiempo total

int msg= 0;                //Barrera para el mensaje de bienvenida


int start = A1;            //Pulsador de arranque

int empieza = 1024;        // Variable para almacenaje del pulsador de arranque


int buth = A5;             //Pulsador de Horas

int butm = A4;             //Pulsador de Minutos

int buts = A3;             //Pulsador de segundos


int varbuth = 0;           //Variable para almacenar el valor del pulsador de horas

int varbutm = 0;           //Variable para almacenar el valor del pulsador de minutos

int varbuts = 0;           //Variable para almacenar el valor del pulsador de segundos


void setup()

{

   lcd.begin(16, 2);         // Configuramos el numero de columnas y filas del LCD. 

  

   pinMode(buzzer, OUTPUT);  //Pin de alarma --> Salida

   pinMode(buth, INPUT);     //Pin de pulsador de horas --> Entrada

   pinMode(butm, INPUT);     //Pin de pulsador de minutos --> Entrada

   pinMode(buts, INPUT);     //Pin de pulsador de segundos --> Entrada

   pinMode(start, INPUT);    //Pin de pulsador de arranque --> Entrada

  

   msg = 0;                  //Barrera del mensaje de bienvenida

   empieza = 1024;           //Barrera de arranque

  

   varbuth = 1;              //Barrera de horas

   varbutm = 1;              //Barrera de minutos

   varbuts = 1;              //Barrera de segundos

  

   Serial.begin(9600);

}


void loop()

{

     if(msg==0)             //Mostramos el mensaje de bienvenida solo una vez

     {

       lcd.setCursor(0,0);

       lcd.print("Temporizador con");

       lcd.setCursor(1,1);

       lcd.print("Arduino + LCD");

       delay(2500);

       msg = 1;

       lcd.clear();

     }

    

     //-------------------------------------------------------------------------------------------------    

     // LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR

     // EL BOTON DE ARRANQUE

     //-------------------------------------------------------------------------------------------------

    

     do                  

     {

      

       varbuth = analogRead(buth);   //Leemos boton de horas

       varbutm = analogRead(butm);   //Leemos boton de minutos

       varbuts = analogRead(buts);   //Leemos boton de segundos

      

       if(varbuth > 0)              //Si el boton ha sido pulsado, aumentamos las horas en una unidad

       {

        ahoras = ahoras + 1 ;

        delay(250);

       } 

      

        if(varbutm > 0)            //Si el boton ha sido pulsado, aumentamos los minutos en una unidad

       {

         aminutos = aminutos + 1;

         if(aminutos == 60) aminutos = 0;

         delay(250);

       } 

      

        if(varbuts > 0)            //Si el boton ha sido pulsado, aumentamos los segundos en una unidad

       {

         asegundos = asegundos + 1;

         if(asegundos == 60) asegundos = 0;

         delay(250);

       } 

            

       lcd.setCursor(0,0);

       lcd.print("Elige el tiempo");  //Muestra mensaje y las HH:MM:SS que vayamos aumentando

      

       lcd.setCursor(4,1);    


      if (ahoras < 10) lcd.print("0");    // Si las horas son menor que 10, pone un "0" delante.

       lcd.print(ahoras);                 // Sin este codigo, se muestra asi: H:M:S  (1:M:S)

       lcd.print(":");


      if (aminutos < 10) lcd.print("0");  // Si los minutos son menor que 10, pone un "0" delante.

       lcd.print(aminutos);               // Sin este codigo, se muestra asi: H:M:S  (H:1:S)


       lcd.print(":");

      if (asegundos < 10) lcd.print("0"); // Si los segundos son menor que 10, pone un "0" delante.

       lcd.print(asegundos);              // Sin este codigo, se muestra asi: H:M:S  (H:M:1)

      

      

     } while(analogRead(start) == 0);  // Se repite el menu de elegir tiempo hasta que pulsemos el boton de arranque.

    

     segundostotal = asegundos + (aminutos * 60) + (ahoras * 60 * 60);  //Convierte el tiempo elegido en segundos!!

      

      //-------------------------------------------------------------------------------------------------

      // UNA VEZ PULSADO EL BOTON DE ARRANQUE Y ACUMULADO EL TIEMPO, ENTRA EN EL SIGUIENTE WHILE

      // Y NO FINALIZA HASTA TERMINAR LA CUENTA.

      //-------------------------------------------------------------------------------------------------


      while (segundostotal > 0)

      {

        delay (1000);          //Descontamos en periodos de 1 segundo

        segundostotal--;    

  

        ahoras = ((segundostotal / 60)/ 60);   //Convertimos los segundos totales en horas

        aminutos = (segundostotal / 60) % 60;  //Convertimos los segundos totales en minutos

        asegundos = segundostotal % 60;        //Convertimos los segundos totales en periodos de 60 segundos


        lcd.setCursor(0,0);

        lcd.print("Tiempo restante");        //Mostramos mensaje de tiempo restante

 

        lcd.setCursor(4,1);

        if (ahoras < 10) lcd.print("0");     // Si las horas son menor que 10, pone un "0" delante.

        lcd.print(ahoras);                   // Sin este codigo, se muestra asi: H:M:S  (1:M:S)

        lcd.print(":");


        if (aminutos < 10) lcd.print("0");   // Si los minutos son menor que 10, pone un "0" delante.

        lcd.print(aminutos);                 // Sin este codigo, se muestra asi: H:M:S  (H:1:S)


        lcd.print(":");

        if (asegundos < 10) lcd.print("0");  // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero

        lcd.print(asegundos);                // Sin este codigo, se muestra asi: H:M:S  (H:M:1)

       

          if (segundostotal == 0)            //Si finaliza el tiempo

          {          

             while(1)                        //Bucle infinito mostrando mensaje y haciendo parpadear un led

             {              

                  lcd.clear();

                  lcd.setCursor(5,0);

                  lcd.print("Tiempo");

                  lcd.setCursor(3,1);

                  lcd.print("Finalizado");

                

               

                 sonarTono(TONO_ERROR,TIME_INTERVAL);

                 exit(0);

             }     

          }

     }

     

}


    //------------------------------------

    // SONAR TONO

    //------------------------------------

    void sonarTono(int tono, int duracion)

    {

      tone(buzzer,tono,duracion);

      delay(duracion);

    }

Vídeo de funcionamiento del temporizador:

Guardar

23 comentarios en “Arduino Tutorial 15: Temporizador”

  1. hola, es posible que al presionar el botón arranque cuando esta en la cuenta regresiva se incremente los minutos programados.
    lo necesito para controlar video juegos con monedas.

    1. claro que es posible, Engels. Imagino que lo que tu buscas podrías hacerlo metiendo en el bucle while (segundostotal > 0) una condición de si el botón arranque ha sido pulsado, entonces sumar a minutos ++.

      Es la manera más simple que se me ocurre, pero seguro que hay otras muchas.

      Saludos.

  2. Hola como le agregas una instruccion para que cuando inicie la cuenta regresiva agregue un 1 logico en algun otro pin y cuando esta termine el estado veng a 0 logico? lde todos los timers que he visto el tuyo es el mas amigable pero no veo como ponerle esta funcion.
    por tu tiempo y tu respuesta mil gracias

    1. Entiendo que por 1 lógico y por 0 lógico te refieres a TRUE o FALSE. Si as así, lo único que tienes que hacer es declarar un pin (como si fuera un led, por ejemplo) y al dar a START decirle que se ponga a 1 el pin y cuando acabe el tiempo (donde suena el zumbador) decirle que se ponga a 0.
      Espero que te haya ayudado, si no era esto lo que buscabas pregunta de nuevo y a ver si podemos ayudarte.

    1. Si, claro, al igual que tenemos puesto que el zumbador suene al acabar el tiempo. La única diferencia es que al dar al botón se start tienes que poner en funcionamiento el motor y cuando se acabe el tiempo (donde ahora suena el zumbador), decirle al motor que se apague.
      Si usas un motor DC necesitarás añadir un driver para motores para proporcionarle más corriente al motor: L293D
      Si quieres, primero puedes probarlo con un servomotor continuo, que no necesitas añadir nada extra.

  3. hola, hice la programacion y el cableado como lo indicas pero al cargar el codigo solo se prende la pantalla y no muestra nada. Hay alguna solucion? Gracias

    1. Hola, sin ver la placa ni el conexionado es dificil deducirlo, aún así te voy a dar algunas posibles causas:
      1- Has realizado el conexionado como la imágen solo, o además has incluido el cable que va desde el positivo de la protoboard al pin 5V del Arduino?
      2- ¿Que tipo de LCD estás usando? Hay algunas que tienen un conexionado diferente (aunque muy similar)
      3- ¿Has movido el potenciómetro una vez que se ha encendido la LCD? Este sirve para el contraste de la LCD, y dependiendo en que posición este se ve mejor o peor (o nada).

      No se si te servirá alguna de estas opciones, pero sin ver el conexionado ni la LCD es dificil deducir tu problema.

      Saludos

  4. Hola, yo tengo un problema igual al del juan, cargo el codigo, veo el potenciometro para lo que es el contrastes y todo bien, pero me enciende la mitad del lcd sin darme parametros solo enciende, eh probado con dos lcd son: GDM1602s y el P162003-00, ayuda!!

    1. Por favor revisa que el pinout de tu GDM es el correcto
      https://www.google.es/search?q=gdm+1602+lcd+datasheet&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjC34LA_cjYAhWLPxQKHUn6B60Q_AUICigB&biw=1920&bih=925#imgrc=bqNBdOBIQrmMJM:
      https://e-elektronic.com/arduino-tutorial-10-lcd/

      Comprobaré si existe algún problema en el código. Para más información, puedes subscribirte en el formulario de la página principal.
      https://e-elektronic.com

      Seguimos en contacto.

  5. Hola buenas y gracias por compartir….
    Tengo un pequeño problema, me empieza la cuenta atrás sola sin yo dale a Start, y el tiempo me aparece en
    01:01:59, he probado en quitar los cables de los pines analógicos por si los pulsadores están haciendo contacto pero sigue haciendo lo mismo… alguna idea de porque y como solucionarlo ???? en pantalla me muestra todo correctamente.
    gracias 🙂

    1. Me paso algo parecido, eso es por un falso gnd y 5v, revisa bien conexiones y saca un segundo gnd hacia la protoboard, veras como como no se suman ni horas mi minutos solos, ni arranca sola la cuenta atrás.

    2. mira el código bien ay algunos fallos en algúnos simbolos como este < que aparecen ==

      si te sirve de ayuda
      este es el archivo correcto

      //TEMPORIZADOR ARDUINO + LCD

      #include //Libreria del display LCD
      #define TONO_ERROR 600
      #define TIME_INTERVAL 3000
      LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Inicializamos la libreria con el numero de los pines a utilizar

      int buzzer = 5; //Alarma
      int ahoras = 0; //Variable a mostrar por LCD de las horas
      int aminutos = 0; //Variable a mostrar por LCD de los minutos
      int asegundos = 0; //Variable a mostrar por LCD de los segundos
      int segundostotal = 0; //Tiempo total
      int msg= 0; //Barrera para el mensaje de bienvenida

      int start = A1; //Pulsador de arranque
      int empieza = 1024; // Variable para almacenaje del pulsador de arranque

      int buth = A5; //Pulsador de Horas
      int butm = A4; //Pulsador de Minutos
      int buts = A3; //Pulsador de segundos

      int varbuth = 0; //Variable para almacenar el valor del pulsador de horas
      int varbutm = 0; //Variable para almacenar el valor del pulsador de minutos
      int varbuts = 0; //Variable para almacenar el valor del pulsador de segundos

      void setup()
      {
      lcd.begin(16, 2); // Configuramos el numero de columnas y filas del LCD.

      pinMode(buzzer, OUTPUT); //Pin de alarma –> Salida
      pinMode(buth, INPUT); //Pin de pulsador de horas –> Entrada
      pinMode(butm, INPUT); //Pin de pulsador de minutos –> Entrada
      pinMode(buts, INPUT); //Pin de pulsador de segundos –> Entrada
      pinMode(start, INPUT); //Pin de pulsador de arranque –> Entrada

      msg = 0; //Barrera del mensaje de bienvenida
      empieza = 1024; //Barrera de arranque

      varbuth = 1; //Barrera de horas
      varbutm = 1; //Barrera de minutos
      varbuts = 1; //Barrera de segundos

      Serial.begin(9600);
      }

      void loop()
      {
      if(msg==0) //Mostramos el mensaje de bienvenida solo una vez
      {
      lcd.setCursor(0,0);
      lcd.print(“Temporizador de”);
      lcd.setCursor(1,1);
      lcd.print(“Javier Granena”);
      delay(8000);
      msg = 1;
      lcd.clear();
      }

      //————————————————————————————————-
      // LECTURA DE LOS BOTONES Y ELECCIÓN DEL TIEMPO, NO SALE DEL BUCLE HASTA PULSAR
      // EL BOTON DE ARRANQUE
      //————————————————————————————————-

      do
      {

      varbuth = analogRead(buth); //Leemos boton de horas
      varbutm = analogRead(butm); //Leemos boton de minutos
      varbuts = analogRead(buts); //Leemos boton de segundos

      if(varbuth > 0) //Si el boton ha sido pulsado, aumentamos las horas en una unidad
      {
      ahoras = ahoras + 1 ;
      delay(250);
      }

      if(varbutm > 0) //Si el boton ha sido pulsado, aumentamos los minutos en una unidad
      {
      aminutos = aminutos + 1;
      if(aminutos == 60) aminutos = 0;
      delay(250);
      }

      if(varbuts > 0) //Si el boton ha sido pulsado, aumentamos los segundos en una unidad
      {
      asegundos = asegundos + 1;
      if(asegundos == 60) asegundos = 0;
      delay(250);
      }

      lcd.setCursor(0,0);
      lcd.print(“Elige el tiempo”); //Muestra mensaje y las HH:MM:SS que vayamos aumentando

      lcd.setCursor(4,1);

      if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
      lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
      lcd.print(":");

      if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
      lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)

      lcd.print(":");
      if (asegundos 0)
      {
      delay (1000); //Descontamos en periodos de 1 segundo
      segundostotal–;

      ahoras = ((segundostotal / 60)/ 60); //Convertimos los segundos totales en horas
      aminutos = (segundostotal / 60) % 60; //Convertimos los segundos totales en minutos
      asegundos = segundostotal % 60; //Convertimos los segundos totales en periodos de 60 segundos

      lcd.setCursor(0,0);
      lcd.print(“Tiempo restante”); //Mostramos mensaje de tiempo restante

      lcd.setCursor(4,1);
      if (ahoras < 10) lcd.print("0"); // Si las horas son menor que 10, pone un "0" delante.
      lcd.print(ahoras); // Sin este codigo, se muestra asi: H:M:S (1:M:S)
      lcd.print(":");

      if (aminutos < 10) lcd.print("0"); // Si los minutos son menor que 10, pone un "0" delante.
      lcd.print(aminutos); // Sin este codigo, se muestra asi: H:M:S (H:1:S)

      lcd.print(":");
      if (asegundos < 10) lcd.print("0"); // si el valor de segundo esta por debajo de 9 (unidad) antepone un cero
      lcd.print(asegundos); // Sin este codigo, se muestra asi: H:M:S (H:M:1)

      if (segundostotal == 0) //Si finaliza el tiempo
      {
      while(1) //Bucle infinito mostrando mensaje y haciendo parpadear un led
      {
      lcd.clear();
      lcd.setCursor(5,0);
      lcd.print("Tiempo");
      lcd.setCursor(3,1);
      lcd.print("Finalizado");

      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      delay(200);

      exit(0);
      }
      }
      }

      }

  6. Hola, Gracias por el tutorial, tengo una duda, y estoy atascado, como consigo que cuando acabe el programa, vuelva a a la elección de tiempo, con el tiempo que marque anteriormente? he probado con loop pero nada…
    Gracias de antemano!

    1. Hola, muy buenas Mikke,

      Lo primero, gracias por participar aportando tu experiencia en el comentario anterior. Es agradable que todos os animéis a participar y a dar vuestro granito de arena. Para responder a tu pregunta, se me ocurre que tendrías que crear una variable a la que deberías moverle el valor una vez que eliges el tiempo, y asignársela en el siguiente temporizado.

      int movhoras = 0 (por ejemplo, así podrías declarar al ppio tu variable)

      La variable ( o variables, ya que hablamos de horas minutos y segundos) debería ser del mismo tipo que el valor que quieres recoger, y deberías asignarlo de una forma similar a esta:

      movhoras = ahoras (antes de ejecutar la opción del while)

      y habría que modificar el código de la lcd para que el lcd.print muestre el valor de “movhoras” si segundostotal es >0.

      es lo primero que se me ocurre, habría que mirarlo con algo más de detalle xD.

      No sé si te has subscrito a mi newsletter. Si lo deseas, subscríbete y vamos reescribiendo el código poco a poco juntos, te voy echando una mano.

      Lo dicho, muchas gracias y suerte con tus proyectos 😉

  7. Hola disculpa como le puedo hacer para que vuelva a reiniciar la cuenta con el tiempo que ya se le había ingresado? Quiero prender un LED cada 3 hrs

    1. Voy a reeditar el código pues al parecer tiene algunos fallos. Mientras podéis ir probando la versión de Javier(aunque hay que corregirla también pues la he visto algunos fallos). Intentaré corregirla cuanto antes.saludo

      Un saludo.

  8. Hola buen dia, que pena preguntar pero me aparece un error y es que me cuenta automatico 01:01:00 sin poder darle star, ya he mirado el codigo pero no se que sera, el mismo escoge el tiempo y da paso al while para que empieze la cuente regresiva hay forma de que alguien me explique cual es el problema.
    Gracias

    1. Has realizado el esquema tal y como está en la foto o has añadido un cable que vaya desde el pin 5V hasta el positivo de la protoboard, y un cable desde el pin GND hasta el negativo de la protoboard?
      Un motivo por el que no te funcione puede ser por eso.

      Si la conexión está correcta, lee los comentarios anteriores donde Javier nos ha editado el código por uno que funciona mejor.

      Si aún te sigue dando el mismo problema nos lo vuelves a comentar y entre todos intentaremos ayudarte.

      Muchas garcais por comentar.

Deja un comentario

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