Páginas

domingo, 3 de febrero de 2013

RTC DS1307 y LCD I2C Arduino


 

  

 

 

 

 

 

 

 

 

 

Reloj RTC DS1307 y LCD I2C

Para comprobar la potencia del BUS I2C vamos ha hacer un peuqeño ejemplo de conectar un RTC DS1307 y una pantalla LCD I2C.

Conectamos los 2 dispositivos al BUS I2C según la tabla que ya vimos con anterioridad:


 

I2C
Arduino
Arduino Mega
VCC
5V
5V
GND
GND
GND
SCL
A5
D21
SDA
A4
D20
 
En un Arduino UNO quedaría algo así:


El código de este ejemplo está basado en el que puse en el post del RTC, añadiendo las librerías necesarias para el LCD. Y lo más interesante una función que nos refresca la hora y la fecha sin refrescar toda la pantalla.



[...]
// Función de refresco de la hora por LCD
void printDate(){
 
  RTC.getTime();
  
  int second = RTC.second;
  int minute = RTC.minute;
  int hour = RTC.hour; //24 hour time
  int monthDay = RTC.day;
  int month = RTC.month;
  int year = RTC.year;
  
  
  dia = vacia + monthDay; if (dia.length() == 1) {dia = "0" + dia;}
  mes = vacia + month; if (mes.length() == 1) { mes = "0" + mes;}
  anno = vacia + year; if (anno.length() == 1) { anno = "0" + anno; }
  hora = vacia + hour; if (hora.length() == 1) { hora = "0" + hora; }
  minuto = vacia + minute; if (minuto.length() == 1) { minuto = "0" + minuto; }
  segundo = vacia + second; if (segundo.length() == 1) {segundo = "0" + segundo;}
 
  fechaChar = dia + "/" + mes + "/" + anno;
  horaChar  = hora + ":" + minuto + ":" + segundo;
  
     
  horaChar.toCharArray(horaC,10);
  fechaChar.toCharArray(fechaC,11); 
  
   lcd.setCursor(0,3);
   
   if (monthDay != monthDay_old) {
     if (monthDay < 10){
       lcd.print("0");
       lcd.setCursor(1,3);
       lcd.print(monthDay);
     }
     else {
       lcd.print(monthDay);
     }
     monthDay = monthDay_old;
     lcd.setCursor(2,3);
     lcd.print("/");
     lcd.setCursor(3,3);
   }
   
   if (month != month_old) {
     if (month < 10){
       lcd.print("0");
       lcd.setCursor(4,3);
       lcd.print(month);
     }
     else {
       lcd.print(month);
     }
     lcd.setCursor(5,3);
     lcd.print("/");
     lcd.setCursor(6,3);
     month = month_old;
   }
   if (year != year_old) {
     if (year < 10){
       lcd.print("0");
       lcd.setCursor(7,3);
       lcd.print(year);
     }
     else {
       lcd.print(year);
     }
     year = year_old;
   }

   lcd.setCursor(12,3);
   if (hour < 10){
     lcd.print("0");
     lcd.setCursor(13,3);
     lcd.print(hour);
   }
   else {
     lcd.print(hour);
   }

   lcd.setCursor(14,3);
   lcd.print(":");
   lcd.setCursor(15,3);
   if (minute < 10){
     lcd.print("0");
     lcd.setCursor(16,3);
     lcd.print(minute);
   }
   else {
     lcd.print(minute);
   }
   

   lcd.setCursor(17,3);
   lcd.print(":");
   lcd.setCursor(18,3);
   if (second < 10){
     lcd.print("0");
     lcd.setCursor(19,3);
     lcd.print(second);
   }
   else {
     lcd.print(second);
   }

}
[...]







Una vez cargado el ejemplo tenemos un Display LCD con la fecha y la hora como este:




Este ejemplo lo iré completando con más elementos.

7 comentarios:

  1. Hola me baje el ejemplo pero no encuentro las librerias q utilizaste de el rtc y lcd: #include "LiquidCrystal_I2C.h"
    #include "DS1307new.h"
    Lo he intentado hacer con las mias pero se refresca la pantalla y no veo nada..me podrias pasar las librerias para probar si con las tuyas me pasa o no, muchas gracias

    ResponderEliminar
    Respuestas
    1. Hola, en los post del RTC y del LCD tienes las librerías. También a la derecha de este mismo post tienes todos los ejemplos y librerías disponibles.

      Un saludo.

      Eliminar
    2. Solucionado, muchas gracias, mi LCD es de YwRobot(va con la libreria LiquidCrystal_I2C2004V1 por si alguno tambien le es de ayuda),y le habia metido la V2.

      Eliminar
  2. se puede conecta alos mismo pines analogicos los comparte no hay problema en eso????

    ResponderEliminar
    Respuestas
    1. Hola, sí eso es lo bueno de utilizar el bus I2C.

      Un saludo.

      Eliminar
  3. pero se pueden conectar otros sensores??? solo en lo analogico o digital se puede gracias :) me ahorre pines jajajaj

    ResponderEliminar
    Respuestas
    1. Puedes conectar varios dispositivos, mira este enlace:

      http://es.wikipedia.org/wiki/I%C2%B2C

      Eliminar