Alguna vez has querido hacer un proyecto que incorpore un reloj de tiempo real y conectarlo a tus proyectos para que controlen procesos u otros mecanismos en una hora determinada o hacer solamente visualizar la hora como hobby
Vídeo
A continuación, encontrara el vídeo en donde se explica el funcionamiento del circuito.
Existe una gran variedad de formas de poder medir y controlar el tiempo desde arduino, como usar el contador de mili-segundos que incorpora, cargar la librería de time o usar un componente externo como un reloj de tiempo real, el cual por su precisión y por incorporar una batería puede mantener la hora que sea configurada[1].
Reloj de tiempo real
El reloj de tiempo real o real time clock es un circuito integrado que permite mantener la hora en un sistema de hardware, aun si este no se encuentra en funcionamiento o encendido, es usado con el propósito de mantener un contador para hacer el cálculo de la hora.
Instrucciones
La librería del reloj maneja las siguientes instrucciones:
RTC_DS1307 rtc
Crea el objeto del rtc
RTC_DS1307 rtc;
rtc.begin()
Inicializa el reloj
rtc.begin();
rtc.isrunning()
Verifica si el reloj inicio correctamente
Retorna
- true: el reloj inicio correctamente
- false: el reloj no pudo iniciar
rtc.isrunning();
DateTime(año, mes, dia, hora, minuto, segundo)
Permite establecer el tiempo en formato que el arduino lo pueda entender.
Parámetros
- año: establece el año
- mes: establece el mes
- dia: establece el día
- hora: establece el hora
- minuto: establece el minuto
- segundo: establece el segundo
DateTime(2015, 1, 1, 3, 0, 0)
rtc.adjust
Permite establecer la hora en el reloj para poderla usarla.
Parámetros
- DateTime: Se pasa la hora al reloj
rtc.adjust(DateTime(2015, 1, 1, 3, 0, 0));
rtc.now()
Crea un objeto con la última fecha y hora
DateTime now = rtc.now();
now.year()
Con esta función retornamos el año
now.year()
now.month()
Con esta función retornamos el mes
now.month()
now.day()
Con esta función retornamos el día
now.day()
now.hour()
Con esta función retornamos la hora
now.hour()
now.minute()
Con esta función retornamos los minutos
now.minute()
now.second()
Con esta función retornamos los segundos
now.second()
now.unixtime()
Permite obtener la fecha en formato unix
now.unixtime()
Materiales
Material | Cantidad | Descripción |
---|---|---|
Arduino | 1 | Cualquier funciona |
CI ds1307 | 1 | Modulo reloj |
Cristal de 32.768Khz | 1 | Cristal para el reloj |
Condensadores 22pf | 2 | Condensadores para el cristal |
Resistencias de 10KΩ | 2 | Resistencias de conexión I2C. |
Batería de 3V | 1 | Batería para mantener la hora y fecha del reloj |
Siporte de batería | 1 | Soporte para poder colocar la batería |
Modulo ds1307 | 1 | Modulo reloj con la batería |
Conexión
Tenemos dos formas de realizar la conexión, uno es por medio de circuito integrado en paquete DIP y el otro es por medio de modulo que ya trae integrado todas las conexiones a continuación tenemos las dos formas.
Circuito integrado
Es circuito integrado cuenta con 8 pines, en el datasheet esta mas detalle; para la conexión tenemos que tener en cuanta el cristal que es de 32.768Khz y las resistencias de 10K conectadas al SCL y SDA.
Modulo
Lo único que debemos hacer es conectar nuestro módulo de reloj a nuestro arduino por medio de la comunicación I2C, la donde la librería RTClib se encarga de hacer el resto de trabajo, en la siguiente imagen podemos ver como es la conexión del circuito.
Código
El código que usaremos es el mismo que está en el ejemplo de la librería, ya que solo tenemos que establecer la fecha hora y solo leer los valores de cada parámetro como lo explique en las instrucciones.
/*Reloj de tiempo real con DS1307 en arduino
*
* Copyright: codigoelectronica.com
* Author: Oscar Fernandez
* License: MIT
*/
//Cargamos librerias
#include <Wire.h>
#include "RTClib.h"
//Instanciamos el rtc
RTC_DS1307 rtc;
//Iniciamos el programa
void setup () {
Serial.begin(9600);
#ifdef AVR
Wire.begin();
#else
Wire1.begin();
#endif
rtc.begin();
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
//La siguiente linea es para establecer la fecha y hora al ds1307 al momento de compilar
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
String s = DateTime(2015, 1, 1, 3, 0, 0);
Serial.println(s);
//Para establecer la fecha y hora manualmente
// rtc.adjust(DateTime(2015, 1, 1, 3, 0, 0));
}
}
void loop () {
//Cargamos los valores de fecha, hora en variable now
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print(" since midnight 1/1/1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
Serial.println();
delay(3000);
}
Observemos que al iniciar nuestro código lo que hacemos en llamar la librería wire, encargada de la comunicación I2C, luego cargamos la librería del reloj RTClib y creamos el objeto del rtc, luego procedemos a verificar si el rtc esta funcionando con rtc.isrunning para poder setearle la hora actualizada.
Cuando ya tengamos el circuito conectado, procedemos leer la fecha y hora como se demuestra en el loop cargando un valor nuevo con rtc.now y luego extrayendo cada uno de los parámetros del reloj e imprimiéndoles en la terminal serial como se muestra en la siguiente imagen.
Con este sencillo ejemplo podemos obtener la hora y la fecha en nuestros proyectos, si te gusto este ejercicio cometa comparte con tus amigos y síguenos en nuestras redes sociales.
Referencias
[1] maximintegrated https://datasheets.maximintegrated.com/en/ds/DS1307.pdf, Consultado junio 2019
Comentario
kolin
05 January 2017 16:06