Tutorial LCD con I2C, controla un LCD con solo dos
pines
Posted by Tutoriales 51 Comments
En este tutorial aprenderemos a utilizar el Médulo adaptador de LCD a I2C y de esa forma poder controlar
nuestro LCD Alfanumérico con solo dos pines de nuestro Arduino.
Este tutorial es similar al Tutorial LCD, conectando tu Arduino a un LCD1602 y LCD2004, con la pequefia
diferencia que ahora utiizaremos un Médulo adaptador LCD a I2C. Trabajaremos los mismos ejercicios
del primer tutorial y de esa forma demostraremos que utilizar el médulo adaptador es tan sencillo como si
trabajéramos directamente con el LCD
Hardware del Modulo adaptador LCD a I2C
EI Médulo adaptador LCD a I2C que usaremos est basado en el controlador 12C PCF8574, el cual es
un Expansor de Entradas y Salidas digitales controlado por I2C. Por el disefio del PCB este médulo se
usa especialmente para controlar un LCD Alfanumérico.
La direccién |2C por defecto del médulo puede ser 0x3F 0 en otros casos 0x27. Es muy importante
identificar correctamente la direccién 12C de nuestro modulo, pues de otra forma nuestro programa no
funcionaré correctamente. Para identificar la direccién especifica de nuestro médulo podemos utilizar un
pequefio sketch de prueba llamado: 12C Scanner, el cual nos permite identificar la direccién 12C del
dispositive conectado al Arduino. Si en caso existiera la necesidad de trabajar con mas de un LCD
podemos modificar la direccién I2C del modulo adaptador. Para esto es necesario soldar los puentes AO,
A1 y A2 presentes en el médulo, estos tres puentes son los bits menos significativos de la direccién 12C
del médulo. La direccién 0x3F en binario seria: 00]1]1/1JA2|A1|A0 y la direccién 0x27: 0/0|1|0|0|A2|A1|A0.
Por defecto AO, A2, A1 valen 1 pero si soldamos los puentes, estos se conectan a tierra teniendo un valor0. Por ejemplo si soldamos los tres puentes la nueva direccién seria 0|0|1|0|0|0|0|0 (0x20), para un chip
que anteriormente era 0x27.
Para controlar el contraste de los digitos en el LCD solo necesitamos girar el potenciémetro que se
encuentra en el médulo, hasta quedar conformes con el contraste mostrado.
La luz de fondo se controla principalmente por software desde el Arduino, pero el médulo también permite
desconectar el Led de la luz de fondo removiendo un jumper LED.
Conexiones entre Arduino y Modulo adaptador LCD a I2C
El adaptador LCD a I2C tiene los pines ordenados para conectar directamente al LCD, esto lo podemos
hacer a través de un protoboard o soldando directamente al LCD.Para conectar con el modulo con el Arduino solo utilizamos los pines 12C del Arduino (SDA y SCL) y
alimentacién (GND y 5V), los pines I2C varian de acuerdo al modelo de Arduino con el que trabajemos,
en la siguiente tabla podemos ver cuales son los pines |2C para cada modelo de Arduino.
Adaptador
LeD al2zc
GND
Vcc
SDA
SCL
Arduino
Uno,
Nano,
GND
5V
A4
AS
Arduino Arduino
Mega, Leonardo
DUE
GND GND
5V 5V
20 2
24 3* Las conexiones para el LCD 20 x 4 son las mismas.
Libreria LiquidCrystal_I2C para Arduino
Existen diferentes tipos y versiones de librerias para trabajar con el médulo Adaptador LCD a I2C,
informacién mds completa pueden encontrar en: http://playground.arduino.cc/Code/LCDi2c , nosotros
usaremos la libreria LiquidCrystal_l2C
Las funciones que utiliza esta libreria son similares a la libreria LiquidCrystal de Arduino, revisaremos
las funciones principales:
LiquidCrystal_I2C(Icd_Addr, Icd_cols, Icd_rows)
Funcién constructor, crea un objeto de la clase LiquidCrystal_I2C, con direccién, columnas y filas
indicadas
init()
Inicializa el modulo adaptador LCD a I2C, esta funcién internamente configura e inicializa el I2C y el
LCD.
clear()
Borra la pantalla LCD y posiciona el cursor en la esquina superior izquierda (posicién (0,0).
setCursor(col, row)
Posiciona el cursor del LCD en la posicién indicada por col y row(xy); es decir, establecer la
ubicacién en la que se mostrard posteriormente texto escrito para la pantalla LCD.
print()Escribe un texto o mensaje en el LCD, su uso es similar a un Serial.print
scrollDisplayLeft()
Se desplaza el contenido de la pantalla (texto y el cursor) un espacio hacia la izquierda.
scrollDisplayRight()
Se desplaza el contenido de la pantalla (texto y el cursor) un espacio a la derecha
backlight();
Enciende la Luz del Fondo de! LCD
noBacklight();
Apaga la Luz del Fondo del LCD
createChar (num, datos)
Crea un caracter personalizado para su uso en la pantalla LCD. Se admiten hasta ocho caracteres de
5x8 pixeles (numeradas del 0 al 7). Dénde: num es el ntimero de caracter y datos es una matriz que
contienen los pixeles del cardcter. Se verd un ejemplo de esto mas adelante.
Ahora que hemos repasado la libreria veamos algunos ejemplos:
Ej 1. Un Hola mundo con Arduino y LCD
Mostraremos texto y un valor numérico en el LCD, para esto cargamos el siguiente sketch:
include
include
/[crear el objeto led dinecclén @x3F y 16 columas x 2 filas
Liquidcrystal_12¢ 1cd(@x3F,16,2)5 //
void setup() {
1 Inicializar el Leo
Led. init();
//encender la luz de fondo
Led. backlight()
// €seribimos el Mensaje en el LC
led.print(*Hola Mundo");
»
void loop() {
// Ubicamos el cursor en la primera posicién(colunna:é) de la segunda Linea(fila:1)
led.setcursor(@, 1);
// Escribimos el numero de segundos trascurridos
Led. print(mil1is()/108@) ;
1ed.print(" Segundos");
delay(102);Después de cargar, en su LCD deben obtener el siguiente resultado
Hola Mundo
4 Se9undoas
@ www.naylampmechatronics.com @
La programacién es similar para un LCD de 20x4, solo hay que modificar en:
LiquidCrystal_l2C Ied(0x27,20,4);
Ej 2. Desplazando el texto en el LCD
En este ejemplo para desplazar el texto usaremos la funcién scrollDisplayLeft(). El codigo es el siguiente:
include
/[crear el objeto led direceién @x3F y 16 columas x 2 Files
Lee (@x3F,26,2); //
0O€
// nicializar el Leo
led. init();//Encender la luz de fondo.
ed O38
// Escribimos el Mensaje en el LCD en una posicién central
led (28, 9);
ed. print ("Wal NAVLAMPMECHATRONICS.. COM");
led (4, 05
led.print("Tutorial LeD, Test de desplazaniento ");
0O€
//éesplazanos una posicién a 1a izquierda
led 03
(500) 5
El resultado serd el texto desplazandose de derecha a izquierda
Loe
NPMECHATROWICS.C
Test de desplaza
@ wwvw.naylampmechatronics.com (7)
Ej 3. Mostrando datos de sensores 0 variables en el LCD
En este ejemplo mostramos en el LCD variables, que pueden representar valores de sensores u otros
datos, Para simular los sensores usaremos potenciémetros conectados a los puertos analégicos.include
include
JKerear el objeto led direccién @x3F y 16 columnas x 2 filas
Liquidcrystal_12¢ 1ee(@x3F,16,2)5 //
void setup() (
// Inicializar el Leo
Led. init();
//encender 1a luz de fondo.
Led. backlight ()5
y
void 1o0p() {
Ant sent=analogkead(Aa);
Float sen2eanalogtead(Al)*(5.0 / 1823.0);
‘float sen3-onaloghead(A2)*(108.8 / 1023.0);
fnt tenpoentl1is()/1000;
11 Cursor en 1a prinera posicién de 1a prinera fila
led, setCursor(@,0);
lcd.print("ADC:")5
led. print(sent);
ed.print(™ "3
11 Carsor en 1a 12° posicién de 1a prinera fila
ed. setCursor(10,0)5
led. print (°V:")5
led.print(sen2,1)5//4 decimal
led.peint("V. "3
11 Cursor en 2a prinera posieién de 1a 2° Fila
ed. setCursor(®,1);
led.peint("T:")5
led.peint(sen3,1); //1 decimal
ed.print("337¢")3 // "337" => 7
11 Cursor en 1a 11° posicién de 1a 2° Fle
ed. setCursor(10,1)5
led. print("t:")5
cd. print (tiempo)
Acd.print(" 5 ")5
delay(200)5
El resultado debe ser el siguiente:ADGSS1ie = Usd, iu
ee es ese
@ www.naylampmechatronics.com (/)
Ej 4. Agregando nuevos caracteres a nuestro LCD
En algunos casos el LCD no incluye por defecto los caracteres que necesitamos, 0 deseamos dibujar
caracteres personalizados, en este caso usamos la funcién createChar ()pero antes estudiemos como
esta constituido un caracter:
Un caracter esta formado por una matriz de 5x8 pixeles los cuales se representan por 8 bytes, uno para
cada fila, los 5 bits menos significativos representan los pixeles del caracter:d7 | dé
byteo | - | -
byter | - | -
byte2 | - | -
bytes | - | -
bytea | - | -
bytes | - | -
bytes | - | -
byte7 | - | -
Como maximo podemos crear 8 caracteres nuevos.
Para este ejemplo crearemos los siguientes caracteres:N naylamp Anaylamp Y naylamp Lnaylamp
cara
o]ofolo
Boffo
o|ofofo
o|ofolo
ofolo
0 °
A continuacién se muestra el cédigo para implementar los nuevos caracteres.
include
include
/[€rear el objeto led direccién Ox3F y 16 colunnas x 2 filas
Liquiecrystal_12¢ 1ce(@x3F,16,2)5 /7
byte N[B]
e111,
210001,
10001,
210001,
210001,
210001,
210001,
90000,
h
yte ALB] = {
e111,
510001,
sxe001,
10001,
810001,
sini,
810001,Beee00,
%
byte Via] = {
810001,
810001,
810001,
810201,
e111,
800100,
8¢0109,
890000,
bh
byte U8] = ¢
810000,
810000,
810000,
510000,
810000,
810000,
e111,
00000,
%
byte mI] = {
e111,
s10101,
s10101,
510101,
510101,
510101,
si0101,
800000,
b
byte Pls] = ¢
e111,
810001,
810001,
810001,
e111,
810000,
810000,
byte cara[s] =
890000,
10001,
590000,
800000,
810001,
Be1110,
890000,
h
byte cuerpo[8]
Bo2110,
p02110,
200100,
oerten
290100,
ao2e10,
210001,
90000,
hvoid setup() {
// Inicializar el Leo
led. nit);
//encender 1a luz de fondo.
Led. backLight()5
‘/lereanos 10s nuevos caracteres
led.createchar (@,N);
lcd.createchar (1,8);
lcd.createchar (2,¥)3
lcd.createchar (3,L);
led.createchar (4,M);
lcd.createchar (5,P);
led. createchar (6,cara);
led. createChar (7, cuerpo);
// Escribimos el texto en el LCD
led.setCursor(@, @)3
led.print ("Tutorial Lco_12¢");
led.setcursor(@, 1);
led.urite (byte (7));
led.print(” *);
led.urite (byte (6));
led.print(” ")3
led.urite (byte (2));
led.urite (byte (1));
led.urite (byte (2));
led.write (byte (3));
led.urite (byte (1));
led.urite (byte (4));
led.urite (byte (5));
led.print(” ");
led.write (byte (6);
led.print(" ");
led.write (byte (7);
}
void loop ()
El resultado del ejemplo anterior es el siguiente:Tutorial LOO_T2c
= = NOWLOMA ~
@ www.naylampmechatronics.com
Los ejemplos anteriores se trabajan similar con un LCD2004