Uso de pantalla LCD I2C con ESP32 de forma sencilla

¡Hola equipo! Bienvenidos a Ingtelecto Pro. Hoy vamos a dar un paso gigante en la usabilidad de nuestros proyectos. Seamos honestos: depender del Monitor Serie para ver qué está pasando dentro de tu ESP32 es... aburrido y poco práctico si quieres hacer un dispositivo portátil.

La solución clásica es la pantalla LCD 16x2, pero la versión antigua requería conectar casi 12 cables, ocupando todos los pines de tu microcontrolador. ¡Una pesadilla!

Por suerte, hoy utilizaremos la versión moderna con adaptador I2C. Aprenderemos no solo a encenderla, sino a entender cómo funciona su memoria interna (CGRAM) para crear nuestros propios iconos (corazones, aliens, baterías). ¿Listos para iluminar ese display? ¡Vamos a darle! 📟✨

El Poder del Bus I2C: Menos es Más

Imagina que quieres conectar una pantalla, un sensor de temperatura y un reloj en tiempo real. Antiguamente necesitarías unos 20 pines. Con el protocolo I2C (Inter-Integrated Circuit), puedes conectar TODOS esos dispositivos usando solo dos pines (SDA y SCL).

Cada dispositivo tiene una "dirección única" (como un número de casa), y el ESP32 (el cartero) sabe exactamente a quién entregar el mensaje. Hoy aprenderemos a encontrar esa dirección.

[Pega aquí el iframe de YouTube]
Índice de contenido
  1. Materiales Necesarios
  2. Fundamentos Técnicos: ¿Qué estamos conectando?
    1. El Misterio de la Dirección I2C (0x27 vs 0x3F)
  3. Conexiones y Diagramas ⚙️
    1. Tabla de Conexiones
  4. Paso Crucial: Ajuste de Contraste
  5. Paso 1: El Escáner I2C (¡Haz esto primero!)
  6. Paso 2: Instalación de la Librería
  7. Paso 3: Código "Hola Mundo" 👋
    1. Funciones Clave que debes conocer:
  8. Nivel Avanzado: Caracteres Personalizados y CGRAM 👾
  9. Truco Pro: Texto en Desplazamiento (Scroll)
  10. Conclusión

Materiales Necesarios

Para este tutorial, usaremos componentes muy comunes.

Lista de Componentes ✅

  • 1 x Placa de Desarrollo ESP32 (Cualquier modelo).
  • 1 x Pantalla LCD 16x2 (o 20x4) con módulo I2C soldado.
  • 4 x Cables Jumper (Hembra-Macho o Macho-Macho según tu placa).
  • 1 x Protoboard (Opcional).

Fundamentos Técnicos: ¿Qué estamos conectando?

Antes de los cables, entendamos la "magia" detrás del módulo negro que está detrás de tu pantalla.

PCF8574

Expansor de E/S

Este es el chip "traductor". La pantalla LCD original necesita recibir datos en paralelo (8 cables a la vez). El chip PCF8574 toma los comandos seriales del I2C (que vienen del ESP32) y los convierte en paralelo para el LCD. Gracias a él, ahorramos 6 pines del microcontrolador.

El Misterio de la Dirección I2C (0x27 vs 0x3F)

Aquí es donde muchos fallan. Aunque todos los módulos se ven iguales, el chip PCF8574 puede venir de dos fabricantes distintos, y eso cambia su "nombre" (dirección) en la red:

  • Texas Instruments (PCF8574A): Suelen tener la dirección por defecto 0x3F.
  • NXP Semiconductors (PCF8574): Suelen tener la dirección por defecto 0x27.

Además, si miras bien la placa, verás tres pads de soldadura llamados A0, A1 y A2. Si sueldas estos puentes, puedes cambiar la dirección manualmente. Esto es genial si quieres conectar dos pantallas iguales al mismo ESP32. ¡Pero no te preocupes por adivinar! Más abajo usaremos un escáner para saber la dirección exacta.

Conexiones y Diagramas ⚙️

El ESP32 usa por defecto los pines GPIO 21 y GPIO 22 para la comunicación I2C.

¡Ojo con el Voltaje! (3.3V vs 5V)

El ESP32 trabaja a 3.3V, pero la mayoría de pantallas LCD requieren 5V para que la luz de fondo y el contraste se vean bien.
La solución: Conecta el pin VCC de la pantalla al pin VIN (o 5V) del ESP32. Los pines de datos (SDA/SCL) funcionarán bien conectados directo al ESP32 porque el protocolo I2C es "open-drain" (no inyectará 5V dañinos al ESP32 si no hay resistencias pull-up externas a 5V).

Tabla de Conexiones

Pantalla LCD I2C ESP32 DevKit
GND GND
VCC VIN (5V)
SDA GPIO 21 (D21)
SCL GPIO 22 (D22)

Paso Crucial: Ajuste de Contraste

Muchos estudiantes conectan todo, suben el código y... ¡la pantalla está azul/verde pero vacía! 😱
No entres en pánico.
Detrás de la pantalla hay un pequeño cuadro azul con un tornillo (potenciómetro). Gíralo suavemente con un destornillador mientras la pantalla está encendida hasta que veas aparecer unos rectángulos blancos o las letras. Ese es el ajuste de contraste.

Paso 1: El Escáner I2C (¡Haz esto primero!)

Antes de intentar escribir texto, necesitamos confirmar que el ESP32 "ve" la pantalla y saber su dirección exacta. Carga este código:

// ESCÁNER I2C PARA ESP32

// Encuentra la dirección hexadecimal de tu dispositivo
#include
void setup() {

Wire.begin();

Serial.begin(115200);

while (!Serial); // Esperar al monitor serie

Serial.println("\nEscáner I2C iniciado...");

}
void loop() {

byte error, address;

int nDevices = 0;
Serial.println("Escaneando...");
for(address = 1; address < 127; address++ ) {

// Intentamos iniciar transmisión con cada dirección posible

Wire.beginTransmission(address);

error = Wire.endTransmission();
if (error == 0) {

Serial.print("¡Dispositivo I2C encontrado en la dirección: 0x");

if (address < 16)

Serial.print("0");

Serial.print(address, HEX);

Serial.println(" !");

nDevices++;

}

}
if (nDevices == 0)

Serial.println("No se encontraron dispositivos I2C\n");

else

Serial.println("Escaneo completado\n");
delay(5000); // Esperar 5 segundos antes de escanear de nuevo

}

Abre el Monitor Serie (115200 baudios). Deberías ver algo como: ¡Dispositivo I2C encontrado en la dirección: 0x27! (o 0x3F). ¡Anota ese número!

Paso 2: Instalación de la Librería

Usaremos la librería estándar y más robusta para esto.

  1. Ve a Programa > Incluir Librería > Administrar Bibliotecas.
  2. Escribe "liquidcrystal i2c" en el buscador.
  3. Busca la versión de Frank de Brabander (o a veces aparece como Marco Schwartz).
  4. Dale a Instalar.

Paso 3: Código "Hola Mundo" 👋

Ahora sí, vamos a escribir algo. Asegúrate de cambiar la dirección 0x27 por la que encontraste en el escáner.

#include
// CONFIGURACIÓN

// LiquidCrystal_I2C lcd(dirección, columnas, filas);

LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {

// Inicializar el LCD

lcd.init();
// Encender la luz de fondo (Backlight)

lcd.backlight();
// --- Escribir en la primera línea ---

lcd.setCursor(0, 0); // (Columna 0, Fila 0)

lcd.print("Hola Ingtelecto!");
// --- Escribir en la segunda línea ---

lcd.setCursor(2, 1); // (Columna 2, Fila 1) -> Un poco centrado

lcd.print("ESP32 LCD");

}
void loop() {

// Nada por aquí todavía

}

Funciones Clave que debes conocer:

  • lcd.init(): Prepara la pantalla.
  • lcd.backlight(): Enciende la luz trasera. Usa lcd.noBacklight() para apagarla y ahorrar energía.
  • lcd.setCursor(columna, fila): Mueve el puntero. Recuerda que empezamos a contar desde 0. La fila de arriba es la 0, la de abajo es la 1.
  • lcd.clear(): Borra todo el texto de la pantalla.

Nivel Avanzado: Caracteres Personalizados y CGRAM 👾

¿Quieres mostrar un icono de batería, un corazón o un alien? El LCD estándar no los tiene... ¡pero podemos crearlos!

¿Qué es la CGRAM?

El LCD tiene dos memorias:

  • CGROM (Read Only): Donde viven las letras normales (A, B, C...). No se pueden cambiar.
  • CGRAM (Random Access): Una pequeña memoria vacía donde podemos dibujar hasta 8 caracteres propios.

Cada carácter es una cuadrícula de 5x8 píxeles. Nosotros definimos qué puntos encender (1) y cuáles apagar (0).

Aquí tienes un código divertido que carga iconos personalizados en la memoria del LCD y los muestra.

#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
// --- DISEÑO DE ICONOS (Mapas de bits) ---

// Cada byte representa una fila horizontal del icono
byte Corazon[8] = {

0b00000,

0b01010, // * *

0b11111, // *****

0b11111, // *****

0b01110, // ***

0b00100, // *

0b00000,

0b00000

};
byte Alien[8] = {

0b11111, // *****

0b10101, // * * *

0b11111, // *****

0b11111, // *****

0b01110, // ***

0b01010, // * *

0b11011, // ** **

0b00000

};
void setup() {

lcd.init();

lcd.backlight();
// 1. Guardar los iconos en la memoria CGRAM (espacios 0 al 7)

lcd.createChar(0, Corazon);

lcd.createChar(1, Alien);
lcd.setCursor(0, 0);

lcd.print("I Love ESP32");
// 2. Mostrar el icono guardado en la dirección 0

lcd.setCursor(2, 0); // Ponemos el cursor sobre la palabra "Love"

lcd.write(0); // Escribimos el carácter 0 (Corazón)
lcd.setCursor(0, 1);

lcd.print("Invasion: ");

lcd.write(1); // Escribimos el carácter 1 (Alien)

lcd.write(1);

lcd.write(1);

}
void loop() {

// Animación simple: Parpadear el alien

lcd.setCursor(10, 1);

lcd.write(1); // Mostrar alien

delay(500);
lcd.setCursor(10, 1);

lcd.print(" "); // Borrar alien (espacio en blanco)

delay(500);

}

Truco Pro: Texto en Desplazamiento (Scroll)

Si tu mensaje es muy largo ("Bienvenidos al sistema de monitoreo de temperatura..."), no cabe en 16 caracteres. Puedes hacer que se mueva como una marquesina usando:

  • lcd.scrollDisplayLeft(): Mueve todo el contenido una casilla a la izquierda.
  • lcd.scrollDisplayRight(): Mueve todo a la derecha.

Simplemente pon ese comando dentro del loop() con un delay(300) y verás el efecto.

Conclusión

¡Display Dominado! ✅

Ya no trabajas a ciegas. Ahora tus proyectos pueden comunicarse con el usuario, mostrar datos de sensores o estados de conexión WiFi en tiempo real.

Reto para el lector:
Combina lo aprendido hoy con el tutorial de sensores DHT11. Crea un termómetro que muestre la temperatura en la línea 1 y un icono de "fuego" (creado por ti) si la temperatura supera los 30°C.

¡Sigue creando y nos vemos en el próximo tutorial!

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido educativo en redes sociales. Lee más sobre mi trayectoria aquí.

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir