ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 1 Descripción Este es un reloj de tiempo real con batería de respaldo (RTC Real Time Clock) que permite al microcontrolador mantener tiempo; hora y fecha, aún si el circuito electrónico en el que se encuentra se queda sin energía. Es perfecto para llevar registro de datos, reloj de capacidad, sellado de tiempo, temporizadores y alarmas, etc. Este RTC se usa en conjunto con un microcontrolador. El DS1307 RTC es el más popular, y funciona mejor con los microcontroladores basados en 5V como el Arduino. Un reloj de tiempo real es básicamente un reloj que funciona con una batería y mantiene la hora, incluso cuando hay un corte de energía. El uso de un RTC, puede realizar un seguimiento de los plazos largos, aunque se reprogramar el microcontrolador al desconectarlo del USB o de un enchufe de alimentación.
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 2 La mayoría de los microcontroladores incluyendo el Arduino, tienen incorporado un reloj llamado millis y también cuentan con temporizadores incorporados en el circuito integrado que puede realizar un seguimiento de los períodos de tiempo más largos como minutos o días. Millis sólo realiza un seguimiento del tiempo transcurrido desde la última vez que se usó Arduino. Esto significa que cuando la alimentación se enciende, el temporizador de milisegundos se ajusta a 0. El Arduino no sabe que es "Lunes" o "09 de abril", lo único que puede decir es "Hace 14.000 milisegundos desde la última vez encendí. Si desea ajustar la hora en el Arduino sin tener el modulo DS1307 Tendría que programar en el la fecha y hora para que empiece a contar desde ese momento. Pero si debe corta la alimentación, tendría que reajustar la hora. Al igual que los relojes de alarma muy baratos: cada vez que pierden la alimentación quedan parpadeando con la hora 12:00. Si bien este tipo de cronometraje básico está bien para algunos proyectos, algunos proyectos tales como registradores de datos, relojes, etc., tendrán que tener cronometraje consistente que no se restablece cuando la batería Arduino muere o se reprograme. Por lo tanto, se incluye un RTC independiente. El circuito integrado RTC se especializa en mantener la noción del tiempo. Se puede contar con años bisiestos y saber cuántos días se encuentran en un mes, pero no hacerse cargo de horario de verano (porque cambia de un lugar a otro, y de un RTC a otro). La imagen de arriba muestra una placa base con un reloj de tiempo real y dentro hay una batería de litio, es por eso que es tan grande.
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 3 El RTC que es más común y de bajo costo es el DS1307, fácil de soldar, y puede funcionar durante años en una placa de PCB muy pequeña del tamaño de hasta una moneda. DS1307 En encapsulado DIP En conjunto se utiliza una pila de botón (batería de litio 3V CR2025 o CR2032), el DS1307 se activara lo largo de mucho tiempo, incluso cuando el Arduino se apague o se reprograme. Librería de Arduino Cualquier microcontrolador de 5V con protocolo de comunicación i2c integrado puede utilizar fácilmente el DS1307 y el más usado con este es el Arduino. Para la biblioteca RTC, se debe utilizar la librería RTClib de JeeLab, permite obtener y establecer el tiempo de un DS1307 (originalmente escrito por JeeLab). Lo pueden descargar del siguiente link: https://github.com/adafruit/rtclib Para saber cómo instalar una librería visite el siguiente link
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 4 Cableado del módulo a la plataforma Arduino Primero se debe de colocar la batería en el porta batería del módulo, el cual se encuentra en la parte inferior. El modulo posee 6 pines: SQ, DS, SCL, SDA, VCC, GND y BAT. De los cuales para esta práctica, 4 son de vital importancia: SCL, SDA, VCC y GND los cuales corresponden a: VCC y GND: Se utilizan 5V para alimentar el circuito integrado RTC cuando se desea consultar por el tiempo desde el microcontrolador. Si no hay señal de 5V, el chip se va a dormir usando la energía de la batería de litio de 3V para efectuar la copia de seguridad. SCL es el pin de reloj i2c - es necesario para la comunicación con el RTC SDA es el pin de datos I2C - es necesario para la comunicación con el RTC En caso de utilizar Arduino UNO o LEONARDO el cableado deberá de ser de la siguiente manera: En caso de Arduino UNO y LEONARDO los pines de comunicación I2C se encuentran cerca del pulsador de RESET y corresponden a SCL y SDA:
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 5 En caso de utilizar Arduino MEGA 2560, los pines 20 y 21 corresponden a SDA y SCL
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 6 Descripción del código El código consta de la escritura y lectura del horario, pero para una mayor comprensión iniciaremos con la lectura. LECTURA DE HORA //Ejemplo básico para la lectura de la hora y fecha //del módulo DS1307 //www.abcelectronica.net #include <Wire.h> //llamado de libreria #include "RTClib.h" //llamado de libreria DS1307 RTC_DS1307 RTC; void setup() { Serial.begin(57600); Serial.println("Inicio de lectura"); Wire.begin(); RTC.begin(); void loop() { DateTime now = RTC.now();// funcion que regresa tiempo Serial.print(now.year(), DEC);//año Serial.print('/'); Serial.print(now.month(), DEC);//mes Serial.print('/'); Serial.print(now.day(), DEC);//dia Serial.print(' '); Serial.print(now.hour(), DEC);//hora Serial.print(':'); Serial.print(now.minute(), DEC);//minuto Serial.print(':'); Serial.print(now.second(), DEC);//segundo Serial.println(); delay(950); Utilizando la función callnow() esta nos regresa el objeto DateTime el cual describe el año, mes, día, hora, minuto y segundo. Dentro de la librería se encuentran RTC.year() que proporciona el año, RTC.hour() que proporciona la hora y así sucesivamente.
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 7 Una vez cargado el código, en el monitor serial (herramientas>monitor serial) se observara algo como lo siguiente: Esto significa que el RTC no posee la hora, por lo que el tiempo será de 0:0:0, debido a que anteriormente no tenía la batería instalada o no fue escrita la hora y fecha. Por lo que una vez instalada la batería se recomienda no quitarla para no perder la hora.
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 8 ESCRITURA DE HORA El código a continuación corresponde al mismo de lectura pero con tres líneas de programación adicionales: //Ejemplo basico para la lectura de la hora y fecha //del modulo DS1307 //www.abcelectronica.net #include <Wire.h> //llamado de libreria #include "RTClib.h" //llamado de libreria DS1307 RTC_DS1307 RTC; void setup () { Serial.begin(57600); Wire.begin(); RTC.begin(); if (! RTC.isrunning()) { Serial.println("RTC is NOT running!"); // La siguiente linea de codigo permite escritura de la hora y fecha de la PC RTC.adjust(DateTime( DATE, TIME )); void loop () { 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(); delay(950);
ABC PROYECTOS ELECTRÓNICOS ABCelectronica.net 9 La función RTC.adjust que se encuentra en la línea de código siguiente: Permite tomar la fecha y hora según el equipo (PC) en que se encuentra conectado el Arduino y permite programar el RTC. Por lo que se debe tomar en cuenta que la PC tenga la hora correcta. OJO: Una vez abierto el software deberá de cargar inmediatamente el código de escritura, ya que si lo compila y lo carga más tarde, el reloj se apagará y el tiempo se encontrara atrasado. Una vez cargado el código, en el monitor serial (herramientas>monitor serial) se observara algo como lo siguiente: Una vez realizada la escritura de la hora en el RTC, se recomienda cargar nuevamente el codigo de LECTURA u otro codigo que no posea las tres lineas adicionales ya que puede existir una sobreescritura cada vez que se conecte el arduino a la PC. Tomar en cuenta que los baudios del monitor serial deben ser iguales al de código programación ya que de lo contrario aparecerán símbolos de modo aleatorio. Sobre referencia de la información y para conocer más sobre el código: Adafruit