< Volver 

SolidCrystalI2C

2026-01-28

Driver moderno, de alto rendimiento y facilidad de uso para controlar pantallas LCD basadas en el HD44780 en sistemas AVR/Arduino

C++AVREmbedded
Ir a vista técnica

SolidCrystalI2C: pantallas LCD sencillas y fluidas en Arduino

Las pantallitas LCD de 16x2 o 20x4 que aparecen en miles de proyectos de Arduino funcionan con un chip llamado HD44780, y casi siempre se conectan con apenas cuatro cables gracias a un módulo I2C pegado en la parte de atrás. SolidCrystalI2C es una librería que te deja escribir en ellas de forma simple y sin que tu programa se quede esperando a la pantalla.

¿Qué problema resuelve?

Ese módulo I2C es barato y práctico, pero lento: para mostrar una sola letra hay que mandar varios mensajes por el cable, y redibujar una pantalla de 16x2 completa toma unos 58 milisegundos (un cálculo estimado a partir de los tiempos del bus). En ese tiempo un Arduino podría haber ejecutado casi un millón de ciclos de reloj. Además, la librería clásica para estas pantallas quedó sin mantenimiento hace años.

¿Cómo lo resuelve?

SolidCrystalI2C guarda en la memoria del Arduino una copia de lo que muestra la pantalla. Cuando algo cambia, compara y manda solo las letras que son distintas, en vez de reescribir todo. Además trae:

  • Una segunda capa para lo que debe aparecer encima del texto sin borrarlo, como las flechas de un menú.
  • Caracteres personalizados (íconos, flechas, barras de progreso) con un caché que evita volver a cargar los que ya están en la pantalla.
  • Una sintaxis cómoda: escribes con <<, igual que en C++, así que lcd << "Temp: " << 23 hace lo que esperas.
  • Memoria pequeña y fija: reserva lo que necesita una sola vez al arrancar y no usa String, así que funciona bien en placas AVR con poca RAM, como el Arduino Uno o el Nano.

Está escrita desde cero a partir de las hojas de datos del HD44780 y del PCF8574, no adaptada de otra librería.

Ejemplo

#include <SolidCrystalI2C.h>

LCD lcd(0x27, 16, 2, true);   // dirección I2C, columnas, renglones, overlay activo

void setup()
{
    lcd.start();
    lcd << "Hola, mundo!" << cchar::endl;
    lcd.flush();   // aquí se envía a la pantalla solo lo que cambió
}

void loop()
{
}

Licenciada bajo la MIT License - Copyright (c) 2026 Mastedore.