Medir el Tiempo con Arduino

Como medir el tiempo con Arduino y la librería Time.

Hola amigos tecnólogos, en nuestra entrada de hoy veremos una forma sencilla de medir el tiempo con Arduino sin necesidad de hacer cálculos complejos y laboriosos.

Esto lo haremos con la ayuda de la librería Time, la cual nos facilitara mucho el trabajo a la hora de gestionar un calendario con fecha y hora. Para asimilar los conceptos representaremos la fecha y hora en el monitor serial y programaremos una alarma.

Materiales necesarios

Arduino UNO R3 Arduino UNO R3

Conozcamos la librería Time

La librería Time la desarrollo Arduino, aunque no viene por defecto en el IDE de Arduino. Para usarla solo hay que instalarla según el procedimiento normal de instalación de librarías.

En esta librería lo primero que se hace es declarar un tipo especial de variable llamada time_t de 32 bits. Esta variable es la responsable de que todo funcione.

El principio fundamental de funcionamiento de esta librería es que la variable time_t almacena en un formato especial los segundos transcurridos desde el 1 de enero de 1970 hasta hoy. Este método es el mismo que usa sistemas operativos basados en Linux.

Las conversiones son automaticas, por lo que no hay que complicarse haciendo calculos largos y complejos.

La ventaja principal de manejar esta librería es que al convertir la fecha y la hora en un numero de segundos, podemos operar libremente con este número, resta o sumando fechas y horas y el resultado seguirá siendo una fecha y una hora.

El principal inconveniente es que no podemos trabajar con fecha anteriores al 1 de enero de 1970.

Para empezar a manejar la librería el primer paso es insertar la fecha desde la que queremos empezar a contar, esto lo hacemos con la siguiente función:

  //Formato: hora, minutos, segundos, días, mes, año
  setTime(19,28,50,20,10,2015);

A continuación declaramos la variable time_t T y la igualamos a la función now(). Esta función contiene la fecha que antes insertamos.

  time_t t = now();//Declaramos la variable time_t t

Prácticas con la librería

Esta es la parte que nos gusta a todos, la parte de experimetar.

El siguiente código representa la fecha y la hora en el monitor serial.

#include <Time.h>//Incluimos la librería Time

void setup()
{   
  Serial.begin(115200);//Inicializamos el puerto serie.
  //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
  //Formato: hora, minutos, segundos, días, mes, año
  setTime(19,28,50,20,10,2015);
}
void loop()
{   
  time_t t = now();//Declaramos la variable time_t t

//Imprimimos la fecha y lahora
  Serial.print(day(t));
  Serial.print(+ "/") ;
  Serial.print(month(t));
  Serial.print(+ "/") ;
  Serial.print(year(t)); 
  Serial.print( " ") ;
  Serial.print(hour(t));  
  Serial.print(+ ":") ;
  Serial.print(minute(t));
  Serial.print(":") ;
  Serial.println(second(t));
  delay(1000);//Esperamos 1 segundo

}

En la imagen de abajo se observa como la hora aumenta segundo a segundo desde la fecha de inicio que le marcamos.

Monitor Serial Arduino

Una prueba que podeis hacer es comprobar como al aumentar el tiempo de delay, el reloj sigue contando correctamente los segundos, aunque no los representa todos.

#include <Time.h>//Incluimos la librería Time

void setup()
{   
  Serial.begin(115200);//Inicializamos el puerto serie.
  //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
  //Formato: hora, minutos, segundos, días, mes, año
  setTime(19,28,50,20,10,2015);
}
void loop()
{   
  time_t t = now();//Declaramos la variable time_t t

//Imprimimos la fecha y la hora
  Serial.print(day(t));
  Serial.print(+ "/") ;
  Serial.print(month(t));
  Serial.print(+ "/") ;
  Serial.print(year(t)); 
  Serial.print( " ") ;
  Serial.print(hour(t));  
  Serial.print(+ ":") ;
  Serial.print(minute(t));
  Serial.print(":") ;
  Serial.println(second(t));
  delay(3000);//Esperamos 3 segundos

}

En la siguiente captura de pantalla del monitor serial se puede ver como el reloj sigue pasando corréctamente aunque el delay aumente.

Monitor Serial Arduino

Por último programaremos una alarma a una hora concreta y con una duración de un minuto.

#include <Time.h>//Incluimos la librería Time

void setup()
{   
  Serial.begin(115200);//Inicializamos el puerto serie.
  //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
  //Formato: hora, minutos, segundos, días, mes, año
  setTime(19,28,50,20,10,2015);
}
void loop()
{   
  time_t t = now();//Declaramos la variable time_t t

//Imprimimos la fecha y lahora
  Serial.print(day(t));
  Serial.print(+ "/") ;
  Serial.print(month(t));
  Serial.print(+ "/") ;
  Serial.print(year(t)); 
  Serial.print( " ") ;
  Serial.print(hour(t));  
  Serial.print(+ ":") ;
  Serial.print(minute(t));
  Serial.print(":") ;
  Serial.println(second(t));
  delay(1000);//Esperamos 1 segundo

//Programamos la hora a la que la alarma se activará en este caso 19:30
  if(hour(t)==19 && minute(t)==30)
  {
    Serial.println("Alarma") ;
  }

}

En la siguiente imagen vemos como la alarma se activa en la hora programada.

Monitor Serial Arduino

En nuestro caso hemos representado la palabra alarma en el monitor serial cuando ha llegado a la hora programada, pero al igual que representamos esta palabra, podríamos haber activado una salida digital para activar algún tipo de zumbador o led.


Esperamos que les sea de utilidad y no olviden que en nuestro blog encontrará muchos otros post de su interes.


Etiquetas: , , , , ,

19 Comments

  • Yhobany dice:

    Hola Señores, no soy experto en arduino pero realicé los cambios sugeridos y logré superar el error mencionado antes:
    Este es el código que estoy usando. Recuerden bajar e instalar la librería desde https://github.com/PaulStoffregen/Time.

    #include
    #include

    void setup()
    {
    Serial.begin(115200);//Inicializamos el puerto serie.
    //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
    //Formato: hora, minutos, segundos, días, mes, año
    setTime(10,29,50,30,03,2020);
    }
    void loop()
    {
    time_t t = now();//Declaramos la variable time_t t

    //Imprimimos la fecha y lahora
    Serial.print(day(t));
    Serial.print(+ «/») ;
    Serial.print(month(t));
    Serial.print(+ «/») ;
    Serial.print(year(t));
    Serial.print( » «) ;
    Serial.print(hour(t));
    Serial.print(+ «:») ;
    Serial.print(minute(t));
    Serial.print(«:») ;
    Serial.println(second(t));
    delay(1000);//Esperamos 1 segundo

    //Programamos la hora a la que la alarma se activará en este caso 19:30
    if(hour(t)==19 && minute(t)==30)
    {
    Serial.println(«Alarma») ;
    }

    • TADEO BARRAGAN dice:

      hola soy nuevo en esto
      Pero si lo copio tal como esta me salta error, pero si cambio todos los « por » se soluciona.
      Recuerden bajar e instalar la librería desde https://github.com/PaulStoffregen/Time.

      #include

      void setup()
      {
      Serial.begin(115200);//Inicializamos el puerto serie. 115200
      //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
      //Formato: hora, minutos, segundos, días, mes, año
      setTime(11,59,15,19,05,2020);
      }
      void loop()
      {
      time_t t = now();//Declaramos la variable time_t t

      //Imprimimos la fecha y lahora
      Serial.print(day(t));
      Serial.print(+ «/») ;
      Serial.print(month(t));
      Serial.print(+ «/») ;
      Serial.print(year(t));
      Serial.print( » «) ;
      Serial.print(hour(t));
      Serial.print(+ «:») ;
      Serial.print(minute(t));
      Serial.print(«:») ;
      Serial.println(second(t));
      delay(1000);//Esperamos 1 segundo
      }

  • Jose Salazar dice:

    Yo necesito medir el tiempo real mediante software, con la libreria time, y necesito guardarel tiempo en la memoria interna del arduino, como lo haria ? gracias

  • dardo dice:

    Hola, muy buena la explicación, yo tenia el mismo problema al cargar el código que tira el error de
    » ‘setTime’ was not declared in this scope » esta es mi linea del setTime «.
    lo solucione borrando en el código
    #include //Incluimos la librería Time

    e incluyendo la librería desde incluir librerias.
    aca les dejo el codigo:
    #include
    #include

    void setup()
    {
    Serial.begin(115200);//Inicializamos el puerto serie.
    //Anotamos la hora y la fecha desde la que nuestro programa empezará a contar.
    //Formato: hora, minutos, segundos, días, mes, año
    setTime(19,28,50,20,10,2015);
    }
    void loop()
    {
    time_t t = now();//Declaramos la variable time_t t

    //Imprimimos la fecha y lahora
    Serial.print(day(t));
    Serial.print(+ «/») ;
    Serial.print(month(t));
    Serial.print(+ «/») ;
    Serial.print(year(t));
    Serial.print( » «) ;
    Serial.print(hour(t));
    Serial.print(+ «:») ;
    Serial.print(minute(t));
    Serial.print(«:») ;
    Serial.println(second(t));
    delay(1000);//Esperamos 1 segundo

    //Programamos la hora a la que la alarma se activará en este caso 19:30
    if(hour(t)==19 && minute(t)==30)
    {
    Serial.println(«Alarma») ;
    }

    }
    Saludos dardo

    • Johan dice:

      he colocado el mismo codigo, y no se como solucionar el problema de la libreria de time. he leido acerca de la version del arduino. tengo la 1.6.1, si alguien sabe como poder arreglarlo, se lo agradecería..

  • Davket dice:

    Tengo una duda, es que necesito conectarle un contador digital para un proyecto que me toca hacer, ¿podrían darme instrucción de como podría hacerlo?

  • Edu dice:

    mismo error» ‘setTime’ was not declared in this scope » esta es mi linea del setTime » setTime(12,21,56,13,9,2016);» y mi linea de la declaracion de la libreria «#include »
    aqui mi codigo (quiero que se active un relevador a los primeros 15 segundos)

    #include

    void setup(){
    setTime(12,21,56,13,9,2016); // Las 12;00:00 del dia 1 de Ene de 2014
    pinMode(12, OUTPUT);
    }

    void loop (){

    time_t t = now();
    if (second(t)<=15) { digitalWrite(12, HIGH); } else { digitalWrite(12, LOW); delay(1000); } }

    • Pablo R dice:

      Tuve el mismo error, pero se debio a ue la libreria estaba mal instalada, hay que descargar la libreria, abrir el achivo .rar, copiar la carpeta en la ubicacion «libraries» ubicada en la carpeta donde se instalo el programa de arduino y listo. eso fue lo que me soluciono ese problema

  • luis dice:

    Tengo el mismo problema, me dice que no se ha declarado setTime en el ámbito,?? y no veo la diferencia que indica M entre no es «#include » debe ser «#include »

    • Edgar dice:

      La libreria Time está incompleta, deben descargarla de GitHub https://github.com/PaulStoffregen/Time.

      Descargarán un archivo Zip que hay que añadir en las librerias de arduino y en el encabezado del probrama deben incluir la libreria time de tal manera que queden las siguientes dos lineas
      #include
      #include

      Si solo tienen #include marca el error debido a que necesita el #include Razón por la cual deben descargar el Time-master.zip en la liga que les dejo de GitHub

  • leo dice:

    descargue e instalé la librería, Copie el código y lo compile pero me da error desde el princiio dice que no se ha declarado en el scope «set time» y todas las demás variables para optener la fecha y la hora

  • pedro dice:

    como enciendo una bomba de agua durante 5 minutos cada 24 horas

  • miguel dice:

    Observo que hasta que no abrimos el monitor serie no empieza a contar el tiempo. Y si lo cerramos y volvemos a abrir el monitor serie empieza otra vez desde el principio a contar el tiempo. Esto es raro no?. Es como si el reloj interno del arduino se parara cuando cerramos el monitor serie.

  • carla valenzuela dice:

    hola, estoy realizando mi tesis y es relacionado con la domotica, dentro de mis objetivos este realiza que la luz se prenda o apague con un comando, consulta con esta librería podría sacar el calculo de saber cuantas horas estuvo la luz prendida y cuantas horas estuvo apagada? gracias

Deja una respuesta

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