Vamos a ver cómo se muestra la fecha y hora dada por un reloj de tiempo real (RTC) en una pantalla LCD de 16 caracteres por 2 filas.
Material utilizado:
- Arduino UNO
- pantalla LCD 16x2
- el bus I2C para comunicarnos con la pantalla LCD
- RTC modelo DS1302
Existen otros relojes de tiempo real (RTC) como son los modelos: DS1305, DS331. En nuestro caso el que teníamos disponible en este momento es el DS1302. Se diferencias en ciertas características técnicas y en especial en las librerías disponibles. En nuestro caso usaremos la librería DS1302.
Este es el enlace a la librería.
Las conexiones del DS1302 al Arduino UNO son las siguientes.
- VCC pin -> Arduino 5V
- GND pin -> Arduino GND
- CLK pin -> Arduino Digital
- DAT pin -> Arduino Digital 3
- RST pin -> Arduino Digital 2
El bus I2C nos ahorra cables para conectar la pantalla LCD. Se conecta el bus I2C a la pantalla por la parte de atrás de ésta, y luego los cuatro cables del I2C van al Arduino UNO de la siguiente manera.
- GND --> GND
- VCC --> 5V
- SDA --> A4 pin analógico del Arduino
- SCL --> A5 pin analógico del Arduino
SDA es la señal de datos y SCL es la señal de reloj que usa el I2C.
El reloj de tiempo real DS1302 utiliza una pila botón grande de 3 voltios para memorizar la hora en caso de desconexión. La pila puede durar 2 o 3 años.
El código es el siguiente.
// DS1302: RST pin -> Arduino Digital 2
// DAT pin -> Arduino Digital 3
// CLK pin -> Arduino Digital 4
// GND pin -> Arduino GND
// VCC pin -> Arduino 5V
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS1302.h>
LiquidCrystal_I2C lcd(0x3F,16,2);// if your LCD does not display,change it to 0x27 or other address
//to detect correct LCD i2c address, read http://osoyoo.com/2014/12/07/16x2-i2c-liquidcrystal-displaylcd/
DS1302 rtc(2, 3, 4);
void clockdate()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(rtc.getDateStr(FORMAT_LONG,FORMAT_LITTLEENDIAN, '/'));// check 1302 library and see FORMAT_BIGENDIAN:2010-01-01;FORMAT_LITTLEENDIAN:01-01-2010
lcd.setCursor(11,0);
lcd.print(rtc.getDOWStr());
lcd.setCursor(14,0);
lcd.print(" ");
lcd.setCursor(0, 1) ;
lcd.print(rtc.getTimeStr());
}
void setup()
{
lcd.init(); // initialize the lcd
lcd.backlight();
rtc.halt(false);
rtc.writeProtect(false);
rtc.setDOW(WEDNESDAY); //Estas tres líneas con set se han de subir la primera vez y luego
rtc.setTime(20,59,00); //se han de subir una segunda vez convertidas en comentarios
rtc.setDate(25,10,2017); //para que la fecha y hora no se reinicien siempre al mismo valor.
rtc.writeProtect(true);
}
void loop()
{
clockdate();
delay(1000);
}

En el código existen tres líneas que utilizamos para que la placa Arduino obtenga la fecha y hora actuales. Estas son las que yo he utilizado:
- rtc.setDOW(WEDNESDAY);
- rtc.setTime(20,59,00);
- rtc.setDate(25,10,2017);
Si se desconecta de la alimentación el Arduino y luego se vuelve a conectar él ejecuta nuevamente su código aprendido y volverá a iniciarse en la fecha y hora de la programación que conserva en memoria, por lo que los datos que ofrezca ya estarán desactualizados.
Para solucionar este problema debemos convertir estas tres líneas en comentarios y cargar
nuevamente el código en la placa Arduino. Cuando desconectemos la placa de la alimentación y luego volvamos a conectarla se tomará la fecha y hora del reloj de tiempo real. De esta forma conseguiremos estar en la fecha y hora correctas.