RTC DS1307 I2C+ Arduino + Display LCD 16×2

 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.

fig1
Bus I2C

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.

fig2 RTC DS1307
Pines del Módulo RTC DS1307

 

Diagrama de conexión entre arduino, display lcd y RTC DS1307

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

Dirección donde copiar la librería

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


// 21/04/2015 Remodificado y probado por Roberto Chacón Diaz
// Pin Sda al pin A4 del arduino
// Pin Scl al pin A5 del arduino
// Tambien como en cualquier modulo, se deben conectar VCC y GND.
// Se aceptan sugerencias y/o modificaciones.

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);//pines del arduino al LCD (RS E D4 D5 D6 D7) RESPECTIVAMENTE
RTC_DS1307 RTC;

void setup()
{
Wire.begin(); //configura el bus I2C estableciendo arduino como MASTER
RTC.begin();
if (! RTC.isrunning()) // se verifica si el modulo rtc esta en funcionamiento, de lo contrario, se imprime: RTC is NOT running!
{
lcd.println("RTC is NOT running!");
delay(10000);
}
RTC.adjust(DateTime(__DATE__, __TIME__)); //esta funcion establecera en el modulo la fecha de creación del archivo .hex generado al compilar el sketch.

lcd.begin(16,2);
lcd.clear();
}

void loop()
{
mostrarRTCLCD(); //Se manda a llamar la funcion "mostrarRTCLCD" y despues se espera un tienpo de 1seg
delay(1000);
}

void mostrarRTCLCD() //Funcion que lee los datos de modulo RTC y despues los imprime en el display
{
DateTime now = RTC.now(); //obtiene datos del modulo RTC
lcd.clear();
lcd.setCursor(0,0);
if(now.day() < 10)
{
lcd.print("0");
}
lcd.print(now.day(), DEC); //imprime dia
lcd.print('/');
if(now.month() < 10)
{
lcd.print("0");
}
lcd.print(now.month(), DEC); //imprime mes
lcd.print('/');
lcd.print(now.year(), DEC);  //imprime el año
lcd.setCursor(0,1);
if(now.hour() < 10)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC); //imprime hora
lcd.print(':');
if(now.minute() < 10)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC); //imprime minutos
lcd.print(':');
if(now.second() < 10)
{
lcd.print("0");
}
lcd.print(now.second(), DEC); //imprime segundos
}

Finalmente unas imágenes del proyecto funcionando.

fig5
RTC DS1307

 

RTC DS1307
RTC DS1307
RTC DS1307
RTC DS1307

 

18 comentarios en “RTC DS1307 I2C+ Arduino + Display LCD 16×2

  1. 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.

  2. 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

  3. 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.

  4. 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

    1. 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

  5. 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);

  6. El programa funciona muy bien,les doy muchas gracias por este trabajo impecable,un saludo y esperamos seguir aprendiendo con sus ayudas.

Deja un comentario

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