jueves, 9 de agosto de 2012

Crear caracteres para LCD 16x2 en Arduino - Actualizado!

Hace ya un tiempo mostré como conectar un LCD 16x2 I2C al arduino, en esta oportunidad mostraré como crear caracteres especiales para ser mostrados en dichas pantallas.
Cada uno de los caracteres de la pantalla está formado por 5x8 puntos, los cuales son encendidos/apagados para formar un caracter. Sabiendo ésto podemos crear cualquier caracter que sea representable por esos puntos.
Por ejemplo, crearemos un caracter "batería". Para ello tenemos que determinar qué puntos deben encenderse.
En el ejemplo de arriba, tenemos la representación visual del caracter "batería" y al costado la representación binaria de cada línea. Finalmente, el nuevo caracter estará definido por un arreglo de 8 bytes.

-- UPDATE 12/08/2012 --
Les dejo un creador de caracteres online para LCD 16x2 con Arduino
--

Les dejo ejemplo para LCD 16x2 con interfaz paralela e I2C.

// incluyo la librería para LCD
#include <LiquidCrystal.h>
// Inicializo librería para LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
 
// defino el nuevo caracter
byte letra[8] = { B01110, B11011, B10001, B10001, B10001, B10001, B10001, B11111 }; 
 
void setup() {
    // creo el caracter
    lcd.createChar(0, letra);
    lcd.begin(16, 2);
    // escribo en pantalla el nuevo caracter
    lcd.write(0);
} 
 
void loop() {}


// Incluyo librería para I2C
#include <Wire.h>
// Incluyo librería para LCD vía I2C
#include <LiquidCrystal_I2C.h>
 
// Inicializo librería LCD I2C
// 0x27 es la dirección del LCD. 16 y 2 las dimensiones del LCD
LiquidCrystal_I2C lcd(0x27,16,2);
 
// defino el nuevo caracter
byte letra[8] = {B01110, B11011, B10001, B10001, B10001, B10001, B10001, B11111};
 
void setup(){
  lcd.init();
  lcd.backlight();
  // registro el nuevo caracter
  lcd.createChar(0, letra);
  lcd.home();
  // muestro en el LCD el nuevo caracter
  lcd.write(0);
}
 
void loop(){}

Acá les dejo un video donde creo una animación de "batería cargando" con caracteres personalizados.

5 comentarios:

Sebastián Contreras dijo...

Amigo, solo te falta una cosa. Para el ejemplo sin el I2C, falta en el comando "lcd.write(0);" incluir "byte", quedando de esta manera: "lcd.write(byte(0));", si no se incluye generará un error.

Saludos

Javier dijo...

Muchas gracias Sebastían, me daba error y gracias a ti lo he solucionado. Un saludo!

Mauricio dijo...

a mi no me funciona de ninguna las siguientes formas: lcd.wrtie(byte(0)); ni lcd.print(0,BYTE); me pueden decir alguna otra solucion?

Jorge Eduardo Risco Valenzuela dijo...

A mi no me funciona de ninguna manera

adjunto el error

Arduino:1.6.9 (Windows 7), Tarjeta:"Arduino Nano, ATmega328"

caracteres:8: error: invalid conversion from 'int' to 't_backlighPol' [-fpermissive]

LiquidCrystal_I2C lcd(0x27,16,2);

^

In file included from C:\Users\Jorge\Documents\Arduino\caracteres\caracteres.ino:4:0:

C:\Users\Jorge\Documents\Arduino\libraries\NewliquidCrystal/LiquidCrystal_I2C.h:53:4: error: initializing argument 3 of 'LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t, uint8_t, t_backlighPol)' [-fpermissive]

LiquidCrystal_I2C (uint8_t lcd_Addr, uint8_t backlighPin, t_backlighPol pol);

^

C:\Users\Jorge\Documents\Arduino\libraries\NewliquidCrystal/LiquidCrystal_I2C.h: In function 'void setup()':

C:\Users\Jorge\Documents\Arduino\libraries\NewliquidCrystal/LiquidCrystal_I2C.h:154:9: error: 'int LiquidCrystal_I2C::init()' is private

int init();

^

caracteres:14: error: within this context

lcd.init();

^

exit status 1
invalid conversion from 'int' to 't_backlighPol' [-fpermissive]

Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.

Podrá ser la librería que estoy usando

La de Francisco malpartida

Gracias

Jorge Risco

jaafer morales m. dijo...

y para poner un corazon como es?