Crea Animaciones y Juegos en LCD 16×2 con Arduino UNO
Componentes y Suministros
| Arduino UNO | × | 1 |
| Pantalla LCD Alfanumérica 16×2 (HD44780) | × | 1 |
| Potenciómetro 10 kΩ (contraste) | × | 1 |
| Resistencia 220 Ω (retroiluminación) | × | 1 |
| Protoboard y cables | × | 1 |
| Pulsador (para el juego) | × | 1 |
Aplicaciones y Servicios Online
- Arduino IDE
Sobre el Proyecto
Tutorial progresivo: desde el cableado básico del LCD hasta animaciones con caracteres personalizados y un juego tipo arcade simple. Aplicable a cualquier LCD compatible HD44780 (16×2, 20×4, etc.).
1. Cableado del LCD
| Pin LCD | Función | Conexión |
|---|---|---|
| 1 | VSS (GND) | Riel negativo protoboard (GND Arduino) |
| 2 | VDD (+5 V) | Riel positivo protoboard (5 V Arduino) |
| 3 | VO (Contraste) | Cursor potenciómetro (extremos a +5 V y GND) |
| 4 | RS | Pin digital 12 Arduino |
| 5 | R/W | GND (solo escritura) |
| 6 | E (Enable) | Pin digital 11 Arduino |
| 11–14 | D4–D7 (Datos) | Pines digitales 4, 5, 6, 7 Arduino |
| 15 | A (Ánodo LED) | +5 V vía resistencia 220 Ω |
| 16 | K (Cátodo LED) | GND |
Prueba: Alimenta; si la fila inferior se ilumina, el LCD funciona. Ajusta el contraste con el potenciómetro.
2. Primer Sketch – Mensaje Estático
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // RS, E, D4, D5, D6, D7
void setup() {
lcd.begin(16, 2);
lcd.setCursor(0, 1);
lcd.print("Working");
}
void loop() {}
Si ves "Working", el cableado es correcto.
3. Explicación de Funciones Clave
lcd.begin(cols, rows)– Define dimensiones.lcd.setCursor(col, row)– Posiciona cursor (base 0).lcd.print()– Escribe texto desde la posición del cursor.lcd.clear()– Borra pantalla.
4. Texto Desplazado (Scrolling)
void loop() {
char msg[] = "Texto desplazado! ";
for (int pos = 15; pos >= -14; pos--) {
lcd.clear();
lcd.setCursor(pos, 1);
if (pos < 0) lcd.print(msg - pos); // puntero avanza
else lcd.print(msg);
delay(250);
}
}
Usa punteros para mostrar ventana deslizante del mensaje.
5. Caracteres Personalizados (Custom Characters)
Define un array de 8 bytes (5×8 píxeles). Ejemplo dinosaurio:
byte dino[8] = {
B01110, B01110, B01100, B01111,
B11101, B01010, B01010, B01010
};
void setup() {
lcd.createChar(0, dino);
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.write(byte(0));
}
Genera tus propios caracteres en LCD Character Creator.
6. Animación: Flecha Disparada
Tres caracteres personalizados (punta, cuerpo, cola) se escriben en secuencia moviendo la columna.
byte arrowHead[8] = {B00001, B00011, B00111, B01111, B00111, B00011, B00001, B00000};
byte arrowBody[8] = {B00000, B00000, B00000, B11111, B11111, B00000, B00000, B00000};
byte arrowTail[8] = {B00011, B00111, B01111, B11111, B11111, B00111, B00011, B00000};
void setup() {
lcd.createChar(0, arrowHead);
lcd.createChar(1, arrowBody);
lcd.createChar(2, arrowTail);
lcd.begin(16,2);
}
void loop() {
for (int n=15; n>=-1; n--) {
lcd.clear();
lcd.setCursor(n,1);
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
delay(50);
}
}
7. Juego Simple: Esquiva las Flechas
Objetivo: El "héroe" (carácter personalizado) está en fila 1. Flechas cruzan la fila 1 de derecha a izquierda. Pulsador en pin 2 (interrupción 0) mueve al héroe a fila 0 para esquivar. Puntuación en esquina superior derecha.
Conceptos clave:
attachInterrupt(0, buttonISR, CHANGE)– Respuesta inmediata al botón.randomSeed(analogRead(A0))– Semilla aleatoria real (ruido cuántico en pin flotante).- Interrupción
buttonISR()cambia variablelevel(0 o 1) según estado del botón. - Bucle principal mueve flechas, detecta colisión (
n==1 && level==1), actualiza puntuación y reinicia en "Game Over".
Código completo del juego incluido en la sección Código.
Código
Sketch Animación (Flecha)
#include <LiquidCrystal.h>
const int rs=12, en=11, d4=4, d5=5, d6=6, d7=7;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
// ... definiciones de arrowHead, arrowBody, arrowTail, man ...
void setup() {
lcd.createChar(0,arrowHead); lcd.createChar(1,arrowBody);
lcd.createChar(2,arrowTail); lcd.createChar(3,man);
lcd.begin(16,2);
}
void loop() {
for(int n=15;n>=-1;n--){
lcd.clear(); delay(10);
lcd.setCursor(0,0); lcd.print("by Debanshu Das");
lcd.setCursor(n,1);
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
delay(65);
}
}
Sketch Juego Completo
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,4,5,6,7);
int level=1, score=0;
// ... definiciones de caracteres ...
void setup() {
lcd.createChar(0,arrowHead); lcd.createChar(1,arrowBody);
lcd.createChar(2,arrowTail); lcd.createChar(3,man);
lcd.begin(16,2);
attachInterrupt(0,buttonin,CHANGE);
randomSeed(analogRead(A0));
}
void loop() {
int n=15, rnd=random(15,25);
while(n!=-1){
lcd.clear(); delay(10); drawman();
lcd.setCursor(n,1);
if(n==1 && level==1){ stopgame(); continue; }
lcd.write(byte(0)); lcd.write(byte(1)); lcd.write(byte(2));
lcd.setCursor(10,0); lcd.print(score);
delay(100-rnd); n--; score++; if(level==0) score--;
}
}
void drawman(){ lcd.setCursor(1,level); lcd.write(byte(3)); }
void buttonin(){ level = digitalRead(2)==LOW ? 0 : 1; }
void stopgame(){
lcd.clear(); lcd.setCursor(0,0); lcd.print("Game over");
lcd.setCursor(10,0); lcd.print(score);
level=1; score=0; n=15; delay(3000);
}
Esquemático

Proceso de manufactura
- Construye una Consola de Juegos Portátil con el Clon Arduboy
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Registrador de Temperatura y Humedad con Arduino, DHT11 y Ethernet Shield
- Control Arduino UNO desde Python 3 – Envío de Comandos y Demo LED
- Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
- Construye una Radio FM Compacta con Arduino Nano y RDA5807M
- Construye una Estación Meteorológica Arduino Fiable con Sensores DHT
- Construye un Juego Arcade Clásico con Arduino LCD, Zumbador y Joystick
- MKR1000 con DHT22: Monitorización de Temperatura y Humedad en Tiempo Real a Azure
- Construye un Portátil Raspberry Pi 3 y Arduino: Guía Paso a Paso
- Sensores para Arduino: Tipos, Aplicaciones y Proyectos Reales