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.
- VCC pin -> Arduino 5V
- GND pin -> Arduino GND
- CLK pin -> Arduino Digital
- DAT pin -> Arduino Digital 3
- RST pin -> Arduino Digital 2
- 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.
Buenas tardes, he seguido el código pero se me presenta un inconveniente, cuando subo el código convirtiendo las tres lineas mencionadas en comentarios, me muestra valores de hora en 0, he comprobado la pila y esta funcionando adecuadamente, que podrá estar pasando?
ResponderEliminarHola, estoy intentando bajar la biblioteca pero no puedo, al ir al enlace no sale nada. Puedes decirme que biblioteca es?, tengo varias instaladas pero no funciona el codigo con ninguna de ellas. Gracias
ResponderEliminar