jueves, 26 de octubre de 2017

Arduino ejemplos: LCD con i2c

Buenas a todos!!!
Si ya vimos antes como utilizar un LCD 16x02, Arduino: El LCD 16x2 y
Arduino: Diferentes efectos en un LCD 16x2
directamente conectando a Arduino usando en total un mínimo de 6 líneas, esto puede que no sea un problema si tú proyecto no utiliza muchos sensores, pero si es necesario usar el máximo de pines disponibles existe una solución que puedes usar, el módulo i2c para LCD.
Con este dispositivo conseguiremos un  ahorro en los pines de nuestro Arduino pudiendo, además, conectar más dispositivos i2c a las mismas líneas de control.

El bus TWI/i2c:

El bus serie i2c fue creado por Philips en 1982 para la comunicación entre microcontroladores y periféricos.
El TWI (Two Wired Interface) es idéntico a nivel técnico pero atmel tuvo que cambiar las siglas por motivos de licencias, pero a efectos prácticos es lo mismo.
i2c está diseñado como un bus de comunicación Maestro-Esclavo, con esto uno de los dispositivos (maestro) regula la comunicación y los demás dispositivos (esclavos) que atienden sus peticiones.

Este bus está formado por dos líneas, SLK y SDA.
SLK (Serial Clock)  marca la velocidad de comunicación y marca los tiempos para la lectura/escritura en el bus.
SDA (Serial Data) es la línea por donde se transmite la información.

Cada dispositivo conectado al bus tiene una dirección, así que para conectarnos con el debemos saber dicha dirección, con este programa podréis saber cual es la dirección de vuestro dispositivo:
leer dirección de un dispositivo i2C

Conexión Arduino modulo i2C:
Conexión Arduino UNO con LCD i2C
Conexión Arduino UNO con LCD i2C



Arduino i2C escaner
Arduino i2C Scan

Librerías:
Para este ejemplo utilizaremos la librería LiquidCristal_I2C de la web oficial www.dfrobot.com o directamente aquí  y cuenta con las siguientes funciones:
  • LiquidCrystal_I2C Nombre (lcd_Addr, n_filas, m_columnas);
Para esta función necesitamos la dirección que obtuvimos con el i2C Scaner, como se puede ver en la imagen es 0x3F y el número de filas y columnas que tiene nuestro LCD, en este caso es un 16x02. Con esta información la función quedaría así:  LiquidCrystal_I2C lcd (0x3F, 16, 2);
  • lcd.begin(); 
Esta función la situaremos en el setup()  y es la que inicia el LCD.
  • lcd.backlight(); y lcd.noBacklight();
Apaga y enciende la luz Led del LCD.

Las demás funciones son las mismas que en la librería LiquidCristal.h las cuales están explicadas en la entrada que comente al principio: Arduino: El LCD 16x2.

Veamos como quedaría el mitico "Hola Mundo":



// Ejemplo "Hola mundo" con modulo i2C
#include "Wire.h" 
#include "LiquidCrystal_I2C.h"

// configura el LCD con la dirección 0x3F con 16 caracteres y dos lineas.
LiquidCrystal_I2C lcd(0x3F, 16, 2);

void setup()
{
 // Inicia el LCD
 lcd.begin();

 // Enciende el backlight y escribe el mensaje.
 lcd.backlight();
 lcd.print("Hola mundo!");
}

void loop()
{ 
 // Sin loop
}

Arduino LCD i2C "Hola Mundo"
Arduino LCD i2C "Hola Mundo"

No hay mucho que explicar en este ejemplo lo podéis encontrar en los ejemplos de la misma librería.

Ahora vamos a escribir en las 2 lineas del LCD. 
Vamos a situar la primera linea (0) en la segunda posición (1) y  nos mostrará la dirección del LCD.
La segunda linea (1) en la posición 1 (0) y mostrará un texto.
También encenderá y apagara la pantalla durante 500ms 3 vecces y la mantendrá encendida durante 5 segundos.



#include "Wire.h" 
#include "LiquidCrystal_I2C.h"

// Guardamos la direccion del modulo i2C en una variable tipo String.
const String direccion =  "0x3F"; 
// configura el LCD con la dirección 0x3F con 16 caracteres y dos lineas.
LiquidCrystal_I2C lcd(0x3F, 16, 2);

void setup()
{
  lcd.begin();		// Inicia el LCD  
  lcd.backlight();	// Enciende el backlight.
}

void loop(){
  lcd.setCursor(1,0); // Posiciona el cursor (Pos=1,Linea=0).
  lcd.print("Direccion:"); // Muestra texto empezando en esa posicion
  lcd.print(direccion); // Imprime la direccion el modulo i2C.
  lcd.setCursor(1,1); // Posiciona el cursor (Pos=1,Linea=1).
  lcd.print ("Infotronikblog"); //Imprime el mensaje
  delay(5000);  // Pausa de 5 segundos
  
for (int x=0; x < 3; x++){  // Bucle para repetir 3 veces.
    lcd.noBacklight();		// Apaga el backlight
    delay(500);				// Pausa de 500ms.
    lcd.backlight();		// Enciende el backlight.
    delay(500);				// Pausa de 500ms.
  }
  

No hay comentarios :

Publicar un comentario