miércoles, 25 de octubre de 2017

Fecha y hora con el RTC DS1302 y una LCD 16x2 con I2C

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.

1 comentario:

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

    ResponderEliminar