Utilizar un Display LCD con Arduino

En este artículo aprenderás a utilizar un Display o mejor conocido como LCD con tu placa Arduino. Con esta pantalla podrás mostrar texto directamente en ella sin la necesidad de tener una computadora. Te será muy útil cuando quieras darle una mejor presentación a tus proyectos, ya que será un excelente medio de interacción con el usuario.

Materiales que necesitarás

Para los ejemplos que se implementarán en este artículo, se utilizarán los siguientes materiales:

  • Arduino UNO
  • Pantalla LCD de 16×2
  • Resistencia de 220 Ω
  • Resistencia de 4.7 KΩ
  • Potenciómetro de 10 KΩ
  • Sensor DS18B20
  • Cables para conexiones

¿Qué es un LCD?

Un LCD (siglas del inglés Liquid-Crystal Display) es una pantalla alfanumérica de cristal líquido. Esta pequeña pantalla está conformada por muchos píxeles, con los cuales al combinar cuales se encienden y cuales no, se pueden formar letras, números, símbolos, y prácticamente lo que tú quieras. Al estar compuesta por pequeños píxeles, la cantidad de energía necesaria para hacerla funcionar será muy pequeña, por lo que es bastante útil cuando en tu proyecto utilizas baterías, aunque más adelante hablaremos sobre esto.

El LCD 16×2

Los LCD se clasifican por su tamaño, y se mide en número de columnas por número de líneas. En nuestro caso utilizaremos el LCD1602 que es un LCD de 16 caracteres por 2 líneas, quiere decir que al mismo tiempo podremos mostrar 16 caracteres en la línea superior y 16 caracteres en la línea inferior.

Además del tamaño del espacio para desplegar la información, los LCD pueden variar en el color de la pantalla (que por lo regular son monocromáticos), pero la mayoría de ellos incluyen una luz de fondo o de contraste (Backlight) con la cual podremos mejorar la visibilidad de la información sobre todo en ambientes de baja iluminación. Por otro lado, el LCD incluye una manera de ajustar el contraste, con lo que la intensidad del texto desplegado se puede aumentar o disminuir.

LCD 16x2
LCD 16×2

Para poder controlar el flujo de la información hacia el LCD, todos tienen incluido un pequeño circuito integrado llamado controlador, el más común es el Hitachi HD44780. La comunicación realmente se hará a través de él; sin embargo, como en otros casos, utilizaremos una biblioteca para facilitar el manejo del controlador, no te preocupes.

Pines del LCD 16×2

Para poder controlar el LCD, se cuenta con distintos pines de conexión los cuales se muestran en la siguiente imagen.

Pines del LCD 16x2
Pines del LCD 16×2

La descripción de los pines es la siguiente:

  • VSS.- Terminal de tierra.
  • VDD.- Terminal de alimentación, típicamente es de 5 V, pero existen versiones de LCD para 3.3 V, siempre revisa cuál tienes.
  • Contraste (V0).- Terminal para ajustar el contraste, aquí conectaremos un potenciómetro para indicarle la cantidad de contraste, si no conectas este pin no podrás ver nada en tu LCD.
  • RS.- Terminal de control del LCD y sirve para seleccionar entre el modo de datos (HIGH) o instrucción (LOW). Un ejemplo de instrucción es limpiar o borrar la pantalla.
  • R/W.- Terminal para seleccionar el modo de lectura (HIGH) o escritura (LOW).
  • Enable.- Terminal para habilitar el LCD, y con esta le indicamos al controlador que la pantalla se active.
  • D0-D7.- Terminales para el envío de los datos. El LCD funciona con 8 bits de datos; sin embargo, podemos utilizar el LCD en el modo de 4 bits, por lo que solo utilizaremos los últimos cuatro (DB4-DB7).
  • BLA.- Terminal de ánodo (+) del LED utilizado como backlight. Se conecta directamente a 5 V para tener siempre encendida la luz de fondo. Recuerda que es un LED por lo tanto tiene que llevar su resistencia de unos 220Ω.
  • BLK.- Terminal de cátodo (-) del LED utilizado como backlight. Se conecta a la terminal de 0 V (GND).

Conexión del LCD con Arduino

Para conectar y controlar el LCD con la placa Arduino utilizaremos la conexión de 4 bits, utilizando los pines de datos D4 a D7 y los pines de control RS, R/W y Enable; todos ellos conectados a pines digitales de la placa Arduino. Como siempre utilizaremos el pin R/W como escritura, podemos ahorrarnos un pin conectando R/W directo a GND.

El diagrama de conexiones a utilizar en los ejemplos de este artículo se muestra a continuación.

Diagrama de conexiones del LCD con Arduino
Diagrama de conexiones del LCD con Arduino

Como te mencioné anteriormente, utilizaremos una biblioteca ya incluida en el IDE Arduino llamada LiquidCrystal.h.

Librería LiquidCrystal.h

Esta librería te permitirá controlar los LCD que estén basados en el controlador Hitachi HD44780 o similares, y puede trabajar en el modo de 4 u 8 bits. Para utilizarla, es necesario incluir en tu código la librería con #include <LiquidCrystal.h>

Algunas de las funciones más utilizadas de la librería se describen a continuación.

Primeramente debemos de crear un objeto del tipo LiquidCrystal indicando además cuáles serán los pines a utilizar, con el siguiente formato:

LiquidCrystal lcd(RS,Enable,D4,D5,D6,D7); para el caso de utilizar el formato de 4 bits con el R/W directo a GND.

LiquidCrystal lcd(RS,R/W,Enable,D4,D5,D6,D7); para el caso de utilizar el formato de 4 bits con el R/W conectado al Arduino.

LiquidCrystal lcd(RS,Enable,D0,D1,D2,D3,D4,D5,D6,D7); para el caso de utilizar el formato de 8 bits con el R/W conectado a GND.

LiquidCrystal lcd(RS,R/W,Enable,D0,D1,D2,D3,D4,D5,D6,D7); para el caso de utilizar el formato de 8 bits con el R/W conectado al Arduino.

En todos los casos anteriores, lcd representa el nombre del objeto, aquí puedes nombrar a tu objeto que representa al LCD como tú gustes, recuerda que siempre te recomiendo utilizar un nombre adecuado, para que no se te olvide 😉.

Para inicializar la interface con el LCD, dentro de la función setup agregamos la función lcd.begin(columnas,filas); en nuestro caso columnas es igual a 16 y filas es igual a 2.

Para borrar cualquier cosa que se esté mostrando en el LCD, se utiliza la función lcd.clear();

Para mover el cursor entre las distintas posibles posiciones del LCD, se utiliza la función lcd.setCursor(columnas,filas); tomando en cuenta que las posiciones son las siguientes:

Posiciones del LCD 16x2
Posiciones del LCD 16×2

Para escribir algo a partir de la posición del cursor, se utiliza la función lcd.print(dato);, donde dato puede ser del tipo char, byte, int, long o string, normalmente escribimos directamente el texto como string entre comillas (» «), por ejemplo: lcd.print("Hola");

Para encender o apagar el cursor (esa rayita que aparece debajo como guion bajo parpadeando _ ), se utilizan las funciones lcd.cursor(); o lcd.noCursor(); y para hacer que deje de parpadear o vuelva a parpadear se utilizan lcd.noBlink(); o lcd.blink();

¿Quieres saber que otras funciones puedes utilizar con la librería? Déjame un comentario.

LCD 16×2 con Arduino: Ejemplo Básico

Para utilizar el LCD con nuestra placa Arduino el código es realmente corto, solo necesitamos realizar las conexiones mostradas anteriormente, y ejecutar el siguiente código:

Si observas bien, el manejo del LCD es bastante simple, para utilizarlo es necesario indicarle los pines físicos donde se conectarán las señales de control y datos. En la función setup inicializamos el LCD indicándole el tamaño en columnas y filas. Una vez hecho esto, para utilizar el LCD solamente es necesario indicar las coordenadas para posicionar el cursor e imprimir el texto deseado.

Si todo te ha salido bien y tus conexiones están correctas, verás algo como esto:

Texto HOLA MUNDO en LCD
Texto HOLA MUNDO en LCD

Ejemplo: marquesina con LCD

Ahora para darle un poco más de complejidad, realizarás un programa para poder imprimir un mensaje y hacer como si se moviera, como si se desplazara por toda la pantalla, igual te sirve para anunciar algo, o poner un lindo mensaje, que sé yo…

Para hacer que le texto se «desplace» por la pantalla, existen distintas maneras de resolverlo. La librería trae implementadas varias funciones que podrían ayudarte a realizar esta acción; sin embargo, yo te mostraré la que a mi parecer es la más versátil.

El código a utilizar se muestra a continuación y trataré de describirlo por partes.

Se ha creado una variable del tipo String la cual representa una cadena de caracteres, o en otras palabras, es un tipo de variable para almacenar palabras. En este caso se inicializó como String texto = "Suscribete"; haciendo un poco a la alusión de que tenemos un canal de YouTube donde ponemos todos los videos que te encuentras en este blog, y tú sabes que si te suscribes serás el primero en enterarte cuando algo nuevo se publique, además de que me ayudas a que la comunidad crezca. Bueno después del breve comercial, con esta variable podremos trabajar y el contenido lo podrás sustituir de manera muy simple.

La parte del setup es la misma que en el ejemplo anterior, solamente inicializamos el LCD y escribimos un mensaje de bienvenida.

La primer parte del loop es para hacer que nuestro mensaje aparezca desde la izquierda y se despliegue hacia la derecha, iniciando desde la última letra del mensaje hasta la primera. El código es el siguiente:

El ciclo for nos permite realizar un bucle repetitivo, que en este caso necesitamos que se repita tantas veces como caracteres contenga el texto; es por esto que, el ciclo for inicia en 0, aumenta en 1 cada vez que se ejecuta, mientras que el índice i es menor o igual al tamaño del mensaje. Para conocer el tamaño del texto, utilizamos una función implementada para todas las variables del tipo String llamada length() y esta nos regresa el tamaño de la variable; es decir, la cantidad de caracteres que la componen. El ciclo lo que estará haciendo cada vez es, primero limpiar la pantalla, luego colocar el cursor en la coordenada 0,0 que es la primera de la izquierda, después imprimimos la última letra del texto. Para hacer esto más automático, utilizamos otra función llamada substring(desde,hasta); la cual realiza una extracción del contenido de la variable desde una posición hasta la otra. En este caso le estamos diciendo que nos extraiga desde la última posición (igual al tamaño) menos la cantidad de i, recuerda que i va aumentando cada vez, con esto cada repetición del ciclo, irá extrayendo más letras iniciando desde la última hacia la primera. Como no le estamos indicando hasta que posición extraer, la función extraerá desde la indicada hasta el final. Por lo que se irá imprimiendo, en este ejemplo:

  • e
  • te
  • ete
  • bete
  • ibete
  • ….
  • Suscribete

¿Creo que se entiende, no? Ahora haremos que el texto ya completo, se desplace hasta el extremo derecho. Para esto si utilizaremos una función de la librería llamada scrollDisplayRight(); como el nombre lo indica, realiza un desplazamiento hacia la derecha cada vez que se utiliza, tomando todo lo que tenga la pantalla y lo desplaza.

Esto lo metemos a otro ciclo for para que se realice la cantidad de veces que le faltan para llegar hasta el extremo derecho que ya sabemos que es la posición 16,0. Para esto el ciclo lo iniciamos desde 0 hasta 16-el tamaño del texto. Con esto se desplazará solamente las veces necesarias para que la última letra del mensaje se encuentre en la coordenada 16,0.

Ahora haremos el desplazamiento hacia la izquierda con la función scroll.DisplayLeft(); creo que esta no hace falta que explique para qué sirve. El código que realiza este movimiento es el siguiente.

Ahora el ciclo for lo iniciamos en 16- el tamaño del texto, mientras que i sea mayor o igual a 0, y con decrementos de uno en uno. Por lo que el mensaje ahora se desplazará hasta la coordenada 0,0.

Posteriormente, se repiten nuevamente los desplazamientos hacia la derecha y hacia la izquierda, para darle movimiento al texto 😁

Por último, estando el texto en la coordenada de origen (0,0), haremos el efecto de parpadear; es decir, aparecer y desaparecer el texto varias veces. El código es el siguiente.

Bastante simple, primero limpiamos la pantalla, un retardo, posicionamos el cursor en la coordenada 0,0, imprimimos el mensaje completo, una pausa, y luego esto se repite las veces elegidas. En mi caso lo dejé tres veces, por eso el ciclo for solo se ejecuta mientras el índice i sea menor que 3; en otras palabras, va de 0 a 2, tres veces.

Si quieres ver como queda, te invito a ver el video colocado al inicio de este artículo

Ejemplo: Mostrar la temperatura de un sensor en el LCD con Arduino

Que te parece si ahora hacemos algo más interesante. Tomaremos la lectura de un sensor de temperatura DS18B20 y la mostraremos en el LCD. Por lo que partiremos del capítulo donde aprendiste a conectar el sensor de temperatura.

Conexiones del sensor DS18B20 con LCD
Conexiones del sensor DS18B20 con LCD

Para este ejemplo utilizaremos el siguiente diagrama de conexiones:

Conectaremos el pin de datos del sensor de temperatura al pin 9 de la placa Arduino mediante su resistencia pull-up de 4.7 KΩ. El código para mostrar la temperatura en el LCD es el siguiente:

Configuramos todo lo relacionado al sensor con el pin 9. En la función loop simplemente tenemos que escribir el mensaje Temperatura y, una vez solicitadas las lecturas de la temperatura actual, imprimimos el contenido en la coordenada deseada, en este caso en la 12,0. Por último añadimos una pausa de unos cuantos segundos para realizar nuevamente todo el ciclo. No es necesario que revises la temperatura muchas veces cada minuto, pero para fines didácticos, yo agregué un retardo de 5 segundos.

Si todo salió bien, deberías ver algo como esto:

LCD mostrando la temperatura
LCD mostrando la temperatura

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Personalizar símbolos

Hasta esta parte, has podido imprimir en la pantalla distintos caracteres, que normalmente serán números o letras; pero, ¿qué se puede hacer si quieres insertar algún símbolo especial?

El LCD incluye 8 espacios de memoria para que nosotros podamos diseñar nuestros símbolos a nuestro antojo. Estos tienen que ser del mismo tamaño; es decir, de 5×8 píxeles. Cada símbolo está compuesto por un arreglo de 8 bytes, uno por cada línea. Los 5 bits menos significativos de cada byte determinan los píxeles de esa fila, algo así:

Tabla para generar caracteres personalizados
Tabla para generar caracteres personalizados

Donde puedes observar del lado izquierdo la representación gráfica, y del lado derecho su valor equivalente. Esta matriz tenemos que insertarla en el programa. Para facilitarlos la vida, utilizaremos una herramienta desarrollada por maxpromer y alojada en GitHub para acceder a ella solo has click en este enlace. Después de dibujar el símbolo, solo tenemos que copiar el código generado del lado derecho, solo necesitas el array.

Para ponerte el ejemplo, te muestro el código para dos símbolos que me he inventado… nada del otro mundo.

Para utilizarlos en el LCD, tenemos que declarar el arreglo de tipo Byte y darle un nombre. Yo he creado dos, uno llamado feliz y otro llamado omega.

En la función setup después o antes de inicializar el LCD, tenemos que utilizar la función createChar(índice,nombre); donde en índice le indicaremos el espacio en la memoria (de 0 a 7) donde se almacenará nuestro símbolo, y en nombre le indicaremos el nombre del array donde se encuentran los datos equivalentes. En este ejemplo utilizamos dos:

Para desplegarlos en la pantalla, solamente tenemos que posicionar el cursor en la coordenada deseada, y mediante la función write(); enviaremos el espacio de memoria donde lo guardamos; por ejemplo para imprimir la carita feliz lcd.write((byte)0); él (byte) es necesario indicárselo de manera explícita, ya que si le enviamos el 0 solamente, nos marcará un error, ya que sería como no enviarle nada… por eso tenemos que decirle que el 0 representa un byte.

Tendrías que ver algo como esto:

Desplegando caracteres personalizados
Desplegando caracteres personalizados

¿Qué te ha parecido este tutorial? Déjame tus comentarios, dudas, sugerencias o tus proyectos con LCD.

Muchas gracias por llegar hasta aquí.

Recuerda visitar nuestras redes sociales

Etiquetas:

Deja un comentario