bclose

Displays LCD

Usando displays de texto LCD 16x2 con Arduino

Objetivos

 

 

    • Vamos a montar un display LCD de 16×2.
    • Veremos cómo enviar información
    • Definiremos algunos caracteres especiales
 

Material requerido.

Imagen de Arduino UNO

Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.

Protoboard

Una Protoboard.

conexiones

Cables  de protoboard

Pot

Un Potenciómetro.

Display LCD

Un display LCD, de 16×2 o 16×4.

tienda online prometec

Los displays LCD

 

Los displays LEDs de 7 segmentos, que vimos en las sesiones anteriores, están muy bien, son baratos y prácticos, pero tienen el inconveniente de que no pueden mostrar mensajes de texto, sino solo números.

Se echa de menos algún sistema para mostrar mensajes de texto sencillos, y por eso se comercializan los displays LCD. Son faciles de encontrar en diversos formatos :  16×2 (16 caracteres x 2 líneas) o LCD 16×4 (16 caracteres x4 lunes).

 
  • LCD viene del inglés Liquid Crystal Display, o sea Pantalla de cristal liquido.
 

Son una opción muy sencilla de usar, y además, dan un toque muy pro a vuestros proyectos, y por eso, en los últimos años los displays LCD han ganado mucha aceptación en productos comerciales de todo tipo.

Básicamente porque:

 
  • Son baratos.
  • Están disponibles en varios tamaños y configuraciones.
  • Son de bajo consumo.
  • Muy prácticos si te basta con mostrar solo texto (y algunos caracteres especiales).
 

En esta sesión  veremos cómo conectarlos a vuestros Duinos y cómo usarlos para sacar mensajes al exterior.

 

Antes de empezar

 

Aunque, últimamente, estos displays suelen venir con los pines soldados, todavía hay muchos sitios que cuando compras uno de estos, te lo envían en kit, con los pines aparte para que los sueldes

 
  • En algún momento tendremos que hablar de cómo soldar componentes, pero ese día, aún no ha llegado.
 
detalle LCD 16x2

 

Lo primero que tienes que saber, es que tienes que soldarlos, y que no vale sujetar los pines de algún modo más o menos extravagante. Los sueldas y punto. Hazte a la idea. Cualquier otra solución acabara funcionando mal, o directoramente con el display quemado.

Cuando lo tengas listo, pincha el display en la protoboard, dejando sitio para el resto de componentes y cables, recuerda que habrá muchos, así que se generoso con el espacio que dejas.

 

Diagrama de conexión

 

Aquí teneis el esquema de conexión:

Panel LCD 16x2

Y este es el esquema para potoboard:

Protoboard Panel LCD 16x2

La conexión no es complicada, pero requiere ser cuidadoso. Asi que vamos a ir paso a paso con los diferentes cables. Empieza conectando tensión y GND a la protoboard.

Paso 1

Vamos ahora a a conectar la alimentación el panel LCD. Conecta el pin16 del LCD a Ground y el 15 a 5V

Paso 2

Si conectas ahora el cable USB a tu Duino, el LCD debería iluminarse, si no, revisa tus cables antes de seguir.

Vamos a conectar ahora, el potenciómetro de ajuste. Para ello conecta uno de los extremos del pot a GND y el otro a 5V. El centro al pin 3 del LCD.

Aprovechemos también para dar tensión al panel LCD, El pin 1 va a GND y el 2 a tensión:

Paso 3

Si todo ha ido bien, ya podemos encender el dispay y probarlo. Conecta el USB a tu Arduino y veamos. Si vas girando el potenciómetro, en algún momento tienes que ver unos cuadraditos en la pantalla, en caso contrario revisa las conexiones. No sigas, si no ves esto.

Img_33_6

Si ya veis las matrices de puntos en la pantalla, podemos seguir.

Vamos a conectar ya los pines de datos y control. Sin entrar en muchos detallas, no vamos a usar todos los pines disponibles, porque no los necesitamos. Solo usaremos dos pines de control, RS y EN y los 4 pines de datos D7, D6, D5, y D4 . No necesitamos mas por ahora.

Vamos con las conexiones de control del display:

RW, LCD pin 5             GND
RS, LCD pin 4             Arduino pin 7
EN, LCD pin 6             Arduino pin 8

Y ya solo nos quedan los 4 cables de datos.

DB7, LCD pin 14          Arduino pin 12
DB6, LCD pin 13          Arduino pin 11
DB5, LCD pin 12          Arduino pin 10
DB4, LCD pin 11          Arduino pin  9
Paso 4

 

El programa de control

 

Vamos a usar una librería de control del panel LCD, que viene incluida en nuestro Arduino. Pinchad en:

\\Programa\Importar Libreria\LiquidCrystal

Y ahora podemos importar uno de los ejemplos o escribir el nuestro, comentando el código.Lo primero es que al importar la librería nos ha escrito esto:

#include <LiquidCrystal.h>

Despues, hay que inicializar la librería. Creamos una instancia llamada lcd, de la clase LiquidCrystal y le pasamos como parámetros los pines que hemos usado:

LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //    ( RS, EN, d4, d5, d6, d7)
 
  • Tened cuidado porque los pines que hemos usado, no corresponden a los ejemplos de Arduino, así que podéis cargarlos, peroaseguraros de cambiar la línea de definición de los pines, o no correrán.
 

El resto es sencillo

void setup()  
   {
       lcd.begin(16, 2); // Fijar el numero de caracteres y de filas
       lcd.print("Prometec.net"); // Enviar el mensaje
   }

void loop() 
   {
       lcd.setCursor(0, 8);  // set the cursor to column 0, line 1
       lcd.print(millis() / 1000);  // print the number of seconds since reset:
   }
 
  • Cuidado: Como siempre la primera linea, la superior, es la linea 0 y la segunda la linea 1.
 

Estos display son muy pesados de cablear, pero muy sencillos de utilizar.

Vamos a probar sacando un reloj (muy sencillo de momento). Si recordáis las funciones que usamos en las ultimas sesiones, podemos recuperar alguna para presentar el valor de millis() como un reloj

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup() 
   {
       lcd.begin(16, 2);           // Fijamos el numero de caracteres y filas
       lcd.print("Prometec.net");  // Aqi va el mensaje
   }

void loop()
   {
       lcd.setCursor(6, 1);    // Ponte en la line 1, posicion 6
       String s = reloj() ;
       lcd.print(s) ;
   }
String reloj()
   {
       int n = millis() / 1000 ;       // Lo pasamos a segundos
       int segundos = n % 60  ;
       int minutos =  n / 60  ;

       String S = String(minutos) + ":" + String(segundos);
       return (S);
   }

Merece la pena, comentar algunas cosas de este código. En primer lugar en la función reloj, calculamos los minutos y segundos a partir del reloj interno de Arduino en milisegundos, no hay nada nuevo en esto. Pero fijaros que hemos definido reloj como String:

String reloj()

Eso significa que vamos a devolver un parámetro tipo String a quien nos haya llamado. En algún punto de la función habrá que hacer un return( String).

Fijaros que definimos dentro de la función un string llamado s:

String S = String(minutos) + ":" + String(segundos);

En esta línea no hay que confundir (aunque se escriben exactamente igual), el tipo String para definir S, con la función String(n) que convierte un numero n en un string de texto para que pueda mezclar el número de los minutos y los segundos separados por un símbolo de “:”.

Al final le añadimos un par de espacios en blanco, para evitar arrastrar fantasmas en la pantalla

 
  • Quita los espacios y miro lo que pasa en el cambio de minuto. ¿Cómo lo arreglarías, sin el truco de poner esos espacios al final? Piensalo.
 

En la función loop, hemos usado

lcd.print(s) ;

Para sacar el mensaje de texto. Todo lo que ya sabéis de Serial.print() se usa exactamente igual con esta instrucción. Y por último, tenemos una línea como esta:

lcd.setCursor(6, 1);    // Ponte en la line 1, posicion 6

Que lo que hace es posicionar el cursor del panel, en la posición 6 de la segunda línea, para escribir la hora centrada. Aquí os dejo un mini video con el resultado.

La librería LCD, viene con varios ejemplos muy interesantes, que os conviene probar. Recordad, simplemente, que tenéis que cambiar las definiciones de los pines para que corran.

Un ejemplo particularmente interesante, es el de CustomCharacter, en el que define una serie de símbolos especiales y los mueve por la pantalla en función de los valores que lee de un potenciómetro.

Sin llegar a tanta sofisticación, es muy interesante que veamos cómo definir algunos caracteres especiales, porque en la tabla base del LCD, no están incluidas ñ, acentos, grados, o €. Así que dependiendo del uso que le deis pude seros de interés saber cómo definir tus propios símbolos.

 

Definiendo tus propios caracteres

 

Vamos a definir un carácter propio, para digamos, el símbolo de grados centígrados,  por ejemplo.

Lo primero que tenéis que saber, es que los caracteres se definen con un array ( si, de nuevo) de 8×8, como si los dibujarais en una cuadricula de ese tamaño, y rellenando el cuadradito completo.

Así por ejemplo para el símbolo del grado seria:

Definiendo simbolos en un LCD
byte grado[8] =
 {
    0b00001100,     // Los definimos como binarios 0bxxxxxxx
    0b00010010,
    0b00010010,
    0b00001100,
    0b00000000,
    0b00000000,
    0b00000000,
    0b00000000
 };

Para montar los caracteres definidos usamos:

lcd.createChar(0, euro);
lcd.createChar(1, grado);

Y ahora ya estan disponibles. Tened en cuenta que solo podemos definir 8 caracteres especiales en un momento dado ( Aunque podemos definir 30 arrays, de caracteres y crearlos y matarlos sobre la marcha).

Aqui tenemos un ejemplo del programa:

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

byte grado[8] =
 {
 0b00001100,
 0b00010010,
 0b00010010,
 0b00001100,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000
 };

void setup() 
  {
      lcd.begin(16, 2); // Hay que inicializar el LCD
      lcd.createChar(1, grado);
      lcd.setCursor(0, 0); 
      lcd.print("Estamos a 25");
      lcd.write(1); 
  }
void loop() 
 {
 }

Y aqui teneis una foto del resultado

Grados

Por último, y para cerrar ya la sesión (Todo llega en la vida), Deciros que de nuevo, hemos montado este display a la brava, conectando un buen número de cables.

Esto solo se puede justificar, porque en su día piqué y me compre un display de estos ( en realidad, dos. Tengo otro de 16×4), pero si vais a compraros un LCD, por Dios, compraros uno que sea I2C o algo así, vuestra salud mental mejorará mucho y solo usa 4 cables.

En la próxima sesión montaremos uno para que veáis la diferencia.

 

 

Resumen de la sesión

 

 

    • Hemos visto los displays LCD de 16 caracteresy 2 líneas.
      • Lo suficiente como para comprender, que como ejercicio está bien, pero veremos otras maneras de incluir estos displays, menos trabajosas.
    • Existen también, displays de 16 caracteres y 4 líneas, si necesitáis mas espacio en pantalla.
    • Son muy comodos de manejar porque podemos imprimir directamente, como si fuera una puerta serie.
    • Podemos ( y tendremos que hacerlo, seguro) definir caracteres y símbolos no incluidos en el display.
 

 

 

¡Oferta: Mano robot!

Mano prostetica

Promoción especial de abril.

Compra tu kit mano articulada

40€