La librería dataTime nos permite emplear medidas de tiempo real sin necesidad de Hardware, unicamente por software.
Es decir, con ella podemos convertir Arduino en un reloj, y utilizarlo para saber la hora, como despertador, programado basado en la hora, temporizador....
El problema de esta librería es que cada vez que cese la alimentación de Arduino tendremos que volver a ponerlo en hora.
Veamos que métodos nos ofrece:
Se utiliza para sincronizar o "poner en hora" Arduino empleando una fuente externa, cómo un un ordenador conectado por serial via USB o empleando una señal de radio, por ejemplo.
Devuelve el tiempo transcurrido desde el inicio de la era UNIX (1/enero/1970)
Actualiza las propiedades de fecha y hora. Devuelve TRUE si el reloj esta sincronizado y FALSE en caso contrario.
Debe usarse siempre antes de llamar a cualquier propiedad de tiempo para asegurarnos de que se nos devuelve la información más actual.
Devuelve un String correspondiente al nombre del mes, enero es el mes 0.
Devuelve un String con el nombre del día, Domingo es el día 0.
La librería ocupa 1470 bytes en la memoria de Arduino, pero si no vamos a utilizar el methodo makeTime podemos comentarlo, lo que la reduciría a unos 1000 bytes
Los methodos que devuelven los nombres de los meses y los días ocupan unos 310 bytes de memoria Flash y 10bytes de RAM.
Este ejemplo es el que viene con la librería, aquí lo dejamos comentado en castellano para que sea más sencillo de entender:
#include <DateTime.h> #include <DateTimeStrings.h> #define TIME_MSG_LEN 11 #define TIME_HEADER 255 void setup(){ Serial.begin(19200); } void loop(){ getPCtime(); // try to get time sync from pc //Si el reloj esta sincronizado, lo actualizamos. if(DateTime.available()) { unsigned long prevtime = DateTime.now(); while( prevtime == DateTime.now() ) ; //Actualizar las propiedades de tiempo DateTime.available(); //Actualizamos el display digitalClockDisplay( ); // Enviamos el tiempo por puerto serial Serial.print( TIME_HEADER,BYTE); Serial.println(DateTime.now()); } } void getPCtime() { //Si esta disponible la conexión, intentamos poner en hora a Arduino while(Serial.available() >= TIME_MSG_LEN ){ if( Serial.read() == TIME_HEADER ) { time_t pctime = 0; for(int i=0; i < TIME_MSG_LEN -1; i++){ char c= Serial.read(); if( c >= '0' && c <= '9') //convertimos los digitos en un número pctime = (10 * pctime) + (c - '0') ; } //Sincronizamos el reloj con la hora recibida por el puerto serial DateTime.sync(pctime); } } } //Este metodo formatea y muestra los datos void digitalClockDisplay(){ Serial.print(DateTime.Hour,DEC); printDigits(DateTime.Minute); printDigits(DateTime.Second); Serial.print(" "); Serial.print(DateTimeStrings.dayStr(DateTime.DayofWeek)); Serial.print(" "); Serial.print(DateTimeStrings.monthStr(DateTime.Month)); Serial.print(" "); Serial.println(DateTime.Day, DEC); } void printDigits(byte digits){ Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits,DEC); }