bclose

Displays LCD

Usando displays de texto LCD 16x2 con Arduino

Objetivos

 

 

    • Vamos a montar un display LCD de 16×2.
    • Veremos cómo enviar información
    • Definiremos algunos caracteres especiales
 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.

Protoboard

Una Protoboard.

conexiones

Cables  de protoboard

Pot

Un Potenciómetro.

Display LCD

Un display LCD, de 16×2 o 16×4.

tienda online prometec

Los displays LCD

 

Los displays LEDs de 7 segmentos, que vimos en las sesiones anteriores, están muy bien, son baratos y prácticos, pero tienen el inconveniente de que no pueden mostrar mensajes de texto, sino solo números.

Se echa de menos algún sistema para mostrar mensajes de texto sencillos, y por eso se comercializan los displays LCD. Son faciles de encontrar en diversos formatos :  16×2 (16 caracteres x 2 líneas) o LCD 16×4 (16 caracteres x4 lunes).

 
  • LCD viene del inglés Liquid Crystal Display, o sea Pantalla de cristal liquido.
 

Son una opción muy sencilla de usar, y además, dan un toque muy pro a vuestros proyectos, y por eso, en los últimos años los displays LCD han ganado mucha aceptación en productos comerciales de todo tipo.

Básicamente porque:

 
  • Son baratos.
  • Están disponibles en varios tamaños y configuraciones.
  • Son de bajo consumo.
  • Muy prácticos si te basta con mostrar solo texto (y algunos caracteres especiales).
 

En esta sesión  veremos cómo conectarlos a vuestros Duinos y cómo usarlos para sacar mensajes al exterior.

 

Antes de empezar

 

Aunque, últimamente, estos displays suelen venir con los pines soldados, todavía hay muchos sitios que cuando compras uno de estos, te lo envían en kit, con los pines aparte para que los sueldes

 
  • En algún momento tendremos que hablar de cómo soldar componentes, pero ese día, aún no ha llegado.
 
detalle LCD 16x2

 

Lo primero que tienes que saber, es que tienes que soldarlos, y que no vale sujetar los pines de algún modo más o menos extravagante. Los sueldas y punto. Hazte a la idea. Cualquier otra solución acabara funcionando mal, o directoramente con el display quemado.

Cuando lo tengas listo, pincha el display en la protoboard, dejando sitio para el resto de componentes y cables, recuerda que habrá muchos, así que se generoso con el espacio que dejas.

 

Diagrama de conexión

 

Aquí teneis el esquema de conexión:

Panel LCD 16x2

Y este es el esquema para potoboard:

Protoboard Panel LCD 16x2

La conexión no es complicada, pero requiere ser cuidadoso. Asi que vamos a ir paso a paso con los diferentes cables. Empieza conectando tensión y GND a la protoboard.

Paso 1

Vamos ahora a a conectar la alimentación el panel LCD. Conecta el pin16 del LCD a Ground y el 15 a 5V

Paso 2

Si conectas ahora el cable USB a tu Duino, el LCD debería iluminarse, si no, revisa tus cables antes de seguir.

Vamos a conectar ahora, el potenciómetro de ajuste. Para ello conecta uno de los extremos del pot a GND y el otro a 5V. El centro al pin 3 del LCD.

Aprovechemos también para dar tensión al panel LCD, El pin 1 va a GND y el 2 a tensión:

Paso 3

Si todo ha ido bien, ya podemos encender el dispay y probarlo. Conecta el USB a tu Arduino y veamos. Si vas girando el potenciómetro, en algún momento tienes que ver unos cuadraditos en la pantalla, en caso contrario revisa las conexiones. No sigas, si no ves esto.

Img_33_6

Si ya veis las matrices de puntos en la pantalla, podemos seguir.

Vamos a conectar ya los pines de datos y control. Sin entrar en muchos detallas, no vamos a usar todos los pines disponibles, porque no los necesitamos. Solo usaremos dos pines de control, RS y EN y los 4 pines de datos D7, D6, D5, y D4 . No necesitamos mas por ahora.

Vamos con las conexiones de control del display:

RW, LCD pin 5             GND
RS, LCD pin 4             Arduino pin 7
EN, LCD pin 6             Arduino pin 8

Y ya solo nos quedan los 4 cables de datos.

DB7, LCD pin 14          Arduino pin 12
DB6, LCD pin 13          Arduino pin 11
DB5, LCD pin 12          Arduino pin 10
DB4, LCD pin 11          Arduino pin  9
Paso 4

 

El programa de control

 

Vamos a usar una librería de control del panel LCD, que viene incluida en nuestro Arduino. Pinchad en:

\\Programa\Importar Libreria\LiquidCrystal

Y ahora podemos importar uno de los ejemplos o escribir el nuestro, comentando el código.Lo primero es que al importar la librería nos ha escrito esto:

#include <LiquidCrystal.h>

Despues, hay que inicializar la librería. Creamos una instancia llamada lcd, de la clase LiquidCrystal y le pasamos como parámetros los pines que hemos usado:

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //    ( RS, EN, d4, d5, d6, d7)
 
  • Tened cuidado porque los pines que hemos usado, no corresponden a los ejemplos de Arduino, así que podéis cargarlos, peroaseguraros de cambiar la línea de definición de los pines, o no correrán.
 

El resto es sencillo

void setup()  
   {
       lcd.begin(16, 2); // Fijar el numero de caracteres y de filas
       lcd.print("Prometec.net"); // Enviar el mensaje
   }

void loop() 
   {
       lcd.setCursor(0, 8);  // set the cursor to column 0, line 1
       lcd.print(millis() / 1000);  // print the number of seconds since reset:
   }
 
  • Cuidado: Como siempre la primera linea, la superior, es la linea 0 y la segunda la linea 1.
 

Estos display son muy pesados de cablear, pero muy sencillos de utilizar.

Vamos a probar sacando un reloj (muy sencillo de momento). Si recordáis las funciones que usamos en las ultimas sesiones, podemos recuperar alguna para presentar el valor de millis() como un reloj

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() 
   {
       lcd.begin(16, 2);           // Fijamos el numero de caracteres y filas
       lcd.print("Prometec.net");  // Aqi va el mensaje
   }

void loop()
   {
       lcd.setCursor(6, 1);    // Ponte en la line 1, posicion 6
       String s = reloj() ;
       lcd.print(s) ;
   }
String reloj()
   {
       int n = millis() / 1000 ;       // Lo pasamos a segundos
       int segundos = n % 60  ;
       int minutos =  n / 60  ;

       String S = String(minutos) + ":" + String(segundos);
       return (S);
   }

Merece la pena, comentar algunas cosas de este código. En primer lugar en la función reloj, calculamos los minutos y segundos a partir del reloj interno de Arduino en milisegundos, no hay nada nuevo en esto. Pero fijaros que hemos definido reloj como String:

String reloj()

Eso significa que vamos a devolver un parámetro tipo String a quien nos haya llamado. En algún punto de la función habrá que hacer un return( String).

Fijaros que definimos dentro de la función un string llamado s:

String S = String(minutos) + ":" + String(segundos);

En esta línea no hay que confundir (aunque se escriben exactamente igual), el tipo String para definir S, con la función String(n) que convierte un numero n en un string de texto para que pueda mezclar el número de los minutos y los segundos separados por un símbolo de “:”.

Al final le añadimos un par de espacios en blanco, para evitar arrastrar fantasmas en la pantalla

 
  • Quita los espacios y miro lo que pasa en el cambio de minuto. ¿Cómo lo arreglarías, sin el truco de poner esos espacios al final? Piensalo.
 

En la función loop, hemos usado

lcd.print(s) ;

Para sacar el mensaje de texto. Todo lo que ya sabéis de Serial.print() se usa exactamente igual con esta instrucción. Y por último, tenemos una línea como esta:

lcd.setCursor(6, 1);    // Ponte en la line 1, posicion 6

Que lo que hace es posicionar el cursor del panel, en la posición 6 de la segunda línea, para escribir la hora centrada. Aquí os dejo un mini video con el resultado.

La librería LCD, viene con varios ejemplos muy interesantes, que os conviene probar. Recordad, simplemente, que tenéis que cambiar las definiciones de los pines para que corran.

Un ejemplo particularmente interesante, es el de CustomCharacter, en el que define una serie de símbolos especiales y los mueve por la pantalla en función de los valores que lee de un potenciómetro.

Sin llegar a tanta sofisticación, es muy interesante que veamos cómo definir algunos caracteres especiales, porque en la tabla base del LCD, no están incluidas ñ, acentos, grados, o €. Así que dependiendo del uso que le deis pude seros de interés saber cómo definir tus propios símbolos.

 

Definiendo tus propios caracteres

 

Vamos a definir un carácter propio, para digamos, el símbolo de grados centígrados,  por ejemplo.

Lo primero que tenéis que saber, es que los caracteres se definen con un array ( si, de nuevo) de 8×8, como si los dibujarais en una cuadricula de ese tamaño, y rellenando el cuadradito completo.

Así por ejemplo para el símbolo del grado seria:

Definiendo simbolos en un LCD
byte grado[8] =
 {
    0b00001100,     // Los definimos como binarios 0bxxxxxxx
    0b00010010,
    0b00010010,
    0b00001100,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
 };

Para montar los caracteres definidos usamos:

lcd.createChar(0, euro);
lcd.createChar(1, grado);

Y ahora ya estan disponibles. Tened en cuenta que solo podemos definir 8 caracteres especiales en un momento dado ( Aunque podemos definir 30 arrays, de caracteres y crearlos y matarlos sobre la marcha).

Aqui tenemos un ejemplo del programa:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

byte grado[8] =
 {
 0b00001100,
 0b00010010,
 0b00010010,
 0b00001100,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000
 };

void setup() 
  {
      lcd.begin(16, 2); // Hay que inicializar el LCD
      lcd.createChar(1, grado);
      lcd.setCursor(0, 0); 
      lcd.print("Estamos a 25");
      lcd.write(1); 
  }
void loop() 
 {
 }

Y aqui teneis una foto del resultado

Grados

Por último, y para cerrar ya la sesión (Todo llega en la vida), Deciros que de nuevo, hemos montado este display a la brava, conectando un buen número de cables.

Esto solo se puede justificar, porque en su día piqué y me compre un display de estos ( en realidad, dos. Tengo otro de 16×4), pero si vais a compraros un LCD, por Dios, compraros uno que sea I2C o algo así, vuestra salud mental mejorará mucho y solo usa 4 cables.

En la próxima sesión montaremos uno para que veáis la diferencia.

 

 

Resumen de la sesión

 

 

    • Hemos visto los displays LCD de 16 caracteresy 2 líneas.
      • Lo suficiente como para comprender, que como ejercicio está bien, pero veremos otras maneras de incluir estos displays, menos trabajosas.
    • Existen también, displays de 16 caracteres y 4 líneas, si necesitáis mas espacio en pantalla.
    • Son muy comodos de manejar porque podemos imprimir directamente, como si fuera una puerta serie.
    • Podemos ( y tendremos que hacerlo, seguro) definir caracteres y símbolos no incluidos en el display.
 

 

 

(116) Comments

    • Pacoduran

    Buenas noches. Muchas gracias por el completo tutorial.
    Como no suelo disponer de todos los componentes físicos, para seguir los tutoriales y practicar, uso un simulador online (circuit.io, que ahora está dentro de tinkercad). Al hacer el montaje, y simular, la pantalla LCD siempre se me rompía (virtualmente). El simulador me decía que circulaba una corriente elevada.
    He descubierto que poniendo una resitencia de 220 ohmios entre el pin 15 del LCD y los 5V de Arduino me funciona.
    La pregunta es ¿por qué en el tutorial de esta página no se usa? (es más, en otros tutoriales que he visto del uso y cableado de LCD con Arduino tampoco la he visto, siempre había visto uniendo directamente pin 15 del LCD al pin de 5V de Arduino).
    ¿Es recomendable ponerla cuando haga el montaje físico?

    Gracias por su respuesta

    • Hola Paco, No he utilizado nunca esa resistencia y no he tenido problemas con ello, pero si ves que lo recomiendan es buena politica seguir las instrucciones del fabricante

  • hola muy execelente ese proyecto la verdad es que me encuentro realizando un proyecto con arduino y display 16×2 se trata como realizar un contador el cual llegue a 60s y comienze 1m como lo muestra usted en el video anterior quisiera pedirle el favor de que me colaborara ayudandome como hacer ese contador.
    le agradesco que me ayudara

    • EDUARDO

    Hola buenas tardes, hemos conectado el circuito y el código corre excelente. Mi duda es, como le podría añadir para que marque también la hora, ya que únicamente marca minutos y segundos. Saludos cordiales!

    • Hola Eduardo, tendrías que dividir los segundos entre 3600, que son los que tiene una hora. Y el resto que te dé la división entre 60 para los minutos. De todas formas aquí tenemos una sesión en la que usamos un RTC para mostrar la hora en uno de estos displays. UN saludo.

  • Hola,
    Ante todo gracias por tus tutoriales,
    Tengo un problema con un lcd 1602 .Estaba conectándolo a un arduino uno r3 y se encendía la luz pero nada más. Encontré tu tutorial ,segui los pasos y cuando llegue al punto donde dices que no sigamos adelante si no se ven los cuadraditos de puntos ,Como no se veían cargue otro sketch y me di cuenta que al arduino le pasaba algo, la pestaña del puerto estaba en gris
    Tengo otro arduino he vuelto ha llegar al punto donde no se ven los cuadrados de puntos .¿Estará la pantalla estropeada?
    ¿Hay alguna manera de comprobarla sin estropear el arduino?.

    Saludos

    • Podría ser, pero comprueba primero a mover el potenciómetro de la pantalla para ajustar el contraste. Un saludo.

      • Hola Ivan ,
        Gracias por tu mensaje . Cuando te refieres al potenciometro de la pantalla te refieres ¿al que va conectado al pin 3 del Arduino? porque no veo ninguno en la pantalla. Si es lo anterior ya probé girarlo sin resultado.
        Saludos

        • Hola Matías, pues sí a ese me refería. Si no ves nada girándolo revisa bien las conexiones porque deberías ver lso recuadros negros en la pantalla.

  • buenas tengo una pregunta es que tengo todo conectado y me prende la lcd 16*2 me hace el cambio de contraste y salen los cuadros negros pero le subo el programa para que me aparezca lo que me da el sensor de temperatura lm35 y no me aparece nada siguen los cuadros negros entonces quisiera si alguien sabe y me puede ayudar

    • Hola Juan José, asegurate de que tengas bien puesta la dirección I2C de tu pantalla en el programa. Recuerda que en la sesión hay un programa que sirve precisamente para ver que dirección tiene. Un saludo.

  • Hola, he realizado las conexiones, las he revisado muchas veces pero la pantalla se mantiene encendida pero no aparece nada aunque mueva el potenciómetro

    • Hola Miguel,
      Mi primera recomendacion seria que revises el cableado otra vez y luego el soft y si a pesar de todo no funciona, recuerda que a veces las cosas se estropean o son defectuosas. Suerte

    • Larraitz

    Hola! al hacer la inicialización de mi LCD, en el comando 0b00111000 (function set, 8 bits, 2 lineas) se me pone toda la pantalla con cuadrados negros, sabes qué puede pasar? Un saludo

    • Hola Larraitz, lo primero que te diría es que compres siempre displays LCD que sean I2C, que son muchísimo más sencillo de cablear y de usar. Puede ser que tengas que bajar el contraste de la pantalla, y si no revisa bien que esté todo bien cableado. Un saludo.

  • Hola y para poner dos mensajes en la pantalla que operen con dos interruptores, ejemplo al activar un interruptor quiero el mensaje uno pero al activar el interruptor dos que me aparezca el mensaje dos

  • Saludos
    Espero estén bien y me puedan brindar una mano para poder resolver mi problema, estoy trabajando con un arduino uno R3 y una lcd 16×2 la cual es la lcd-00255; mi problema es este configuro el arduino, coloco los pines de la lcd en los pines digitales del arduino, compruebo la configuracion y no me da ningun error, al momento de que la conecto con el pc en vez de palabras me salen letras y comas por toda la pantalla.
    Alguno (a) sabe de casualidad que puede ser y me pueda dar un poco de soporte…?
    Seria de gran ayuda.!
    Saludos desde Costa Rica

    • Hola Patrick, tiene toda la pinta que puede ser algún problema en las conexiones. Repásalas con cuidado a ver si se arregla. Un saludo.

  • En circuits.io me sale que la electricidad es mayor de lo soportado y sale como una explosión en el lcd, la programación es la segunda y el cableado es idéntico
    ¿Cómo lo arreglo?

    • Hola Pablos, no he usado ese programa pero desde luego que al montar así el display no nos ha explotado ninguno. Yo revisaría las conexiones por si acaso. Un saludo.

    • Noi

    Hola e conectado todo, conectado mi arduino y la pantalla funciona, cuanodo muevo el potenciometro no pasa nada en la patanlla, luego cargo el codigo y todo bien no lanza errores, pero en la pantalla sigue sin aparecer nada :S

    • Hola, sólo con conectar la alimentación de la pantalla deberías ver cuadrados negros en ella al ajustar el contraste muy fuerte. Si

    • Carga el programa para que muestre algo y ahora gira el pot. SI no se ve nada aun, hay varios posibilidades
      1 – Malas conexiones
      2 – Proble con el display ( 10%)

    • Ezequiel

    Hola! Los terminales DB0 a DB3 por qué no están conectados? Qué uso tienen?

    • Hola Ezequiel, son bits de datos que la librería no utiliza ya que usa 4 bits, del 4 al 7. Un saludo.

    • Hola Ezequiel,

      Creo recordar que comentamos por algun sitio del tutorial que estos displays se pueden enviar datos con 4 o con 8 hilos, y naturalmente lo segundo es mas comodo para no liar demasiado el montaje, y es lo que hacemos en este tuto

    • Martín

    Hola!!, hice el tutorial, mi pantalla lcd quedó funcionando, pero me surge un conflicto al iniciar el puerto serial, luego de iniciar la comunicación serial en el código/compilar y cargar al arduino, la lcd deja de funcionar y por puerto serial envía ni recibe. he buscado en internet y a alguien dice que es la librería. el punto es que con la que se sugiere la pantalla no funciona xD. A alguien le habrá pasado lo mismo?. saludos!

      • Martín

      Se solucionó cargando la librería “Adafruit_LiquidCrystal.h”!!!. espero a alguien le sirva. saludos

  • En verdad gracias por tanta información y tomarte la molestia de contestar y seguir poyando… yo utilice un circuito de tacometro que posteaste, saludos…

    • Juan cruz Perez

    Hola, necesito escribir en una fila sola del lcd y que este mensaje se deslice. Podrías ayudarme?

    • Hola Juan Cruz,

      No me he revisado la libreria para buscar una funcion que haga el desplazamiento del mensaje (Que bien podria existir) pero si no, bastaria con escribir una funcion que

      borra el display
      imprime el tecto en el caracter 0
      incrementa la posicion
      imprime el texto en la posicion 1
      ……..

  • Hola me aparece el error de que necesito la libreria SPI o algo asi, pero no veo que tu la incluyas

    • Hola Hector, estás usando el programa de la sesión? El SPI es un protocolo de comunicación que no estamos usando en esta sesión, así que no haría falta incluirla. O es que estás usando un display SPI? Saludos.

    • Carlos Garcia

    Como podria unir 2 programaciones para un solo LCD de 16×2 una programacion es un un sensor de temperaturaLM35 y la otra de un Ultrasonico ya tengo las programaciones por separado pero no sé unirlas y la cosa es que no sé si me haga falta espacio en el arduino , necesito ayuda porfavor :C

    • carlos, normalmemte unir los dos programas puede ser tan sencillo como,unir los,dos setup y luego los dos loop. pruebalo y si no va publica en el foro tu problema y veras comomentre todos tenayudaremos

Give a Reply

WordPress Anti-Spam by WP-SpamShield