miércoles, 25 de octubre de 2017

Hola mundo con Arduino en una LCD con bus I2C

Material utilizado

  • Arduino UNO
  • LCD 16x2
  • I2C
  • cables

Conexiones

El bus I2C se conecta al LCD por la parte de atrás de la pantalla. Luego el I2C utiliza cuatro cables para conectarse al Arduino, con esto ahorramos cables. Este es un bus muy utilizado desde hace muchos años.
  • 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.

Código

También se puede utilizar en una pantalla LCD 20x4.

 //Objetivo de este código: saludar en un LCD 16x2 con I2C en un arduino UNO  
 //El I2C del LCD tiene cuatro cables que van al arduino así:  
 // GND --> GND  
 // VCC --> 5V  
 // SDA --> A4  
 // SCL --> A5  
 #include <Wire.h>  
 #include <LiquidCrystal_I2C.h>  
 //Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas  
 LiquidCrystal_I2C lcd(0x3F,16,2); //  
 void setup() {  
  lcd.init();        // Inicializar el LCD  
  lcd.backlight();     //Encender la luz de fondo  
  lcd.print("Hola Mundo"); // Escribimos el Mensaje en el LCD  
 }  
 void loop() {  
  // Ubicamos el cursor en la primera posición(columna:0) de la segunda línea(fila:1)  
  lcd.setCursor(0, 1);  
  // Escribimos el número de segundos trascurridos  
  lcd.print(millis()/1000);  
  lcd.print(" Segundos");  
  delay(1000);  
 }  

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.