LCD Nokia 5110 – PCD8544

Dentro de la gama de LCD´s que podemos conectar a Arduino, se ha hecho muy popular el display PCD8544 que llevaban los teléfonos móviles Nokia 5110 y 3310. Es un display gráfico de 84 x 48 pixels, monocromo y  con posibilidad de retroiluminación.

      Como quiera que desarmar uno de estos teléfonos  para sacar el display e intentar cablearlo es posible, pero poco recomendable, (porque soldar cables en ellos es bastante complicado), hay que decir que  los venden por menos de 3 euros en tiendas chinas por lo que más barato imposible.
  
Como cablearlo:   Yo uso normalmente este:  

LCD PCD 8544 NOKIA 5110

Patillaje LCD
   1- RST   2- CE  3- DC  4 – DIN   5 – CLK   6 – VCC   7-LIGHT     8-GND
6 7 5 4 3 3.3 V GND (*) GND
Patillaje Arduino

(*) a través  resistencia de 220 Ohmios

                                      

Para probarla podemos extraer varios ejemplos de esta página: http://playground.arduino.cc/Code/PCD8544

En estos ejemplos no hacen falta librerías adicionales porque los caracteres son definidos en el mismo código.

También podrías crear un nuevo símbolo o carácter si lo necesitas en ésta página:

http://www.carlos-rodrigues.com/projects/pcd8544/

 

Otros ejemplo sencillos para practicar:

http://www.securlab.es/files/otro_test_hello_world_LCDNokia5110_sin_librerias.ino http://www.securlab.es/files/reloj_digital_con_pantalla_nokia.ino

Si quieres otros ejemplos más elaborados, los que ha hecho Carlos Rodrigues me gustan bastante:

https://github.com/carlosefr/pcd8544/blob/master/examples/HelloWorld/HelloWorld.ino

https://github.com/carlosefr/pcd8544/blob/master/examples/Thermometer/Thermometer.ino

 

También lo puedes descargar todo completo con sus librerías:

https://pcd8544.googlecode.com/files/PCD8544-1.4.zip

 

Y por último está la famosa librería de Adafruit:

https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library

 

Importante: El código de Adafruit y el patillaje no es compatible con las anteriores, para hacerlo compatible tienes que cambiar la línea:

                            Adafruit_PCD8544 display = Adafruit_PCD8544(76543);

por:

                              Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 6);

 

Puedes descargarlo aquí ya modificado:

http://www.securlab.es/files/pantalla_nokia_adafruit_patillaje_adaptado.ino

También hay que tener en cuenta que hay mucho código de LCD de este tipo con un  patillaje distinto, eso es debido a que el modelo anterior que vendían era diferente.

 

 

LCD´s reciclados

Es fácil encontrarse LCD´s en aparatos y antes de tirarlos se puede intentar reciclarlos para usos futuros, luego se comprueba con cierta alegría que son compatibles HD44780 y por tanto usables. Aunque hay que decir que alguna vez cambia la situación de algún pin, como por ejemplo la alimentación.

Aquí unos pocos que he encontrado:

 

 

 

Otras veces aún teniendo el datasheet y averiguando los distintos pins es imposible hacerlas funcionar aquí un par de ejemplos, son LCD de máquinas antiguas Olivetti:

 

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.

16x2 char lcd pinout 4 bit interface 16x2 char lcd pinout 4 bit interface less2 HD44780_pins

 

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ú”: (Algunas unidades que venían últimamente de tiendas de China venían defectuosas, esperemos que lo subsanen pronto).

lcd keypad

SKU083549k

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;
}

 

Descárgate el fichero: http://www.securlab.es/files/HD44780_con_botones.ino

 

 

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
Esquema que uso yo con todos los LCD´s para que sean compatibles:
lcd_schem ARDUINO LCD nuevo patillaje