Módulo RTC DS1307 (Reloj de tiempo real)
Este proyecto nos servirá en todas aquellas aplicaciones donde necesitemos conocer el tiempo actual (fecha y hora). Aprenderemos a usar y configurar el módulo RTC DS1307 con arduino. El módulo incorpora reloj de tiempo real DS1307 y una batería para guardar los datos. Para hacerlo más práctico dispondremos de un display LCD 16×2 para visualizar en pantalla el tiempo actual.
Dicho módulo se comunica con arduino a través del bus I2C.
Material
- LCD 16×2
- Potenciómetro 1K
- Arduino UNO
- Módulo RTC DS1307
- Protoboard
- Cables macho-macho, hembra-macho
En la tienda virtual de HeTPro puedes encontrar todos los materiales: www.hetpro-store.com
Conexiones
El bus I2C utiliza solo 2 cables para establecer la comunicación entre dispositivos, SDA y SCL. En el bus debe configurarse un dispositivo como MAESTRO y uno o varios dispositivos como ESCLAVO.
En la plataforma arduino existen varias librerías que podemos usar para ahorrarnos todo el trabajo de configuración.
En arduino los pines correspondientes a dicho bus son:
A4(SDA)
A5(SCL)
En las siguientes imágenes podemos ver los pines correspondientes al módulo RTC DS1307 y su conexión con arduino, así como la conexión del ya conocido display LCD 16×2, si es la primera vez que se utiliza este display recomiendo ver los tutoriales correspondientes para hacerlo funcionar disponibles en esta misma página.
Terminadas las conexiones, procederemos a añadir la librería RTClib a la IDE de Arduino. La descargaremos y la descomprimiremos en C:/diretorio arduino/libraries.
Link para descargar la librería: https://github.com/adafruit/RTClib
Esta librería se apoya en la librería Wire para la comunicación I2C, por lo que tendremos que hacer referencia a ella he incluirla en nuestro código, al igual que la librería LiquidCrystal para poder hacer funcionar el display LCD. Estas dos últimas librerías ya vienen añadidas por defecto al IDE arduino por lo que no será necesario descargarlas. RTClib es compatible con cualquier módulo que use el chip RTC DS1307.
Código para el RTC DS1307 con Arduino
Finalmente unas imágenes del proyecto funcionando.
hola amigo
es un muy buen post
yo estoy usando el mismo modulo pero tengo un problema y no se si a ti te sucedio lo mismo
el problema es que cargo la hora y todo va bien hasta que oprimo el boton de reset de mi arduino o cierro y vuelvo a abrir el monitor serial y la todo regresa a la hora y fecha que fue cargado el programa.
espero y me puedas ayudar.
Ulises, eso suele pasar si tienes una inicialización en tu programa para fecha y hora. Lo más fácil es simplemente hacer un programa para lectura y otro para configuración.
tengo un problema, muetsra todo pero se queda estática los segundos no cambian
Christian, revisa tus conexiones, puede ser que dejo de leer la información. Este es un error común en I2C.
hola el problema es tu ds1307, revisa las conexiones mas seguro es el oscilador cambialo ami me paso lo mismo.
Gracias por tu ayuda 🙂 saludos
Tengo el 1602 conectado por un dispositivo FC-113, que ya trae incorporado potenciómetro y cuenta salida SDA y SCL, que van conectadas a A4 yA5, funciona perfecto. Necesito agregarle el RTC DS1307, que también debe ir conectado a A4 y A5. Como resuelvo esto?
Gracias por su colaboracion
Puedes conectarlos sin problemas, ya que cada dispositivo i2c tiene dirección distinta. Solo conéctalos y realiza tus pruebas.
Hola, si quisiera establecer el encendido de un led en un periodo de tiempo y la variable que necesito evaluar es la hora, ¿solo pongo «now.hour()» en la condicional? disculpa si la pregunta es tonta pero me estoy mudando a ardiuno apenas.
asi es
if (now.hour()==18 && now.minute()==54
)
{
digitalWrite(7,HIGH);
delay(5000);
}
hola una pregunta como hago para programar un timbre de colegio ya instale la LCD RTC con arduino en una protoboard Y NO LO HE PODIDO PROGRAMAR POR QUE ME FALTA UN CODIGO por favor espero pronto su respuesta
GRACIAS
Hola si quieres utilizar un timbre o un dispositivo que genere el sonido puedes utilizar el codigo que usamos aqui pero en el lugar de la LCD puedes agregar lo que llegues a necesitar para el dispositivo final
para el arduino mega, se conecta igual a los pines A4 y A5 o a los 20,21 que se denominan, sda y scl ?
Si efectivamente, los pines 20, 21 son en Arduino MEGA la comunicación i2c, debes guiarte por sda y scl.
Gracias por sus comentarios y por ayudar
Hola buenas tardes este es mi programa,lo que quiero es que todos los dias se active dos led,quiero ver si me puedes ayudar y ver si me falta algo,estare agradecido ,saludos
#include
#include «RTClib.h»
RTC_DS1307 RTC;
int hora=0;
int minutos=0;
int segundos=0;
int salida=3;
int salida1=4;
void setup () {
//Inicializamos el puerto serie, wire y el modulo RTC
Serial.begin(9600);
Wire.begin();
RTC.begin();
//Si quitamos el comentario de la linea siguiente, se ajusta la hora y la fecha con la del ordenador
RTC.adjust(DateTime(__DATE__, __TIME__));
pinMode(salida,OUTPUT);
pinMode(salida1,OUTPUT);
}
void loop () {
DateTime now = RTC.now();
hora=(now.hour(),DEC);
minutos=(now.minute(),DEC);
segundos=(now.second(),DEC);
//Imprimimos el dia
Serial.print(now.day(), DEC);
Serial.print(‘/’);
//Imprimimos el mes
Serial.print(now.month(), DEC);
Serial.print(‘/’);
//Imprimimos el año
Serial.print(now.year(), DEC);
Serial.print(‘ ‘);
//Imprimimos la hora
Serial.print(now.hour(), DEC);
Serial.print(‘:’);
//Imprimimos los minutos
Serial.print(now.minute(), DEC);
Serial.print(‘:’);
//Imprimimos los segundos
Serial.print(now.second(), DEC);
Serial.println();
if (now.hour()== 06 && now.minute() ==01)
{
digitalWrite(salida,HIGH);
digitalWrite(salida1,HIGH);
}
if (now.hour()== 18 && now.minute() ==01)
{
digitalWrite(salida,LOW);
}
if (now.hour()== 23 && now.minute() ==59)
{
digitalWrite(salida1,LOW);
}
delay(1000);
El programa funciona muy bien,les doy muchas gracias por este trabajo impecable,un saludo y esperamos seguir aprendiendo con sus ayudas.
Este post esta muy bueno!!un millón de gracias y estamos gratamente agradecidos.un saludo!!!
Buenos días compañeros, alguno de ustedes le pudo poner alarmas con este modulo, así como botones externos y compensación de tiempo de retardo al cargar el programa???
¿Cómo puedo modificar el programa para utilizar un RTC DS3231 en vez del DS1307?
Te agradecería mucho si me ayudaras. Gracias
Jerman, esa pregunta es muy abierta ya que hay que realizar varios cambios. Te comento que para aplicaciones especificas tenemos un equipo de diseño en contacto@hetpro.com.mx que te puede generar la solución por un costo. Sin embargo te comento que puedes utilizar este tutorial como referencia si gustas realizar tu mismo el cambio https://learn.adafruit.com/adafruit-ds3231-precision-rtc-breakout/overview
Buenas noches a todos mi pregunta es, como se haría usando el etc y el LCD ambos por I2c ya que se que se le puede poner también al LCD un chip y usar sólo dos hilos eso ahorraría muchas salidas en el arduino conectando sólo el pcf8574p
Hola:
Estoy con este proyecto, me parece interesante, pero tengo un problema,
Cuando doy a verificar la compilación me da el siguiente error,
exit status 1
Error compilando para la tarjeta Arduino/Genuino Uno.
Le he dado mil vueltas al código, pero no soy capaz de ver el error.
Deciros que soy novato
¿Me podéis echar una mano?
Saludos y gracias.
Hola Juan Carlos, acabo de verificarlo y el código esta bien. Me marco ese mismo error cuando no tenia la biblioteca RTClib, solo la descargue del enlace que menciona el Tutorial, la agregue al entorno de Arduino y compilo sin problemas, saludos.
En qué programa realizó la simulación del programa mi amigo … por favor me ayuda se lo agradezco desde ya
hola, una pregunta tonta, en el sktch donde pongo la hora y fecha?gracias.
Hola, no entiendo bien por qué pone mostrar RTCLCD espera un segundo y pone void mostrar RTCLCD dice en el comentario que lee los datos del rtc y los imprime en el display pero ¿eso no lo haces más abajo con lcd.print ??
hola
quiero conecta 4 relay que se prendan en forma secuenciale y a una determinada hora.
Cada relay debera esta activado minimo 5 minutos,
Es para regar mi jardin con 4 electrovalvulas
Muchas gracias anticipadamente por la ayuda