Guía Avanzada: Interfaz I2C para Pantalla LCD 16x2

¡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?

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:

Diagrama 1: Conectando el adaptador a Arduino por entradas analógicas y sin soldar.
(Inserta aquí la imagen de tu Diagrama 1)
Diagrama 2: Conectando el adaptador a Arduino por las entradas SDA y SCL directamente, soldado.
(Inserta aquí la imagen de tu Diagrama 2)
Diagrama 3: Como queda soldado el LCD con el adaptador I2C.
(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:

  1. Ingresa con tu navegador web a la siguiente dirección: https://github.com/fmalpartida/New-LiquidCrystal.
  2. Da clic en el botón verde Code y selecciona Download ZIP.
  3. En el IDE de Arduino, ve al menú Programas → Incluir librería → Añadir biblioteca .ZIP (busca el archivo descargado y ábrelo).
  4. 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.

Programa 1 - Tiempo

#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().

Programa 2 - Alarma Intermitente

#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.

Programa 3 - Cursor

#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.

Programa 4 - Scroll

#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).

Programa 5 - Emojis Custom

#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: