RETO 4: 16×2 LIQUID CRYSTAL DISPLAY, PANTALLA LCD

En esta fase del miniproyecto del PARKING DOMÓTICO, vamos a utilizar un componente que nos va a permitir cambiar la forma en la que podemos visualizar datos de nuestros programas en Arduino, y así no tener que utilizar el monitor serie. Para ello utilizamos un componente denominado actuador LCD – Liquid Crystal Display. Se trata de un actuador que va a trabajar como output digital en nuestro montaje.

Concretamente una pantalla Hitachi HD44780 (una de las más extendidas en el mercado por su bajo precio y sencillez) de 16×2 que presenta 16 caracteres en horizontal y 2 filas, o líneas, en vertical (también las hay de 20×2, 20×4 y 40×2). Estos displays tienen el inconveniente de que son muy pesados de cablear y que no admiten ciertos caracteres de escritura como º, ñ, €… (los cuales siempre podremos definir con arrays de 8×8, ya que el display tiene una pequeña memoria RAM integrada que nos permitirá configurar nuestros propios caracteres o dibujos).  Pero presentan varias ventajas indiscutibles:

  • Bajo consumo.
  • Precio muy asequible y disponibles en varios tamaños y configuraciones, por ejemplo 16×4.
  • Muy sencillos de programar.
  • Disponen de retroiluminación de color azul o verde, cuyo contraste puede ser regulado gracias a un potenciómetro.

Estos componentes suelen necesitar de un trabajo previo de soldadura puesto que para utilizarlos tenemos que soldar una hilera de pines o peine de pines macho-macho (también los hay macho-hembra) para que de esta forma podamos luego conectar nuestros cables desde el LCD hacia Arduino a través de una placa de prototipado.

Para conectar el actuador LCD, tal y como podemos ver en el esquema, realizamos las siguientes conexiones:

  • Entradas del LCD 2,3,4,5,10,12, empezando a contar los pines del LCD por la derecha, a las salidas digitales del Arduino 2,3,4,5,11,12. Tendremos que modificar nuestros pines de posición si están ocupando esos números.
  • Entradas 0,11,15 del LCD a GND.
  • Entrada 1 del LCD a VCC (5V) con una resistencia y entrada 14 directamente sin resistencia.
  • Montamos un potenciómetro ( o resistor variable, input analógico) con su salida de datos a la entrada 13 del LCD (que nos servirá para variar la intensidad de la luz de nuestro LCD y poder ver la pantalla mejor.

.

16x2 liquid crystal display LCD montaje en Arduino

.

Si añades este montaje a lo que ya tenías anteriormente te debería quedar algo equivalente a esto:

.

parking domótico con arduino: 3leds; 1servo180; botones; 1pantallaLCD16x2

.

Una vez tenemos el montaje realizado, vamos a empezar con la programación. Para ello, en esta ocasión utilizaremos la librería LiquidCrystal, de la cual utilizaremos las siguientes funciones para visualizar datos en la pantalla:

  • LiquidCrystal lcd(12, 11, 5, 4, 3, 2): antes de la función setup(). Con esta instrucciones creamos el objeto “lcd” que incluirá todas las funciones que vamos a comentar a continuación. Los números son para indicarle a la librería cuales son las salidas digitales de Arduino en las que hemos conectado los cables desde el LCD.
  • lcd.begin(): para especificar la configuración concreta de nuestra pantalla. Le decimos que tendrá 16 caracteres en horizontal (de 0 a 15) y 2 filas en vertical (fila inferior y=1; fila superior y=0).

.

explicación coordenadas cartesianas pantalla LCD 16x2

  • lcd.setCursor(): la usamos antes de visualizar algo, para situar el cursor en la posición deseada, su posición vendrá definida con dos coordenadas cartesianas (x,y) de los ejes ortogonales (COLUMNA, FILA). El primer valor será para colocar el cursor en la posición de 0 a 15 COLUMNAS y el segundo para decirle si es en la FILA SUPERIOR (y=0) o en la FILA INFERIOR (y=1).
  • lcd.print(): la utilizaremos para visualizar los datos deseados.

Para comprobar el perfecto funcionamiento vamos a cargar de la librería de ARCHIVO > EJEMPLOS > LiquidCrystal > HelloWorld, donde podemos modificar el mensaje de la función lcd.print() y modificar la posición de salida con la función lcd.setCursor().

Éste es el código original del proyecto:

.

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print(“hello, world!”);
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}

.

Ahora que ya sabes cómo sacar datos por el LCD, puedes PRACTICAR Y AMPLIAR TU APRENDIZAJE incorporando nuevos componentes. Por ejemplo, montar un servo que gire de 0º a 180º y vuelva a 0º, visualizando por pantalla la posición del servo en cada momento. Otra ampliación podría ser sacar el texto que introduzcamos por nuestro Monitor Serial, sacar valores del sensor de temperatura, etc. etc.

OTRAS AMPLIACIONES:

  • PARPADEO DE CURSOR: Programar un cursor de tal forma que parpadee en la ubicación que nosotros queramos de la pantalla de 16×2. Para ello necesitaremos usar las funciones .noCursor(); y .cursor(); Este sería un skecth de ejemplo:
void setup() {
 
 lcd.begin(16, 2);                   // set up the LCD's number of columns and rows 
 lcd.setCursor(0, 0);                // Pone el cursor en las coordenadas (0,0)
 lcd.print("This is line 0");        // Escribe el LCD
 lcd.setCursor(0, 1);                // Ponemos el cursor en las coordenadas (0, 1)
 lcd.print("This is line 1");        // Escribe el LCD
 lcd.setCursor(14, 0);               //Coloca el cursor en la coordenada (14, 0) 
}

void loop() {
 
 lcd.noCursor();                     // Apagar cursor
 delay(500);

 lcd.cursor();                       // Encender cursor
 delay(500);
}
  • MENSAJE QUE VIENE Y VA: Desplazar un texto de derecha a izquierda de la pantalla continuamente.  Para ello necesitaremos usar las funciones .scrollDisplayRight(); .scrollDisplayLeft(); Se trata de una programación muy interesante porque haremos uso de la estructura de control FOR ya vista anteriormente en el coche fantástico, aquí
void setup() {
 
 lcd.begin(16, 2);      // set up the LCD's number of columns and rows: 
 lcd.print("HI DUDE!"); // Print a message to the LCD. HI DUDE! es untexto de 8 caracteres. 
}

void loop() {
 for (int pos = 0; pos < 8; pos++) { // Creamos una variable llamada pos (posición) que la inicializaremos con el valor 0 para dar uso a la estructura de control for. 
 lcd.scrollDisplayRight();           // Con la estructura for repetimos el desplazamiento hacia la derecha 8 veces.
 delay(200);                         // Lo desplazamos 8 veces ya que 16 (longitud display) - 8 (texto impreso) = 8 movimientos a la derecha.
 }
 
 for (int pos = 0; pos < 8; pos++) {
 lcd.scrollDisplayLeft();
 delay(450);
 }
 }
  • DESPLAZANDO UN TEXTO POR TODA LA PANTALLA: Desplazar un texto de izquierda a derecha de la pantalla y luego que aparezca en la fila inferior por la derecha y desaparezca por la izquierda, y así continuamente.  Para ello necesitaremos usar las funciones .length(); .substring(); .clear() o bien las siguientes: .scrollDisplayRight(); .scrollDisplayLeft(); 

La función .length(); Sirve para obtener el tamaño del texto, es decir, el número de caracteres que tiene incluidos espacios, es decir, la función length() nos devuelve un número entero indicando su tamaño. 

 La función .substring(numero) devuelve un trozo del texto. El número indica a partir de qué letra vamos a coger por ejemplo si hacemos “WELCOME-DOMOTIC PARKING!”.substring(3) nos devolverá “COME-DOMOTIC PARKING!”. Recuerda que es un lenguaje de índice cero, el primer carácter del texto empieza por cero.

La función .clear(): limpia totalmente la pantalla de los caracteres impresos.

Como acabas de aprender en la anterior ampliación de reto, también se podría programar esto con las funciones .scrollDisplayRight(); .scrollDisplayLeft(); Al final dejo a tu entendimiento cuál crees que es más fácil de programar, y por tanto más sencillo para ti.

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
String texto = "WELCOME-DOMOTIC PARKING!";
const int VELOCIDAD = 250;

void setup() {
 lcd.begin(16, 2);
}
 
void loop() {
 
 const int longitud=texto.length();    // Creamos una constante "longitud" que será un número entero y tendrá el valor de la longitud o tamaño total del "texto" (caractéres + espacios).
 for(int i=longitud; i>0 ; i--)        // Mostramos entrada texto por la izquierda hasta que la primera letra (W) alcanza la coordenada (0, 0)
 {
 String texto_cortado = texto.substring(i-1); 
 /* La función .substring(numero) devuelve un trozo del texto. El número indica a partir de qué letra vamos a coger por ejemplo si hacemos “WELCOME-DOMOTIC PARKING!”.substring(3) 
 nos devolverá “COME-DOMOTIC PARKING!”. Recuerda que es un lenguaje de índice cero, el primer carácter del texto empieza por cero.
 */
 lcd.setCursor(0, 0);                  //Situamos el cursor
 lcd.print(texto_cortado);             // Escribimos el texto
 delay(VELOCIDAD);                     // Esperamos
 }
 for(int i=1; i<=16;i++)               // Una vez que se coloca elinicio del texto (o letra W) en la coordenada (0, 0) desplazamos el texto hacia la derecha para que recorra toda la longitud del display (16 unidades). 
 {
 lcd.clear();
 lcd.setCursor(i, 0);
 lcd.print(texto);
 delay(VELOCIDAD);
 } 
 for(int i=16;i>=1;i--)                // Mostramos el texto por la derecha en la segunda fila y lo desplazamos hacia la izquierda hasta que recorra toda la pantalla (16 unidades) 
 {
 lcd.clear();
 lcd.setCursor(i, 1);
 lcd.print(texto);
 delay(VELOCIDAD);
 }
 for(int i=1; i<=longitud ; i++)        // Sacamos el texto por la izquierda de la pantalla para conseguir el efecto de que desaparece. 
 {
 String texto_cortado = texto.substring(i-1);
 lcd.setCursor(0, 1);
 lcd.print(texto_cortado);
 delay(VELOCIDAD);
 lcd.clear();
 }
}

Si quieres profundizar en cómo sacar diseños personalizados por la pantalla LCD (definiendo tus propios caracteres o iconos, como por ejemplo un come cocos) te recomiendo esta entrada con divertidísimas prácticas.

En el siguiente reto explicaremos cómo introducir en nuestro skecth el programa para realizar el conteo de las plazas de nuestro parking domótico, de tal forma que el LCD nos informe de ello y que al pulsar los distintos botones de ENTRADA o SALIDA se sume o reste una plaza a la capacidad total. Si te atreves puedes ir intentándolo, y recuerda…

«The sky is the limit»