
Personalizar caracteres en LCD
- AGR
- Electrónica , Programación
- 08 Dec, 2024
Índice
- Explicación del Código
- Componentes Clave del Código
- Desafíos
- Recursos
- Ejemplo extra para animar al Dino
Explicación del Código
Este código utiliza una pantalla LCD con interfaz I2C para mostrar caracteres personalizados, incluyendo un corazón, una carita feliz y una representación del dinosaurio del juego de Google. Además, organiza los caracteres personalizados en diferentes posiciones de la pantalla.
Componentes Clave del Código
1. Librería LiquidCrystal_I2C
La librería LiquidCrystal_I2C.h
se utiliza para controlar la pantalla LCD mediante una interfaz I2C, reduciendo el número de cables necesarios.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
2. Inicialización del LCD
Se inicializa el LCD con la dirección I2C 0x20
(puede variar dependiendo del módulo LCD) y se define un LCD de 16 columnas y 2 filas.
LiquidCrystal_I2C lcd(0x20, 16, 2);
3. Caracteres Personalizados
Los caracteres personalizados se crean utilizando arrays de 8 bytes, donde cada byte representa una fila de la matriz de 5x8 de la pantalla LCD.
Ejemplo: Corazón
byte customChar[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
Cada 1
en los bytes enciende un píxel en la matriz, formando la figura deseada.
Dinosaurio del Juego de Google
El dinosaurio se divide en varias partes (superior izquierda, superior derecha, etc.), cada una almacenada en un array personalizado.
byte customChar2[8] = { 0B00000, 0B00000, 0B00010, 0B00010, 0B00011, 0B00011, 0B00011, 0B00011 };
4. Cargar Caracteres Personalizados
Se utilizan índices de 0 a 7 para cargar un máximo de 8 caracteres personalizados en la memoria del LCD.
lcd.createChar(0, customChar); // Corazón
lcd.createChar(1, customChar1); // Carita feliz
lcd.createChar(2, customChar2); // Parte superior izquierda del Dino
5. Impresión de Texto y Caracteres
Se usan las funciones:
lcd.setCursor(columna, fila)
para posicionar el cursor en la pantalla.lcd.print("texto")
para imprimir texto.lcd.write(byte(índice))
para imprimir un carácter personalizado.
Ejemplo
lcd.setCursor(0, 0); // Primera fila
lcd.print("Dino");
Esto imprime el texto “Dino” en la primera fila.
Desafíos
Desafío 1: Cambiar el Diseño del Corazón
- Instrucción: Cambia el diseño del corazón para que sea más grande o tenga una forma diferente.
- Pista: Modifica los bytes dentro del array
customChar
.
Ejemplo:
byte customChar[8] = {
0b00000,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};
Desafío 2: Mover la Posición del Dinosaurio
- Instrucción: Cambia las posiciones en las que se imprimen las partes del dinosaurio para que aparezca en el centro de la pantalla.
- Pista: Modifica las líneas con
lcd.setCursor
en la secciónsetup
.
Ejemplo:
lcd.setCursor(6, 0); // Cambia a la columna 6 en la primera fila
lcd.write(byte(2)); // Parte superior izquierda
Recursos:
Puedes usar el siguiente enlace para personalizar tus propios caracteres: Chareditor.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inicializa la pantalla con la dirección I2C (generalmente 0x20 o 0x27 o 0x3F)
LiquidCrystal_I2C lcd(0x20, 16, 2);
// Define un carácter personalizado (por ejemplo, un corazón)
byte customChar[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
// Otro carácter personalizado (por ejemplo, una carita feliz)
byte customChar1[8] = {
0B00000,
0B00000,
0B01010,
0B00000,
0B00000,
0B10001,
0B01110,
0B00000
};
// Aqui encontraras los caracteres necesarios para crear al Dino de google
// Define los caracteres personalizados para el dino
byte customChar2[8] = { 0B00000, 0B00000, 0B00010, 0B00010, 0B00011, 0B00011, 0B00011, 0B00011 };
byte customChar3[8] = { 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B10000, 0B11001, 0B11111 };
byte customChar4[8] = { 0B00111, 0B01111, 0B01101, 0B01111, 0B01111, 0B11111, 0B11111, 0B11111 };
byte customChar5[8] = { 0B11100, 0B11110, 0B11110, 0B11110, 0B10000, 0B11110, 0B10000, 0B10000 };
byte customChar6[8] = { 0B00001, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 };
byte customChar7[8] = { 0B11111, 0B11111, 0B01111, 0B01111, 0B00010, 0B00010, 0B00011, 0B00011 };
byte customChar8[8] = { 0B11111, 0B11111, 0B00111, 0B00111, 0B00010, 0B00010, 0B00011, 0B00011 };
byte customChar9[8] = { 0B11000, 0B11100, 0B00100, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 };
void setup() {
// Inicializa la pantalla LCD
lcd.init();
lcd.backlight();
// Carga los caracteres personalizados
lcd.createChar(0, customChar); // Carga el corazón en la posición 0
lcd.createChar(1, customChar1); // Carga la carita feliz en la posición 1
// caracteres de dino
lcd.createChar(2, customChar2); // Parte superior izquierda dino
lcd.createChar(3, customChar3); // Parte superior centro1 dino
lcd.createChar(4, customChar4); // Parte superior centro2 dino
lcd.createChar(5, customChar5); // Parte superior derecha dino
lcd.createChar(6, customChar6); // Parte inferior izquierda dino
lcd.createChar(7, customChar7); // Parte inferior centro1 dino
lcd.createChar(8, customChar8); // Parte inferior centro2 dino
lcd.createChar(9, customChar9); // Parte inferior derecha dino
// Imprime texto y caracteres personalizados
lcd.setCursor(0, 0); // Establece el cursor en la primera fila
lcd.print("Dino");
// Muestra el dino en el LCD superior
lcd.setCursor(11, 0); // Primera fila, 11va columna
lcd.write(byte(2)); // Parte superior izquierda
lcd.write(byte(3)); // Parte superior central
lcd.write(byte(4)); // Parte superior derecha
lcd.write(byte(5)); // Parte superior derecha
lcd.setCursor(0, 1); // Establece el cursor en la segunda fila (para la ubicacion)
//lcd.write(byte(0)); // Imprime el carácter personalizado en la posición 0
lcd.print(" ");
//lcd.write(byte(1)); // Imprime el carácter personalizado en la posición 1
// Muestra el dino en el LCD inferior
lcd.setCursor(11, 1); // Segunda fila, primera columna
lcd.write(byte(6)); // Parte inferior izquierda
lcd.write(byte(7)); // Parte inferior derecha
lcd.write(byte(8)); // Parte inferior derecha
lcd.write(byte(9)); // Parte inferior derecha
}
void loop() {
// Puedes agregar otras acciones en el bucle principal
}
Ejemplo extra para animar al Dino
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inicializa la pantalla con la dirección I2C (generalmente 0x20 o 0x27 o 0x3F)
LiquidCrystal_I2C lcd(0x20, 16, 2);
// Define un carácter personalizado (por ejemplo, un corazón)
byte customChar[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
// Otro carácter personalizado (por ejemplo, una carita feliz)
byte customChar1[8] = {
0B00000,
0B00000,
0B01010,
0B00000,
0B00000,
0B10001,
0B01110,
0B00000
};
// Aquí están los caracteres necesarios para crear al Dino de Google
byte customChar2[8] = { 0B00000, 0B00000, 0B00010, 0B00010, 0B00011, 0B00011, 0B00011, 0B00011 };
byte customChar3[8] = { 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B10000, 0B11001, 0B11111 };
byte customChar4[8] = { 0B00111, 0B01111, 0B01101, 0B01111, 0B01111, 0B11111, 0B11111, 0B11111 };
byte customChar5[8] = { 0B11100, 0B11110, 0B11110, 0B11110, 0B10000, 0B11110, 0B10000, 0B10000 };
byte customChar6[8] = { 0B00001, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 };
byte customChar7[8] = { 0B11111, 0B11111, 0B01111, 0B01111, 0B00010, 0B00010, 0B00011, 0B00011 };
byte customChar8[8] = { 0B11111, 0B11111, 0B00111, 0B00111, 0B00010, 0B00010, 0B00011, 0B00011 };
byte customChar9[8] = { 0B11000, 0B11100, 0B00100, 0B00000, 0B00000, 0B00000, 0B00000, 0B00000 };
void setup() {
// Inicializa la pantalla LCD
lcd.init();
lcd.backlight();
// Carga los caracteres personalizados
lcd.createChar(2, customChar2); // Parte superior izquierda dino
lcd.createChar(3, customChar3); // Parte superior centro1 dino
lcd.createChar(4, customChar4); // Parte superior centro2 dino
lcd.createChar(5, customChar5); // Parte superior derecha dino
lcd.createChar(6, customChar6); // Parte inferior izquierda dino
lcd.createChar(7, customChar7); // Parte inferior centro1 dino
lcd.createChar(8, customChar8); // Parte inferior izquierda dino
lcd.createChar(9, customChar9); // Parte inferior centro1 dino
}
void displayDino(int col) {
// Borra las filas para evitar artefactos
lcd.setCursor(0, 0);
lcd.print(" "); // Borra la primera fila
lcd.setCursor(0, 1);
lcd.print(" "); // Borra la segunda fila
// Dibuja el dinosaurio en la nueva posición
lcd.setCursor(col, 0); // Posición para la parte superior del Dino
lcd.write(byte(2));
lcd.write(byte(3));
lcd.write(byte(4));
lcd.write(byte(5));
lcd.setCursor(col, 1); // Posición para la parte inferior del Dino
lcd.write(byte(6));
lcd.write(byte(7));
lcd.write(byte(8));
lcd.write(byte(9));
}
void loop() {
for (int col = 12; col >= 0; col--) { // Mover de derecha a izquierda
displayDino(col);
delay(100); // Retraso para animación
}
for (int col = 0; col <= 12; col++) { // Mover de izquierda a derecha
displayDino(col);
delay(100); // Retraso para animación
}
}