11/05/2023
Las pantallas LCD (Liquid Crystal Display) son componentes fundamentales en el vasto universo de los proyectos con Arduino. Permiten una forma sencilla y efectiva de mostrar información al usuario, como texto, caracteres básicos y, en algunos casos, incluso gráficos sencillos. Son una herramienta indispensable tanto para principiantes que dan sus primeros pasos en la electrónica programable como para usuarios experimentados que buscan añadir una interfaz visual a sus complejos sistemas. De hecho, para muchos entusiastas, la conexión de una pantalla LCD es uno de los primeros desafíos emocionantes al explorar las capacidades de una placa Arduino.

Este artículo te guiará a través del proceso de conexión e interacción entre una pantalla LCD de caracteres 16x2 y una placa Arduino UNO, utilizando la comunicación serial. Aunque nos centraremos en un modelo específico y en interfaces concretas, los principios y técnicas que aprenderás son ampliamente aplicables a otros tipos de pantallas LCD y a diversas placas de desarrollo. ¡Comencemos este fascinante viaje hacia la visualización de datos con Arduino!
- ¿Por Qué Elegir una Pantalla LCD para tus Proyectos Arduino?
- Hardware y Herramientas Necesarias para tu Proyecto LCD
- Identificación de Pines del LCD 16x2
- Identificación de Pines de Arduino
- Circuito y Diagrama de Conexión para Comunicación SPI
- Ejemplos de Código Arduino - LCD Usando Interfaz SPI
- Circuito y Diagrama de Conexión para Comunicación RS232 TTL
- Ejemplo de Código Arduino - LCD "Hello World!" Usando Comunicación Serial RS232 TTL
- Solución de Problemas Comunes en Proyectos Arduino - LCD
- Preguntas Frecuentes (FAQ)
- Conclusión
¿Por Qué Elegir una Pantalla LCD para tus Proyectos Arduino?
Las pantallas LCD ofrecen una serie de ventajas que las hacen extremadamente populares en el ámbito del prototipado y desarrollo de proyectos electrónicos. Su capacidad para mostrar texto alfanumérico de manera clara las convierte en la opción ideal para:
- Visualizar lecturas de sensores (temperatura, humedad, presión).
- Mostrar mensajes de estado o depuración de programas.
- Construir interfaces de usuario sencillas para controlar dispositivos.
- Crear pequeños relojes, contadores o temporizadores.
- Desarrollar juegos simples basados en texto.
Su bajo consumo de energía y su relativa facilidad de integración, especialmente con módulos que simplifican el cableado, las convierten en una solución eficiente y económica.
Hardware y Herramientas Necesarias para tu Proyecto LCD
Las pantallas LCD vienen en diversas configuraciones y tamaños, pero la más utilizada y accesible para proyectos con Arduino es la LCD de caracteres 16x2. Esto significa que cuenta con dos filas, y cada fila puede mostrar hasta 16 caracteres. Para esta guía, nos basaremos en el display Newhaven 16x2 con número de parte NHD-0216K3Z-NSW-BBW-V3, que incorpora un microcontrolador PIC16F690. Este display es particularmente versátil, ya que soporta tres interfaces seriales: I2C, SPI y RS-232 (TTL). En este artículo, nos concentraremos en las interfaces SPI y RS-232, proporcionando ejemplos de cómo interactuar con ellas.
Es importante señalar que, para utilizar la interfaz SPI con este display específico, es necesario soldar una resistencia en la placa del display. Sin embargo, la interfaz RS-232 TTL no requiere esta soldadura adicional, lo que la convierte en una opción más sencilla si prefieres evitar el proceso de soldadura. Asegúrate de leer nuestro artículo sobre cómo proteger la electrónica de la ESD antes de sumergirte en este tutorial, especialmente si eres un principiante.
Lista de materiales:
- Pantalla LCD 16x2 (preferentemente NHD-0216K3Z-NSW-BBW-V3 o similar).
- Conector de pines de una hilera (si la pantalla no lo incluye).
- Placa Arduino UNO.
- Protoboard (placa de pruebas).
- Cables de puente (jumpers).
- Soldadura y soldador (opcional, para SPI).
- Cable USB A macho a B macho (cable de impresora).
- Arduino IDE (Entorno de Desarrollo Integrado).
- Resistencia de 0 ohmios (opcional, solo para comunicación SPI).
Identificación de Pines del LCD 16x2
El display de caracteres Newhaven 16x2 ofrece una manera sencilla de interactuar con la placa Arduino UNO utilizando comunicación serial. Los pines del puerto P1 están diseñados específicamente para la comunicación serial RS232 TTL, mientras que los pines del puerto P2 son para la comunicación serial I2C y SPI.
Descripción de Pines del Puerto P1 - Comunicación RS232 TTL:
| No. de Pin | Símbolo | Función | Descripción |
|---|---|---|---|
| 1 | RX | Entrada Serial RS-232 (TTL) | Pin de recepción de datos seriales. |
| 2 | VSS | Tierra | Conexión a tierra. |
| 3 | VDD | Voltaje de Suministro (+5.0V) | Pin de alimentación positiva. |
Descripción de Pines del Puerto P2 - Comunicación SPI e I2C:
| No. de Pin | Símbolo | Función | Descripción |
|---|---|---|---|
| 1 | SPISS | SPI Slave Select (NC en modo I2C) | Selección de esclavo SPI. |
| 2 | SDO | No Conectado | Pin no utilizado. |
| 3 | SCK/SCL | Reloj Serial | Señal de reloj para SPI/I2C. |
| 4 | SDI/SDA | Datos Seriales de Entrada (SPI) / Datos Seriales (I2C) | Pin de datos para SPI/I2C. |
| 5 | VSS | Tierra | Conexión a tierra. |
| 6 | VDD | Voltaje de Suministro (+5.0V) | Pin de alimentación positiva. |
Identificación de Pines de Arduino
La placa Arduino UNO dispone de 20 pines de entrada/salida, incluyendo 14 pines digitales y 6 pines analógicos. Para este proyecto, utilizaremos los pines de 5V y GND de las señales de alimentación, así como los pines digitales 10, 11 y 12 para la comunicación SPI o I2C, y el pin 7 para RS232 TTL. Estos pines son cruciales para establecer la comunicación adecuada entre Arduino y el display LCD.

Circuito y Diagrama de Conexión para Comunicación SPI
La Interfaz Periférica Serial (SPI) es un bus de comunicación serial síncrono que se utiliza para la comunicación de alta velocidad a corta distancia entre múltiples dispositivos. El circuito de conexión para la comunicación SPI entre Arduino (dispositivo maestro) y la LCD (dispositivo esclavo) utiliza cinco cables para comunicarse, como se describe en la siguiente tabla:
| Conexión Arduino | Pin LCD | Tipo de Conexión |
|---|---|---|
| Pin 5V | Pin 6: VDD | Alimentación |
| Pin Ground | Pin 5: Ground | Tierra |
| Pin 10: SCK | Pin 3: SCK/SCL | Reloj Serial |
| Pin 11: MOSI | Pin 4: SDI/SDA | Datos Seriales de Entrada |
| Pin 12: SS (Slave Select) | Pin 1: SPISS | Selección de Esclavo SPI |
Nota importante: Para habilitar la comunicación SPI con el display NHD-0216K3Z-NSW-BBW-V3, los resistores R1 y R2 en la PCB del display deben configurarse según la hoja de datos (R1 abierto y R2 puenteado con una resistencia de 0 ohmios). Asegúrate de que tu Arduino esté apagado mientras realizas las conexiones para evitar posibles daños.
Ejemplos de Código Arduino - LCD Usando Interfaz SPI
Los ejemplos de código que se describen a continuación demuestran cómo establecer la comunicación serial entre Arduino y un display LCD de caracteres 16x2 utilizando la interfaz SPI. Aunque no incluiremos el código completo por motivos de formato, explicaremos la función de cada segmento y cómo contribuyen al comportamiento deseado del display.
- Función
SPI_Out(): Esta función es el corazón de la comunicación SPI. Se encarga de enviar comandos y datos al display LCD bit a bit. Itera a través de los 8 bits del byte de entrada, enviando el valor de cada bit al display y manipulando las líneas SCK (Reloj Serial) y SPISS (Selección de Esclavo) para una correcta sincronización. - Función
Set_Pins(): Configura los pines de Arduino utilizados para la comunicación SPI (SPISS_PIN, SDA_PIN, SCK_PIN) como pines de salida. Esto es esencial para que Arduino pueda controlar el flujo de datos hacia el LCD. - Función
Set_Contrast(): Permite ajustar el contraste del display LCD. Envía comandos específicos (0xFE y 0x52) seguidos de un valor que determina la intensidad del contraste, lo que es vital para la legibilidad del texto en diferentes condiciones de luz. - Función
Set_Backlight(): Controla la intensidad de la retroiluminación del display LCD. Al igual que el contraste, utiliza comandos prefijo (0xFE y 0x53) y un valor que ajusta el brillo de la luz de fondo. - Función
Clear_Display(): Esta función es fundamental para limpiar la pantalla LCD, eliminando cualquier carácter o gráfico previamente mostrado. Envía los comandos (0xFE y 0x51) necesarios para borrar completamente el contenido del display. - Función
Set_Cursor(): Habilita o deshabilita el cursor parpadeante en el display LCD. Dependiendo del parámetro de entrada (0 para apagar, 1 para encender), envía los comandos apropiados (0xFE y 0x4C o 0x4B) para controlar la visibilidad del cursor. - Función
setup(): Es la función principal que se ejecuta una única vez al iniciar el Arduino. En esta función se inicializan los ajustes, variables y cualquier otra configuración necesaria para el proyecto, como la configuración de pines, el contraste, la retroiluminación y la limpieza inicial del display. - Función
loop(): Esta función se ejecuta en un ciclo continuo mientras la placa Arduino esté encendida. En muchos ejemplos, si solo se necesita ejecutar funciones una vez al inicio, esta función puede permanecer vacía. Sin embargo, es aquí donde se implementan las interacciones dinámicas y repetitivas con el LCD.
Ejemplos Prácticos de Programación SPI
A continuación, describimos varios ejemplos de cómo puedes utilizar las funciones mencionadas para controlar tu LCD a través de SPI. Estos ejemplos te permitirán adaptar y expandir el código para satisfacer los requisitos específicos de tus proyectos basados en Arduino.
- "Hello World!": Este es el ejemplo más básico y fundamental. Después de inicializar el display con
Set_Pins(),Set_Contrast(),Set_Backlight()yClear_Display(), se utiliza una secuencia de llamadas aSPI_Out()para enviar los códigos ASCII de cada carácter de la frase 'Hello World!' al display. Esto demuestra la capacidad básica del LCD para mostrar texto fijo. - Mostrar texto en la primera y segunda fila: Este ejemplo amplía la funcionalidad del "Hello World!". Además de las funciones de inicialización, introduce la función
Set_Row(), que permite posicionar el cursor en la primera (Set_Row(1)) o segunda (Set_Row(2)) fila antes de enviar los caracteres. Así, puedes mostrar 'First Line' en la primera fila y 'Second Line' en la segunda, demostrando el control sobre la ubicación del texto. - Mostrar texto largo: Para texto que excede la longitud de una sola fila (16 caracteres), este ejemplo muestra cómo el texto continúa automáticamente en la siguiente fila. Por ejemplo, al enviar el número de parte 'NHD-0216K3Z-NSW-BBW-V3', el display lo distribuirá entre ambas filas, llenando la primera y luego la segunda.
- Parpadeo - Mostrar texto con cursor parpadeante: Utilizando la función
Set_Cursor(1), este ejemplo activa un cursor parpadeante en la posición actual del texto. Esto es útil para indicar la ubicación de entrada o simplemente para añadir un efecto visual. El texto, como el número de parte del display, se muestra mientras el cursor parpadea. - Cursor + texto con desplazamiento automático: Este ejemplo combina el cursor parpadeante con la función de desplazamiento automático. Después de mostrar el texto con el cursor activo, la función
Set_Shift(1)se llama repetidamente en elloop()para desplazar el contenido del display hacia la derecha, creando un efecto de "cinta de noticias" que revela más texto si este es más largo que la pantalla. - Texto con desplazamiento automático: Similar al anterior, pero sin el cursor parpadeante. El display muestra el texto, como el número de parte, y luego lo desplaza continuamente hacia la derecha utilizando
Set_Shift(1)en elloop(), permitiendo que el contenido largo sea visible. - Ajuste del contraste del LCD: Este ejemplo demuestra cómo el contraste del display puede ser ajustado dinámicamente. La función
Contrast_Cycle()se encarga de cambiar el valor de contraste desde el más alto al más bajo y viceversa en un bucle continuo. Esto es útil para optimizar la visibilidad bajo diferentes condiciones de iluminación. - Uso de la retroiluminación del LCD: Controlar la retroiluminación es esencial para la visibilidad en diferentes entornos. Este ejemplo muestra cómo la intensidad de la retroiluminación puede ser variada a través de comandos. La función
Backlight_loop()ajusta el brillo desde el más alto al más bajo y luego al más alto, creando un efecto de atenuación y encendido gradual. Esto es particularmente útil para displays seriales donde el control se realiza por software. - Tablas de caracteres/fuentes: Este ejemplo explora la tabla de caracteres incorporada en el LCD. Un bucle en la función
Font_Table_Characters()envía una secuencia de códigos ASCII al display, mostrando todos los caracteres disponibles en su ROM. Esto es útil para depuración o para encontrar caracteres especiales que se deseen utilizar en el proyecto. La función maneja el cambio de fila y la limpieza del display para mostrar un conjunto completo de caracteres.
Circuito y Diagrama de Conexión para Comunicación RS232 TTL
RS232 TTL es un protocolo de comunicación serial que utiliza las especificaciones de RS232, pero con niveles lógicos TTL (0V a Vcc, típicamente 3.3V o 5V). El circuito de conexión RS232 TTL entre Arduino y el display Newhaven de 16 caracteres es notablemente más simple, utilizando solo tres cables:
| Conexión Arduino | Pin LCD | Tipo de Conexión |
|---|---|---|
| Pin 5V | Pin 3: VDD | Alimentación |
| Pin Ground | Pin 2: VSS | Tierra |
| Pin 7: Digital I/O pin (TX) | Pin 1: RX RS-232 (TTL) | Puerto de Entrada Serial |
Nota: Para habilitar RS232 TTL en el display NHD-0216K3Z-NSW-BBW-V3, los resistores R1 y R2 en la PCB del display deben estar abiertos, según se especifica en la hoja de datos.
Ejemplo de Código Arduino - LCD "Hello World!" Usando Comunicación Serial RS232 TTL
El siguiente ejemplo de código demuestra cómo mostrar "Hello World!" en el LCD utilizando la comunicación RS232 TTL. A diferencia de SPI, esta interfaz a menudo utiliza la biblioteca SoftwareSerial de Arduino para simular un puerto serial en pines digitales.

- Inclusión de
SoftwareSerial.h: Se incluye esta librería para permitir la comunicación serial en pines digitales arbitrarios de Arduino, ya que el pin RX del LCD se conecta a un pin digital de Arduino (por ejemplo, el pin 7). - Definición de pines y objeto
SoftwareSerial: Se define el pin de Arduino al que se conectará el RX del LCD (por ejemplo,#define P1 7) y se crea una instancia deSoftwareSerial(SoftwareSerial NHD_LCD = SoftwareSerial(P1, RxPin);) para manejar la comunicación. - Funciones de Control (
Set_Contrast(),Clear_display(),Set_Pins(),Set_Backlight(),Set_Cursor()): Estas funciones son análogas a sus contrapartes en el ejemplo SPI, pero en lugar de usarSPI_Out(), utilizanNHD_LCD.write()para enviar los comandos y datos al display a través del puerto serial configurado. - Función
Hello_World(): Similar al ejemplo SPI, esta función envía los códigos ASCII de 'Hello World!' al display utilizandoNHD_LCD.write()para cada carácter. - Función
setup(): Inicializa la comunicación serial conNHD_LCD.begin(9600);, configurando la velocidad de transmisión a 9600 baudios (bits por segundo). También realiza las inicializaciones del display como configurar pines, contraste, retroiluminación y limpieza, y luego llama aHello_World(). - Función
loop(): En este ejemplo, la funciónloop()permanece vacía, ya que el mensaje 'Hello World!' se muestra una sola vez al inicio.
Solución de Problemas Comunes en Proyectos Arduino - LCD
Cuando trabajas con Arduino y pantallas LCD, es común encontrarse con algunos inconvenientes. Aquí te presentamos una serie de pasos para diagnosticar y resolver los problemas más frecuentes:
- Verifica las conexiones de cableado: Este es, con diferencia, el problema más habitual. Una conexión incorrecta puede impedir que el LCD funcione o muestre caracteres extraños. Revisa meticulosamente tus conexiones con los diagramas de pines y circuitos proporcionados. Recuerda que el display NHD-0216K3Z-NSW-BBW-V3 requiere una configuración específica de resistores para SPI (resistencia de 0 ohmios soldada en R2) o RS232 TTL (R1 y R2 abiertos).
- Inspecciona los componentes: Busca cualquier signo visible de daño en la placa Arduino, el LCD o los cables de conexión. Un pin doblado, un cable roto o un componente dañado pueden ser la causa del problema.
- Verifica el código: Asegúrate de que el código cargado en tu Arduino sea el correcto y esté libre de errores. Pequeños errores de sintaxis o lógica pueden causar un comportamiento inesperado. Revisa los mensajes de error en el Arduino IDE.
- Comprueba la fuente de alimentación: Asegúrate de que tu fuente de alimentación sea suficiente para alimentar tanto el Arduino como el LCD. Una alimentación insuficiente puede provocar un funcionamiento errático o la falta de visualización.
- Prueba con otro LCD: Si sigues experimentando problemas, intenta conectar un LCD diferente que sepas que funciona correctamente a tu Arduino. Esto te ayudará a determinar si el problema reside en la pantalla LCD o en la propia placa Arduino.
- Ajusta el contraste: Si tienes dificultades para ver el texto en el LCD, intenta ajustar el contraste utilizando la función de software
Set_Contrast()descrita anteriormente. Diferentes condiciones de iluminación pueden requerir distintos ajustes de contraste para una visibilidad óptima. - Verifica la versión del Arduino IDE: Asegúrate de estar utilizando la última versión del Arduino IDE. Las versiones desactualizadas pueden contener errores o ser incompatibles con tu proyecto o con las librerías que utilizas.
- Prueba características individuales: Si tienes problemas con funciones específicas como el desplazamiento de texto o el control de contraste, intenta ejecutar un código más simple, como el ejemplo 'Hello World!'. Esto puede ayudarte a aislar el problema y determinar si está relacionado con el código o con el hardware.
- Busca ayuda en la comunidad: Si después de seguir estos pasos no logras resolver el problema, considera buscar ayuda en la comunidad en línea. Foros especializados como los de Arduino.cc o Stack Exchange son excelentes recursos para obtener asistencia de usuarios experimentados.
La paciencia y la atención al detalle son clave al solucionar problemas en proyectos de electrónica. Siguiendo estos pasos, podrás diagnosticar y resolver la mayoría de los inconvenientes relacionados con la conexión de una pantalla LCD a una placa Arduino.
Preguntas Frecuentes (FAQ)
¿Cuánto mide una pantalla LCD de Arduino?
Las pantallas LCD para Arduino vienen en una variedad de tamaños y configuraciones. Aunque el display 16x2 (16 caracteres por 2 filas) es uno de los más comunes y utilizados, existen otras opciones. Por ejemplo, las pantallas TFT LCD, que a menudo incluyen funcionalidad táctil, pueden tener tamaños como 3.5 pulgadas. Estas pantallas TFT suelen ofrecer resoluciones mucho mayores, como 480x320 píxeles, y pueden trabajar con voltajes de 3.3V a 5V, siendo compatibles con placas como Arduino UNO y Mega. La elección del tamaño depende de la aplicación específica y la cantidad de información que se necesite mostrar.
¿Qué biblioteca de Arduino se debe incluir para trabajar con pantallas LCD?
Para trabajar con pantallas LCD de caracteres estándar (como las HD44780 compatibles), la biblioteca más comúnmente utilizada y recomendada es la biblioteca LiquidCrystal, que viene preinstalada con el Arduino IDE. Esta biblioteca simplifica enormemente la interacción con el LCD, proporcionando funciones intuitivas. Para pantallas que utilizan comunicación serial como I2C o SPI, a menudo se requieren bibliotecas específicas para esa interfaz (como Wire.h para I2C o SPI.h para SPI, o incluso bibliotecas personalizadas si la pantalla tiene un controlador especial como la NHD-0216K3Z-NSW-BBW-V3 que vimos en este artículo). Para la comunicación RS232 TTL, la biblioteca SoftwareSerial.h es fundamental para emular un puerto serial.
Funciones clave de estas bibliotecas incluyen:
lcd.begin(columnas, filas): Inicializa el display, especificando el número de columnas y filas. Por ejemplo,lcd.begin(16,2)para un LCD de 16x2.lcd.print("--mensaje--"): Muestra un mensaje en la posición actual del cursor. El mensaje no debe exceder el número de columnas del display.lcd.setCursor(columna, fila): Mueve el cursor a una posición específica. Las columnas y filas se indexan desde 0. Por ejemplo,lcd.setCursor(0,1)moverá el cursor a la primera columna de la segunda fila.
Es importante verificar la documentación o el vendedor de tu pantalla LCD para saber qué biblioteca es la más adecuada, ya que algunos controladores específicos (como el ILI9488 en algunas TFT) pueden requerir bibliotecas diferentes o adaptadas.
Conclusión
Como hemos visto, conectar y operar una pantalla LCD con Arduino es un proceso accesible y gratificante que abre un sinfín de posibilidades para tus proyectos electrónicos. Ya sea que necesites mostrar una lectura de sensor, un mensaje de estado o una interfaz de usuario simple, las pantallas LCD son una herramienta invaluable. Hemos explorado las complejidades de la comunicación SPI y la simplicidad de RS232 TTL, destacando la versatilidad de displays como el Newhaven 16x2. Con el conocimiento de los pines, el cableado y las funciones básicas de programación, estás listo para dar el siguiente paso y añadir una dimensión visual a tus creaciones con Arduino. La capacidad de tu placa Arduino para ejecutar una pantalla LCD es solo el comienzo de lo que puedes lograr en el fascinante mundo de la electrónica.
Si quieres conocer otros artículos parecidos a ¿Puede Arduino Ejecutar una Pantalla LCD? puedes visitar la categoría Cálculos.
