A veces cuando estás montando un proyecto, puede que te quedes corto con los pines de tu tarjeta Arduino y necesites optimizar las conexiones hardware de tu diseño. En esta entrada vamos a ver como poder obtener unos pines más pasando de emplear una lcd conectada en modo paralelo (empleamos 6 pines) a una lcd que emplea el protocolo de comunicación I2C (empleamos 2 pines analógicos en el caso del Uno, pines digitales 2 y 3 para el Leonardo y pines 20 y 21 digitales en el caso del Mega). Yo me he comprado un adaptador bastante económico a través de ebay que va soldado a los pines de nuestra pantalla lcd, aunque también se venden los módulos y pantalla juntos. Os dejo unas fotos para que podáis ver el módulo (hay muchos en el mercado pero que funcionan exactamente igual de bien):
Como podéis ver este módulo trae cuatro pines que a partir de ahora son los que vamos a usar y que son los siguientes: GND, VCC, SDA y SCL. Además trae un potenciometro gracias al cual podremos regular el brillo de la pantalla (para poder ver correctamente los caracteres en ella) y un jumper para activar o desactivar el backlight (luz) de la pantalla (también se puede activar o desactivar por software).
La conexión a nuestras placas es bastante sencilla ya que solo son 4 cables, aunque hay que tener en cuenta la placa Arduino que vayamos a emplear ya que como he dicho antes cambia la disposición de estos pines, por tanto para la tarjeta Arduino Uno emplearemos los pines A4(SDA) y A5(SCL), para la Arduino Leonardo emplearemos los pines SDA y SCL y para la Arduino Mega emplearemos D20(SDA) y D21(SCL). Os dejo unos ejemplos de conexión:
Os dejo un código de ejemplo:
/* Sketch de ejemplo para testear el módulo adaptador paralelo a I2C de pantalla LCD Escrito por YWROBOT, modificado por Regata para www.tallerarduino.wordpress.com*/ #include <Wire.h> #include <LiquidCrystal_I2C.h> //Comprobamos la version de nuestro IDE de Arduino y dependiendo de si es una version superior a la 1 ejecutamos distintos comandos //esto es necesario ya que para versiones anteriores se empleaba el comando print para imprimir caracteres y ahora se emplea el comando write #if defined(ARDUINO) && ARDUINO >= 100 #define printByte(args) write(args); #else #define printByte(args) print(args,BYTE); #endif //Creamos diferentes caracteres uint8_t bell[8] = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4}; uint8_t note[8] = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0}; uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0}; uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; uint8_t duck[8] = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0}; uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0}; uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0}; uint8_t retarrow[8] = { 0x1,0x1,0x5,0x9,0x1f,0x8,0x4}; LiquidCrystal_I2C lcd(0x20,20,4); // definimos la direccion de la pantalla LCD a 0x20 e indicamos el numero de columnas y filas de la pantalla void setup() { lcd.init(); //Iniciamos la pantalla lcd.backlight(); //Activamos el backligt //Le decimos a la pantalla que cree los distintos caracteres arriba definidos lcd.createChar(0, bell); lcd.createChar(1, note); lcd.createChar(2, clock); lcd.createChar(3, heart); lcd.createChar(4, duck); lcd.createChar(5, check); lcd.createChar(6, cross); lcd.createChar(7, retarrow); lcd.home(); //Posicionamos el cursor al inicio lcd.print("Visitanos en:"); //Imprimimos el mensaje lcd.setCursor(0, 1); //Nos posicionamos en la primera columna de la fila 2 lcd.print("www.tallerarduino."); //Imprimimos el mensaje lcd.setCursor(7, 2); //Nos posicionamos en la quintaa columna de la fila 3 lcd.print("wordpress.com"); //Imprimimos el mensaje lcd.setCursor(4, 3); //Nos posicionamos en la cuarta columa de la fila 4 lcd.print("We "); lcd.printByte(3); lcd.print(" Arduino!"); delay(10000); displayKeyCodes(); //Llamamos a la funcion displayKeyCodes } //Muestra todos los caracteres void displayKeyCodes(void) { int i = 0; while (1) { lcd.clear(); //Borramos la pantalla lcd.setCursor(0,1); //Nos posicionamos en la primera columna de la segunda fila //Mostramos los distintos caractares lcd.print("Codigos: 0x"); lcd.print(i, HEX); lcd.print("-0x"); lcd.print(i+16, HEX); lcd.setCursor(2, 2); for (int j=0; j<16; j++) lcd.printByte(i+j); i+=16; delay(4000); } } void loop() { }
Aquí podéis ver un video del funcionamiento del programa sobre la pantalla LCD:
Y por último os dejo los archivos, donde viene el skecth, la librería para usar este módulo con vuestra pantalla LCD y el esquema de conexionado en Fritzing: http://www.mediafire.com/?naoloa8um1xfs0m
Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.
Gracias. Nuevamente me amplias el panorama. Tratare de conseguir el adaptador. Saludos.
Hola! Dónde conseguiste el adaptador? Sabes si en dealxtreme lo venden? Gracias!
Hola Uziel!!
Te pongo un par de enlaces, uno para dealextreme y otro para ebay:
Dealextreme —> http://dx.com/es/p/lcd1602-adapter-board-w-iic-i2c-interface-black-works-with-official-arduino-boards-216865
Ebay —> http://www.ebay.es/itm/I2C-IIC-Serial-Interface-Board-Module-LCD1602-Address-Changeable-new-/230970024299?pt=LH_DefaultDomain_0&hash=item35c6e2e16b#ht_2069wt_954
Espero que te sirva!! Un saludo
Hola, muchas gracias por el programa me sale este error a que se debe?
sketch_sep24a:25: error: ‘LiquidCrystal_I2C’ does not name a type
sketch_sep24a.ino: In function ‘void setup()’:
sketch_sep24a:29: error: ‘lcd’ was not declared in this scope
sketch_sep24a.ino: In function ‘void displayKeyCodes()’:
sketch_sep24a:60: error: ‘lcd’ was not declared in this scope
Se debe a que no habia puesto la libreria, Aun asi al cargarlo el ejemplo me pone el display con dos lineas prendidas no muestra letras, hay que configurar algo mas gracias
Hola Xavier!
¿Qué versión del IDE de Arduino usas? Creo que el problema viene por ese motivo o bien por donde tienes guardada la librería para el control de la pantalla LCD. ¿Has usado las librerías que he puesto en esta entrada?
Un saludo!!
Hola Regata,
Uso la versión 1.0.5. probé con la ultima beta también pero con las librerías que tu tienes no pude hacerlo funcionar mi display es un 20×4 con modulo ic2 LCM1602 IIC V1. Entre a esta otra pagina http://arduino-info.wikispaces.com/LCD-Blue-I2C y di en el blanco y me funciono correctamente con la librería que hay en este link lo dejo por si alguien la necesita. Muchas gracias por la pronta respuesta. Saludos
Me alegro de que ya te funcione la pantalla. ¿Tú módulo tiene unos pines (3 pares de 2) en la parte trasera que ponen A0 A1 A2? ¿Los tienes sin soldar? Estos pines indican la dirección que presenta el dispositivo para comunicarse con él a través del I2C, con ellos soldados uniéndolos como si fueran puentes (los dos de A0, los dos de A1 y los dos de A2) seleccionas la dirección 0x20 (igual a ti te aparecía esta por defecto al cargar la librería), sin ellos soldados tienes la dirección 0x27.
Lo digo porque las librerías que tengo yo funcionan perfectamente con todos los módulos que he probado hasta ahora, y creo que tú módulo es como alguno de los que yo tengo. A más gente se le ha pasado por alto el tema de la dirección del dispositivo.
Un saludo y gracias por el aporte!!!
Gracias es bueno saberlo eso, lamentablemente no alcanzo a ver nada aparentemente no posee pines, es exactamente igual que el primero que figura en la pagina que deje. Mi modulo vino con display por eso la parte trasera no la veo bien, sin desoldarlo. Si creo que el problema fue por las direcciones voy a probar mañana que tengo un tiempo libre con tus librerías y te comento. Saludos.
A mi me pasó lo mismo que Xavier, pero cambié la dirección 0x20 por 0x27 y listo. También cambié los posicionamientos del cursor porque mi display es de 16×2.
Saludos
Pato
Claro estas librerias funcionan correctamente muchos ic2 vienen configurada una dirección de memoria y justo es la parte trasera que da al display y hay q desoldar todos los pines para poder cambiarsela lo mejor es hacer eso y cambiar la dire y funciona ok sin ningun problema un saludo
Exacto, bien se puede cambiar la dirección mediante hardware (soldando los pines que trae por detrás el módulo I2C) o bien cambiando la dirección del dispositivo en el código del programa de Arduino. Yo suelo hacerlo por hardware para tener todos los módulos con la misma dirección, ya que si se me pasa en alguno y el programa no va puedo tirarme horas buscando el error, quizás a lo mejor por no darme cuenta de ese pequeño problema.
Gracias por visitarnos!! Un saludo a los dos
tengo problemas con un lcd de 16×2 …..pues tiene el i2c incorporado pero no puedo hacer que funcione, por el momento lo estoy probando en un arduino uno
Buenas
Para saber la direccion I2C podeis usar este codigo
http://playground.arduino.cc/Main/I2cScanner
Escribe el valor por el puerto serie
Hola cristhian!! Puedes indicarme que modelo de placa I2C lleva, bien con una foto o un enlace a donde compraste el lcd, ya que dependiendo del módulo algunos llevan diferentes configuraciones para las patillas E, RW y RS de la pantalla y se necesitan distintas librerías, también puede ser debido al valor de la dirección hexadecimal del módulo que tengas (algunos son 0x20, y otros 0x27). Un saludo!!
Exacto, muchas gracias por la información Jose!! Un saludo!!
Rcientemente he adquirido una pantalla Serial IIC/I2C/TWI 2004 204 20X4 Character LCD Module Display en la parte de atras he visto que pone LCM1602 IIC V1 ,leyendo las caracteristicas veo que la direcccion es 0x27.El problema es que cuando bajo la libreria del enlace http://arduino-info.wikispaces.com/LCD-Blue-I2C ,descomprimo pero no se cual es de ellas,ves que soy un poco novato en la materia,gracias
Hola Carlos!! En esta misma entrada pongo el enlace a un archivo comprimido donde va incluída la librería que yo uso para un módulo como el que tú tinenes, descargalo y prueba esta librería y me cuentas, esas que pones tú no sé si funcionan o no. Puedes averiguar también la dirección de tu módulo mediante el sketch que viene en los ejemplos de Arduino IDE que se llama I2C Scanner. Un saludo y espero haberte ayudado.
Te dejo el link por si lo ves mejor desde aquí: http://www.mediafire.com/?naoloa8um1xfs0m
GRACIAS POR TU AYUDA,COMO ME DIJISTE HE PUESTO TU LIBRERIA ,PERO SIN BORRAR LA LIQUID QUE VIENE ,Y HE CAMBIADO A 0X27 Y FUNCIONANDO OK
Hola perpiunico!!
Me alegro de que te haya funcionado, ahora a seguir dándole caña al arduino!! Un saludo!!
Hola, me gustaría saber si alguien me puede pasar el esquema de estos circuitos, para saber que diferencia hay entre ellos y si esto puede influir en las librerias a usar.


Lo digo porque en uno parece que hay 3 resistencias mas que en el otro.
Hola magl!! He estado buscando algún esquemático de esas placas que comentas pero la verdad es que no he encontrado casi nada de información sobre ellos. Puedes pasarte por el post que hice de un adaptador I2C para pantalla lcd y donde puedes ver el esquema de conexión que uso para hacer el adaptador I2C (decirte que funciona perfectamente). Te pongo el enlace: https://tallerarduino.com/2013/12/19/convertir-una-pantalla-lcd-a-i2c-con-el-chip-pcf8574/
Un saludo!!
Hola,me podriais pasar un ejemplo para activar o desactivar luz lcd en i2c.Necesitaria tener apagado la pantalla lcd durante un par de horas para ahorrar.Gracias
He caído aquí como quien no quiere la cosa. Me ocurría lo de las dos líneas en Blanco en un LCD20x4, y sí es cambiando la dirección x20 por x27 y resuelto. Lo he testeado en un Nano y los pines por si alguien los necesita son
SDA A4
SCL A5
Eres un semidiós del Arduíno Grácias. Ah y con el sensor DHT11 también muchas gracias ahora a unir un poco elementos.
Hola Momelius! Me alegro de que te haya servido de ayuda esta entrada, estos meses ando muy liado y no tengo tiempo para practicar mucho con el Arduino y menos poder dedicarle tiempo al blog tanto como me gustaría.
Un saludo y espero que te sirva para realizar tus proyectos, te recomendaría emplear el sensor DHT22 en lugar del DHT11.
Hola Carlos Perpiñan!!
Es muy sencillo:
lcd.backlight(); —> Con esta función se activa la luz de fondo de la pantalla LCD
lcd.noBacklight(); —> Con esta función se desactiva la luz de fondo de la pantalla LCD
Un saludo!!
Que tal? tengo un lcd de 16×4 i2c pero no lo puedo lograr que funcione ya le instale las librerías pero aun así no funciona si me podrías ayudar
Hola, tengo una duda, en la Leonardo ya incorpora SDA y SCL, ¿debo cargar también ambas entradas con 2 resistencias PULL-UP de 10Kb? quiero conectarlo a una lcd con el interface i2c 8574 la lcd son 16×2-
Gracias.
estimado, el link me genera error, tendras la libreria en otro link para descargar??
Hola me llamo Tomas y he probado esto en mi arduino y no va da fallo al compilarlo, puede ser por la nueva version de arduino? yo tengo el 1.0.6
Este es el fallo:
invalid conversion from ‘int’ to ‘t_backlighPol’
HelloWorld:7: error: invalid conversion from ‘int’ to ‘t_backlighPol’
HelloWorld:7: error: initializing argument 3 of ‘LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)’
C:\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h: In function ‘void setup()’:
C:\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:154: error: ‘int LiquidCrystal_I2C::init()’ is private
HelloWorld:11: error: within this context
C:\Arduino\libraries\LiquidCrystal_I2C/LiquidCrystal_I2C.h:154: error: ‘int LiquidCrystal_I2C::init()’ is private
HelloWorld:12: error: within this context
Alguien me puede ayudar, muchas gracias.