Pantalla LCD por comunicación I2C para Arduino

Por lo general las pantallas LCD para Arduino suelen necesitar bastantes pines digitales para funcionar, de 6 a 13 según la pantalla, y eso hace que nuestro Arduino se quede sin pines para conectar otras cosas.

Pero eso tiene fácil solución, simplemente hace falta usar un modulo que convierta la conexión en paralelo de la pantalla a conexión en serie mediante alguno de los protocolos de comunicación que soporta Arduino.

En cuanto a los módulos podemos encontrarlos con conexión ISP, Serial e I2C, siendo este ultimo el mas común de todos y del que trata esta entrada.

El modulo solo tiene 4 cables que se corresponden a GND, 5V, SDA y SCL. Para conectarlo a la placa Arduino tendremos que enterarnos dónde están los pines SDA y SCL del protocolo I2C ya que varia según la placa y revisión. Recomiendo consultar esa información en los esquemas que he publicado recientemente.

Aparte de lo hablado hasta ahora, también es necesario una librería especifica para el protocolo usado ya que la que viene de serie con el IDE solo funciona conectando la pantalla directamente.

Hay bastantes disponibles, aunque pocas me han funcionado hasta que encontré la que adjunto a continuación, que permite especificar la funcionalidad de cada pin entre el LCD y el modulo.

 

Como de costumbre adjunto un par de ejemplos extra aparte de los incluidos con la librería.

El primer ejemplo imprime cuantos segundos lleva encendida la placa, un par de apuntes:

Dentro del setup se imprime la primera linea que contiene el texto «Tiempo», se hace dentro del setup para que se imprima solo una vez ya que ese código solo se ejecuta al arrancar el Arduino.

Luego dentro del loop se imprime en la segunda linea el tiempo que lleva encendida la placa, sin embargo como el código se ejecuta muchísimas veces por segundo es necesario hacer un control en la impresión para evitar parpadeos, en este caso solo se imprime la información 1 vez por segundo. También se podría haber puesto un delay(1000) pero eso pararía todo el programa y no nos interesa.

El segundo ejemplo requiere de un modulo de reloj RTC, lo que hace es mostrar por pantalla la hora, tiempo que lleva encendida la placa, la fecha, y la temperatura leída del reloj. 

Y este segundo ejemplo es muy mejorable, porque se utiliza el método clear() para borrar la pantalla y eso crea un mini parpadeo cada vez que se actualiza la información, si esa información se actualizara cada mucho tiempo no importa, pero al actualizarse cada 1 segundo hace que sea bastante molesto.

Ademas hay datos que realmente no es necesario imprimir cada segundo como el contador de minutos que solo debería de actualizarse cada minuto, la fecha que debería de actualizarse solo una vez al día, o la temperatura que debería de cambiar solo cuando haya cambiado…

54 comentarios en “Pantalla LCD por comunicación I2C para Arduino”

  1. Hola!
    Tengo el problema que comentas, si el tiempo de actualizacion es muy rapido el parpadeo hace incomoda la lectura, que se te ocurre para mejorar esto.

    Gracias

    1. Hola,

      Tienes que actualizar la pantalla solo cuando sea necesario, si te fijas en el segundo ejemplo solo actualiza la pantalla una vez por segundo, para ello obtiene el tiempo que lleva encendida la placa y lo compara con el tiempo de la ultima actualización, dependiendo del resultado se actualiza o no los datos.

      Sin embargo como digo se actualiza toda la pantalla de golpe y el parpadeo, producido por el método clear(), sigue ejecutándose 1 vez cada segundo.

      – Si actualizas la pantalla cada 1 minuto ya no sera tan molesto…
      – O si en vez de borrar la pantalla simplemente escribes los datos nuevos sobre los viejos, así tampoco se producirá ese parpadeo.

      También puedes probar a crearte una función que borre todos los caracteres de la pantalla sustituyéndolos por espacios, quizás así sea mas limpia la actualización.

      Saludos.

    1. No, es un plugin para WordPress llamado Crayon Syntax Highlighter, se encarga de leer el código desde un fichero y mostrar su contenido con los colores correspondientes a su lenguaje de programación. También permite colorear el código sin necesidad de leerlo de un fichero, es decir, directamente pegado en la entrada, aunque es mejor hacerlo desde fichero porque es imposible que se altere con la edición de la entrada o las actualizaciones de WordPress.

  2. Hola Giltesa. Gracias a tu forma de refrescar el LCD, pude solucionar el mío, ya que yo refrescaba cada segundo con espacios en blanco, no con «clear» y el parpadeo era evidente y molesto. Ahora refresco con millis() y lcd.clear() cada 10000 ms y se ha mejorado el pequeño proyecto.

    Gracias y saludos.

  3. Lo he probado todo varias versiones de librerias los ejemplos q traen tu codigo y no hay manera no sale texto es como si no comunicara con la lcd no es capaz de apagar la luz de la pantalla siquiera todo funciona ok la luz esta encendida salen los cuadritos se regula con el pot el contraste ya no se q mas provar

    Lo estoy haciendo con un Leonardo segun el escaner bus I2C es 0x27 los pin estan conectados a SDA y SCL de arduino

    gracias de antemano

    1. Dependiendo de tu chip I2C deberás de configurar la librería con unos pines u otros, esta es la linea que puede variar:

      Mira la documentación de la librería, creo recordar que vienen varias configuraciones de ejemplo para probar.
      Saludos.

    1. Hola,
      No habrás añadido la librería que hace falta.
      El motivo del error sale en el cuadro de resultado de la compilación, soluciona lo que te ponga ahí y te funcionará.

      Saludos.

  4. Muy buenas:

    Como tantos otros me he metido en esto del Arduino… y a ratos me pregunto si sabre salir…

    Por algún motivo que desconozco no consigo hacer funcionar la libreria del I2C:

    Este es el mensaje que me pone

    «C:\Users\Eduardo\Documents\Arduino\libraries\LiquidCrystal_I2C\I2CIO.cpp:35:26: fatal error: ../Wire/Wire.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compilación en tarjeta Arduino/Genuino Mega or Mega 2560.
    Libreria invalidad encontrada en C:\Users\Eduardo\Documents\Arduino\libraries\docs: C:\Users\Eduardo\Documents\Arduino\libraries\docs»

    He probado todo lo que se me ha ocurrido, pero debo ser poco ocurrente.
    Puede ser que desistalando el IDE de arduino y volviendolo a instalar se solucionase?

    Si pudieras darme luz en esto te lo agradeceria, porque no tengo ni idea de lo que hago mal.

    Muchas gracias

    1. Hola Eduardo,

      Prueba a mover la librería del directorio donde la tienes ahora al directorio libraries en la carpeta de instalación del IDE de Arduino.

      Saludos

    2. Muy buenas de nuevo:

      Gracias por tu pronta respuesta.

      No me dio la solución pero si animo…

      Por alguna causa que no comprendo algunas librerías no las cargo bien.

      Por fin me di cuenta de que cuando cambia el color del nombre de la librería es que lo reconoce.

      Localice una librería que si que funcionaba.

      Al volcarlo en el Arduino no hacia nada…

      Me acorde de que había leído algo sobre direcciones I2C

      Le pase un programa a mi LCD china y vi que su dirección era 0x3F… y no la que yo estaba usando…

      Para entonces ya no sabia ni que libreria me chutaba ni nada… (mala cabeza)

      Ahora ya casi le tengo cogido el tranquillo….

      Por cierto que la libreria que uso ahora, al descomprimirse no genera correctamente el nombre de la carpeta, y no la reconoce el IDE, menos mal que lo ponia en las instrucciones y las he leido… 😉

      Muchas gracias y he puesto todo este rollo por si le vale a alguien…

  5. Buenas Noches.

    Lo primero agradecerte unos tutoriales que realmente son de gran ayuda. Y despues las consultas:

    1.- He visto que has creado la libreria RTC.h y me sorprende que no la utilizaras en el segundo ejemplo. Por qué?. Que diferencia tiene con la que usas (gRTC.h).

    2.- No conozco bien la libreria LCD. Podrias explicarme que reprentan los parametros de esta instrucción:
    LiquidCrystal_I2C lcd( 0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE );
    El primero está claro que es la dirección, pero que son los siguientes?, son siempre los mismos?. Y POSITIVE a que se refiere?.

    3.- La función lcd.backlight() permite encender y apagar la iluminación de fondo del LCD?. y como se apagaría?

    Agradezco de antemano tu ayuda.
    Un saludo

    1. Hola JMCN,

      Hace unos años la librería se llamaba gRTC porque usaba también otras librerías y si hubieran tenido el mismo nombre dan erró en el IDE por no saber cuál abrir. Finalmente la deje en RTC porque ahora la mía es la única que uso.

      De cabeza no recuerdo para qué era cada parámetro pero en conjunto sirven para configurar la comunicación que tiene que tener el chip I2C y la pantalla. En los comentarios del método dentro de la librería tienes información de cada parámetro.

      Dentro de la librería tienes información sobre qué hace el método. Apaga/enciende la luz, no puede apagar la pantalla ni regular el contraste.

      Saludos

    1. La librería tiene un método que permite encender o apagar la iluminación:

    1. Eso suena muy raro, normalmente el problema es no poderse comunicar con el modulo de la pantalla por estar usando una dirección errónea… pero eso de que te funcione pero solo lo haga con el primer carácter de cada linea, es muy raro. El código es el mismo que el de esta entrada, indicaste correctamente la longitud de caracteres de las lineas? En el ejemplo esta como 2 lineas de 16 caracteres cada una:

      lcd.begin(16,2);

      Saludos.

    2. En otro proyecto me funciona bien. Creo que es una combinacion ide/libreria. Lo he solucionado con la ultima libreria de liquidcrystal completa y eliminando las demas librerias similares, y ya va ok. Gracias por la respuesta! ( encontre el mismo problema descrito en un par de foros).

  6. Hola amigo… tengo un problema, que no logro solucionar, y es que mi pantalla no despliega nada. Estoy haciendo uso de un Arduino Uno, por lo que SDL se encuentra en el pin Analógico 4 y SCL en el Analógico 5. Me parece extraño porque el programa corrió sin ningún problema y se pudo quemar en el microcontrolador, pero la pantalla solo se queda azul (no es el contraste tampoco), ¿será que mi pantalla está defectuosa o puede ser algún detalle que estoy omitiendo?

  7. Muchísimas gracias amigo, me has salvado, solo tuve que sustituir el «0x27» por «0x3F» y listo.

    Saludos y gracias por el increíble aporte.

    1. GRACIAS GRACIAS GRACIAS YA ERA EL SEGUNDO DÍA QUE NO PODÍA HACER FUNCIONAR ESTE DISPLAY TAMBIEN CAMBIE POR 0X3F Y LISTO.
      BUENÍSIMO

  8. Hola , tengo el mismo problema que comenta eduardo un poco mas arriba (misma situacion , primeros pasos tambien) . Al verificar me da este error:
    «…Arduino\libraries\LiquidCrystal_I2C\I2CIO.cpp:35:26: fatal error: ../Wire/Wire.h: No such file or directory»

    Llevo toda la tarde intentando arreglarlo , distintas versiones de arduino y librerias i2c , con una y varias instaladas a la vez , todas las pruebas que se me han ocurrido pero nada . Como dato , la libreria del dht11 si funciona .

    Si alguien sabe donde esta la solucion.. 🙂

    Saludos

  9. Hola buenas tardes ..estoy en un proyecto donde junto la pantalla lcd con comunicación i2c y el rtc … pero tengo una falla se me paran corriendo los segundos he probado el rtc ds1307 y el rtc3231
    Me ayudas porfa

  10. Hola, no consigo hacer que haga nada, tengo un arduino uno r3 con un lcd 16×2 y un I2C, pero al enchufar el lcd solo se queda prendido. lo conecto a la A4 y A5… 🙁

    1. De todas formas, es mi segunda placa arduino uno y mi segundo lcd, la vez anterior lo intente con el lcd directo a la placa, pero tampoco hacia nada, solo se encendia el lcd y aunque le modificaba el contraste, igual no me mostraba nada, cargandole todas las librerias requeridas en los ejemplos, claro que las que trae por defecto el sw

    2. Tienes que sacar la dirección de memoria de la pantalla, para eso sirve el código que te puse. Una vez tengas la dirección debes ponerla en el código de ejemplo para la pantalla, con eso debería de funcionar.

      Si no lo hace puedes mirar si tu adaptador tiene jumpers smd para puentearlos y cambiar la dirección, así podrías poner otra y volver a probar. Asegurarte también de hacer las conexiones correctamente, SDA con SDA y SCL con SCL, según el modelo de Arduino cambian los pines que tienen ese protocolo de comunicación, asegúrate de conectar los cables en los pines correctos.

      Saludos.

    3. Excelente! funciono a la perfección, solo bastaba con cambiar la dirección por la 0x3F, muchas gracias, podré seguir aprendiendo….

  11. disculpa amigo pero en mi pantalla no logro ver nada solo me aparecen recuadros blancos, como si solamente estuviera alimentando la pantalla tengo la interfaz i2c, que crees q sea

    1. Hola,

      Ajusta el contraste del LCD que debes de tenerlo al máximo.
      Si no es eso entonces asegúrate que estas usando la dirección de memoria correcta para que el Arduino pueda acceder al LCD y comunicarse.

      Saludos.

    1. Hola,
      No he modificado la librería, mira en el código quién la ha hecho y revisa si hay actualizaciones para soportar el Due.

      Saludos.

  12. buenas tardes excelente tu post estoy tratando de correr el codigo pero me da un error que positive no esta declarado por favor espero la respuesta lo mas pronto posible gracias

  13. Buenas tardes, llevo unos días intentando hacer funcionar un encoder rotativo con las librerías que he ido encontrando por hay, en algunas me hace un doble salto, en otras hasta cuatro, lo curioso es que este ejemplo me ha funcionado correctamente, la librería principal que use es la Encoder, no se si la conocerás, en caso afirmativo, ¿sabrías decirme cual es el motivo de que me haga el salto y no vaya de uno a uno?

    1. Hola Miguel,
      A mi me paso lo mismo y llegue a la conclusión de que hay varios tipos de encoders y por eso no van con cualquier librería. Consulta esto para mas información.

      Saludos.

  14. Gracias por tu respuesta, ya había leído lo del enlace, y hay varias cosas que no entiendo. Te comento que el proyecto que tengo en mente va a utilizar 2 o 3 encoder y lo que busco es algo sencillo a la hora de utilizarlos, por eso lo de utilizar una librería para leerlo; había pensado en como pasar tu ejemplo a una librería, pero mis conocimientos de arduino son muy escasos y por eso estoy buscando una librería en la que funcione correctamente, se me olvidaba decirte que utilizo un arduino nano para ello.

    Un saludo ……… Miguel

Escriba aquí su comentario