Módulos LCD: Hitachi HD44780
Cuando queramos interactuar con nuestro aparato lo primero que interesa es poder ver datos y para ello nada mejor que un display LCD. (si no tienes ningún display siempre podrás usar el puerto serie que lleva el propio soft de Arduino).
Este es el esquema del archiconocido display Hitachi HD44780. aunque implícitamente no lo ponga casi todos se basan en él, así que es posible que tengas uno y el conexionado sea idéntico.
Pin description
PIN NUMBER | SYMBOL | FUNCTION |
1 | Vss | GND |
2 | Vdd | + 3V or + 5V |
3 | Vo | Contrast Adjustment |
4 | RS | H/L Register Select Signal |
5 | R/W | H/L Read/Write Signal |
6 | E | H → L Enable Signal |
7 | DB0 | H/L Data Bus Line |
8 | DB1 | H/L Data Bus Line |
9 | DB2 | H/L Data Bus Line |
10 | DB3 | H/L Data Bus Line |
11 | DB4 | H/L Data Bus Line |
12 | DB5 | H/L Data Bus Line |
13 | DB6 | H/L Data Bus Line |
14 | DB7 | H/L Data Bus Line |
15 | A/Vee | + 3.5V for LED/Negative Voltage Output |
16 | K | K Power Supply for B/L (OV) |
Si vas a probar una que hayas reciclado de otro proyecto y quieras hacerla funcionar no olvides poner una resistencia variable de 10 kΩ para el control del contraste:
Pero si no quieres grandes quebraderos de cabeza por menos de 4 Euros tienes una que se pincha directamente sobre Arduino y tiene hasta botones para hacer un "hipotético menú":
Para el código y los pines:
/*
Metemos un texto fijo y la columna de abajo seleccionamos con teclas
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int adc_key_val[5] = {50, 200, 400, 600, 800 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;
boolean luzEncendida=true;
boolean cursorActivo=false;
unsigned long time;
int x=0;
char caracterActual = 'A';
void setup()
{
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.print("Hello World !!!");
time = millis();
// pinMode(10, OUTPUT);
}
void loop()
{
if (millis()-time > 10000) { // Si han pasado mas de 10 segundos apagamos la luz
pinMode(10, OUTPUT);
digitalWrite(10, LOW);
luzEncendida=false;
}
if (millis()-time > 5000) { // Si han pasado mas de 5 segundos apagamos el cursor
lcd.noBlink();
cursorActivo=false;
}
adc_key_in = analogRead(0); // Leemos el valor de la pulsacion
key = get_key(adc_key_in); // Obtenemos el boton pulsado
if (key != oldkey) // if keypress is detected
{
delay(50); // Espera para evitar los rebotes de las pulsaciones
adc_key_in = analogRead(0); // Leemos el valor de la pulsacion
key = get_key(adc_key_in); // Obtenemos el boton pulsado
if (key != oldkey)
{
time = millis(); // TODO: falta la comprobacion de si se ha desbordado el tiempo
if (!luzEncendida) { // Al pulsar cualquier tecla encendemos la pantalla
pinMode(10, INPUT);
luzEncendida=true;
}
else { // si la pantalla esta encendida seguimos funcionando normalmente
lcd.setCursor(x, 1);
oldkey = key;
if (key >=0){ // Si se ha pulsado cualquier tecla
lcd.blink(); // Mostramos el cursor parpadeando
cursorActivo=true;
}
if (key == 0){ // Se ha pulsado la tecla derecha
x++;
if (x>15) x=15;
caracterActual='A';
}
if (key == 1) { // Se ha pulsado la tecla arriba
caracterActual++;
if (caracterActual > 'Z') caracterActual='Z';
lcd.write(caracterActual);
}
if (key == 2) { // Se ha pulsado la tecla abajo
caracterActual--;
if (caracterActual < 'A') caracterActual='A';
lcd.write(caracterActual);
}
if (key == 3) { // Se ha pulsado la tecla izquierda
x--;
if (x<0) x=0;
caracterActual='A';
}
if (key == 4){ // Se ha pulsado la tecla de seleccion
}
lcd.setCursor(x, 1);
}
}
}
delay(100);
}
// Convertimos el valor leido en analogico en un numero de boton pulsado
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)k = -1; // Error en la lectura
return k;
}
-----------------------------------------------------------O-------------------------------------------------------
-----------------------------------------------------------O-------------------------------------------------------
Recuerda:
- Si cargas otro ejemplo lo importante es decirle en el programa donde están las patillas:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
- Cambia si es necesario el número de líneas y longitud de caracteres de tu LCD:
lcd.begin(16, 2); 16 caracteres y dos líneas
lcd.begin(20, 4); 20 caracteres y 4 líneas
-----------------------------------------------------------O-------------------------------------------------------
Esquema que uso yo con todos los LCD´s para que sean compatibles: