¡Hola, ingenieros del CECyTEM! Esta es una guía de profundización completa para conectar y dominar una pantalla LCD 1602 usando un adaptador de comunicación I2C con Arduino. Aprenderemos a dejar atrás los circuitos llenos de cables para crear proyectos limpios y profesionales.
📑 Tabla de Contenido
- 1. ¿Qué es el módulo LCD I2C y su conexión?
- 2. Instalación de la biblioteca LCD I2C y Funciones Útiles
- 3. Proyecto 1: Tiempo transcurrido (millis)
- 4. Proyecto 2: Texto intermitente (Alarma)
- 5. Proyecto 3: Cursor interactivo (Ingreso de clave)
- 6. Proyecto 4: Texto desplazable (Scroll)
- 7. Proyecto 5: Caracteres personalizados y animaciones
- 8. Solución de problemas comunes
🧠 1. ¿Qué es el módulo LCD I2C y su conexión?
El adaptador LCD I2C permite convertir una conexión paralela de una pantalla LCD a una serie que requiere sólo de dos cables para datos. Este adaptador está especialmente diseñado para conectarse con un módulo modelo 1602 (16 columnas por 2 filas).
🔌 Diagramas de Conexión
A continuación se presentan las configuraciones principales para conectar el adaptador a tu Arduino:
(Inserta aquí la imagen de tu Diagrama 1)
(Inserta aquí la imagen de tu Diagrama 2)
(Inserta aquí la imagen de tu Diagrama 3)
⚙️ 2. Instalación de la biblioteca LCD I2C y Funciones Útiles
Para lograr la programación del LCD con el adaptador I2C, es necesario instalar una nueva librería. Esta no se encuentra disponible en el gestor normal, por lo que haremos una instalación manual por única vez:
- Ingresa con tu navegador web a la siguiente dirección: https://github.com/fmalpartida/New-LiquidCrystal.
- Da clic en el botón verde Code y selecciona Download ZIP.
- En el IDE de Arduino, ve al menú Programas → Incluir librería → Añadir biblioteca .ZIP (busca el archivo descargado y ábrelo).
- Verifica la instalación buscando "New-LiquidCrystal-master" en el menú Incluir Librería.
🔧 La Función Constructora
Con esta librería, inicializamos el objeto definiendo los pines internos del adaptador mediante la siguiente estructura:
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
(Donde 0x27 es la dirección, y los demás números corresponden a los pines E, RW, RS, D4-D7, P3 y la polaridad para encender la luz trasera).
📚 API: Funciones Útiles de la Librería
| Función | Descripción |
|---|---|
lcd.init(); / lcd.begin(16,2); | Inicializa la interfaz a la pantalla LCD I2C y especifica la dirección y dimensiones. Debe ser llamada antes que cualquier otro comando. |
lcd.backlight(); | Habilita (activa) el LED de retroiluminación del LCD. |
lcd.noBacklight(); | Deshabilita (apaga) la luz de fondo del LCD. |
lcd.clear(); | Borra la pantalla LCD y posiciona el cursor en la esquina superior izquierda. |
lcd.home(); | Establece el cursor en la esquina superior izquierda sin borrar el texto en la pantalla. |
lcd.setCursor(col, row); | Posiciona el cursor del LCD en una ubicación deseada (columna, fila). |
lcd.noCursor(); | Oculta el cursor del LCD. |
lcd.cursor(); | Muestra el cursor del LCD si ha sido ocultado. |
lcd.scrollDisplayLeft(); | Desplaza el contenido de la pantalla (texto y cursor) un espacio a la izquierda. |
lcd.scrollDisplayRight(); | Desplaza el contenido de la pantalla (texto y cursor) un espacio a la derecha. |
lcd.noDisplay(); | Apaga la visualización de la pantalla sin perder el texto mostrado. |
lcd.display(); | Vuelve a encender la visualización restaurando el texto oculto. |
💻 3. Proyecto 1: Tiempo transcurrido (millis)
Programa que muestra en la pantalla el tiempo transcurrido desde la ejecución del código utilizando la función de milisegundos.
#include <Wire.h> // libreria de comunicacion por I2C
#include <LCD.h> // libreria para funciones de LCD
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
lcd.begin(16, 2); // 16 columnas por 2 lineas para LCD 1602A
lcd.clear(); // limpia pantalla
}
void loop() {
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Hola, han pasado"); // escribe el texto
lcd.setCursor(0, 1); // ubica cursor en columna 0 y linea 1
lcd.print(millis() / 1000); // funcion millis() / 1000 para segundos
lcd.print(" seg."); // escribe seg.
}
🚨 4. Proyecto 2: Texto intermitente (Alarma)
Programa que muestra un texto que oscila (parpadea) a intervalos de medio segundo utilizando las funciones display() y noDisplay().
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Alarma activa !");
lcd.display(); // muestra el texto
delay(500); // demora de medio segundo
lcd.noDisplay(); // oculta el texto
delay(500); // demora de medio segundo
}
🔑 5. Proyecto 3: Cursor interactivo (Ingreso de clave)
En este proyecto aprenderemos a mostrar y ocultar el cursor de la pantalla, simulando una interfaz de ingreso de datos o contraseña.
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Ingrese clave:");
lcd.setCursor(0, 1);
lcd.cursor(); // muestra cursor
delay(500);
lcd.noCursor(); // oculta cursor
delay(500);
}
🎬 6. Proyecto 4: Texto desplazable (Scroll)
¿Qué pasa si queremos mostrar un mensaje largo o darle movimiento? Realizaremos un desplazamiento de a un carácter por vez hacia la izquierda.
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
void loop() {
lcd.setCursor(2, 0);
lcd.print("Prueba scroll");
lcd.scrollDisplayLeft(); // funcion que desplaza hacia la izquierda
delay(1000);
}
🎨 7. Proyecto 5: Caracteres personalizados y animaciones
La pantalla LCD nos permite crear hasta 8 símbolos propios dibujándolos mediante una matriz de bytes (donde 1 es encendido y 0 es apagado).
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
byte sonrisa[8] = { 0b00000, 0b00000, 0b11011, 0b11011, 0b00000, 0b10001, 0b01110, 0b00000 };
byte serio[8] = { 0b00000, 0b00000, 0b11011, 0b01010, 0b00000, 0b00000, 0b01110, 0b00000 };
byte triste[8] = { 0b00000, 0b01010, 0b11011, 0b00000, 0b00000, 0b00000, 0b01110, 0b10001 };
byte Alien[] = { B11111, B10101, B11111, B11111, B01110, B01010, B11011, B00000 };
byte calaca[] = { B00000, B01110, B10101, B11011, B01110, B01110, B00000, B00000 };
void setup() {
lcd.begin(16, 2);
lcd.clear();
lcd.createChar (0, serio);
lcd.createChar (1, triste);
lcd.createChar (2, sonrisa);
lcd.createChar (3, Alien);
lcd.createChar (4, calaca);
lcd.home (); // empieza en (0,0)
lcd.setCursor ( 2, 0 );
lcd.print("Club Robot's");
lcd.setCursor ( 5, 1 );
lcd.print ("Center");
}
void loop() {
lcd.setCursor (0,0);
lcd.write (byte(3)); // forma 1 con comando write
lcd.setCursor (15,0);
lcd.write (byte(4));
lcd.setCursor ( 15, 1 );
lcd.print (char(0)); // forma 2 con comando print
delay (600);
lcd.setCursor ( 15, 1 );
lcd.print ( char(1));
delay (500);
lcd.setCursor ( 15, 1 );
lcd.print ( char(2));
delay (900);
}
🛠️ 8. Solución de Problemas Comunes
¿Cargaste el código y no se ve nada?
¡No entres en pánico, ingeniero! Verifica estos tres puntos clave:
- El Ajuste del Contraste: El adaptador tiene un preset (potenciómetro) para la regulación del nivel de contraste de la pantalla. Toma un desarmador pequeño y gíralo suavemente hasta que las letras aparezcan.
- Cuadros negros sólidos: Esto significa que la pantalla tiene energía, pero no está recibiendo datos o falló la inicialización. Verifica que el cable de SDA vaya correctamente a su pin y el de SCL al suyo, ¡suelen confundirse mucho!
- Dirección I2C Incorrecta: Nuestro adaptador tiene por defecto la dirección
0x27. Si tu módulo es distinto, podría usar la dirección0x3F. Prueba cambiando el0x27en la línea de configuración inicial.