Siempre hay un proyecto que requiere mostrar información en un LCD, y cualquier proyecto siempre gana mucho con un Display. Veamos como presentar datos y gráficos en un LCD.

Utilizaremos un LCD monocromo de 84×48 pixels muy extendido por su bajo coste, que originalmente fue utilizado en los Nokia 5110 y las librerías PCD8544 y GFX de Adafruit

El LCD lo puedes encontrar por menos de 3€ con gastos de envío incluidos aquí.

Sus principales ventajas son bajo coste, bajo consumo y muchísima documentación en internet.

El LCD

Utilizaremos 5 pines digitales ademas de la retroiluminación, VCC y GND.

Librerias Arduino

Hay varias librerías disponibles para trabajar con LCDs, a mi parecer la mejor es la Adafruit-PCD8544-Nokia-5110-LCD-library.

Descarga la librería desde aquí, la PCD8544 necesita a su vez la Adafruit-GFX-Library que puedes descargar aquí.

Con las libs en local, abre Arduino y añade las librerías, menú Programa/Incluir Libreria/Añadir Libreria Zip…

Una vez añadidas puedes ir a Ejemplos/Librerías personalizadas y abrir el ejemplo pcdtest.

Esquema de Conexiones Arduino

Podemos conectar de dos formas, por SPI o sin el.

Sin SPI, conexión estandar.

Funcionará en todos los dispositivos aunque el rendimiento no es tan eficiente como por SPI. De cualquier modo para la mayoría de proyectos es suficiente.

pin 3 – Serial clock out (CLK)
pin 4 – Serial data out (DIN)
pin 5 – Data/Command select (D/C)
pin 6 – LCD chip select (CE)
pin 7 – LCD reset (RST)

Código de inicialización:

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

Con SPI

Hardware SPI más rápido pero deben usarse ciertos pines por defecto y solo lo soportan algunas placas:
SCK is LCD serial clock (SCLK) – this is pin 13 on Arduino Uno
MOSI is LCD DIN – this is pin 11 on an Arduino Uno
pin 5 – Data/Command select (D/C)
pin 6 – LCD chip select (CS)
pin 7 – LCD reset (RST)

Para Inicializar con SPI:

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

Respecto al código es la única diferencia, solo afecta a los pines y una vez establecidos el resto del código es común.

El código, escribiendo texto en el LCD

El siguiente código muestra un texto simple por el display.

Modifica la inicialización al principio del código según conectes los pines con o sin SPI:

  • Con SPI: Adafruit_PCD8544 display = Adafruit_PCD8544(5, 6, 7);
  • Sin SPI: Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

// *****  Inicialización por SPI, *****
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 6, 7);
// **** Inicialización sin SPI, pines 3 y 4 ***
//Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 6, 7);

#define ledRETROILUM 12

void InitDisplay(){
  pinMode(ledRETROILUM, OUTPUT);  
  display.begin();
  display.setContrast(50);
  display.display();
  digitalWrite(ledRETROILUM, HIGH); 
}

void testTXT1(){
  display.clearDisplay();   // clears the screen and buffer
  setFont(1, WHITE, BLACK);  
  drawTXT(0,0," altaruru.com ");
  setFont(1,BLACK);
  drawTXT(0,8,"lcd nokia 5110");
  drawTXT(0,16,"-");
  drawTXT(0,24,"-");
  drawTXT(0,32,"-");
  drawTXT(0,40,"(c) 2019-03-20");  
  display.display(); // actualiza/refresca display  
}

void setup()   {
  Serial.begin(9600);
  InitDisplay();  
  testTXT1();
}

void loop() {
}

void setFont(int isize, int Color1){
  setFont(isize, Color1, WHITE);
  
}
void setFont(int isize, int Color1, int Color2){
  display.setTextSize(isize);
  display.setTextColor(Color1, Color2);
  // altura de fuente size 1: 8 pixels
  // 6 lineas
  // 14 letras por linea  
}
void drawTXT(int x, int y, String smsg){
  display.setCursor(x,y);
  display.println(smsg);    
}

La función InitDisplay() incluye el código necesario para inicializar el Display y testTXT1() es un ejemplo que escribe varias palabras.

Funciones principales de Adafruit_PCD8544 display:

  • display.setTextSize(isize) establece tamaño de la fuente.
  • display.setTextColor(letra, fondo) establece color de la fuente y el fondo.
  • display.setCursor(x, y) posiciona el cursor para escribir.
  • display.println(mensaje) escribe el texto donde esta el cursor.
  • display.display() refresca/actualiza pantalla.
  • display.clearDisplay() limpia/borra pantalla

Con fuente de tamaño 1, tenemos capacidad para 6 lineas y hasta 14 caracteres por linea.

La función drawTXT(int x, int y, String smsg) unifica en una sola llamada posicionamiento de cursor y escritura del texto.

Funciones de dibujo

Puedes dibujar figuras geométricas o bitmaps, algunas funciones de dibujo:

  • display.drawLine()
  • display.drawRect()
  • display.drawCircle()
  • display.fillRect()
  • display.drawTriangle()
  • display.fillTriangle()
  • display.drawRoundRect()
  • display.fillRoundRect()
  • display.drawBitmap()

Algunos ejemplos directamente sacados del ejemplo pcdtest que facilita la librería:

void testdrawcircle(void) {
  for (int16_t i=0; i<display.height(); i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, BLACK);
    display.display();
  }
}

void testfillrect(void) {
  uint8_t color = 1;
  for (int16_t i=0; i<display.height()/2; i+=3) {
    // alternate colors
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, color%2);
    display.display();
    color++;
  }
}

void testdrawtriangle(void) {
  for (int16_t i=0; i<min(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(display.width()/2, display.height()/2-i,
                     display.width()/2-i, display.height()/2+i,
                     display.width()/2+i, display.height()/2+i, BLACK);
    display.display();
  }
}

Eso es todo, como veis es relativamente fácil incluir un LCD en vuestros proyectos.

Cualquier comentario o duda ya sabéis.

Feliz código.

Deja tu comentario