G030 Displays LCD 1602A sin Interface

Descripción 
Vamos a montar un display LCD de 16×2, veremos cómo enviar información y definiremos algunos caracteres especiales
 
Los displays LEDs de 7 segmentos, 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 líneas).

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 los 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 y muy prácticos si te basta con mostrar solo texto (y algunos caracteres especiales).
 


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.
 
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 directamente 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.

Materiales
Placa de Arduino
1 Resistencia de 220
1 Potenciometro de 10K
1 Display 1602A 
Protoboard, Cables para conexiones, Un cable USB para conectar el Arduino al PC y que sirve además de alimentación.

Esquema
 
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.
 
Vamos ahora a a conectar la alimentación el panel LCD. Conecta el pin16 del LCD a Ground y el pin 15 al positivo de 5V
 
Si conectas ahora el cable USB al arduino, 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:
 
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.
 
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 detalles, 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

Montaje

Código
El primer código que vamos a hacer es un simple contador sin unidades, al que vamos a añadir encima el nombre de patrocinador.

Vamos a usar una librería de control del panel LCD, que viene incluida en nuestro Arduino. 
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,6,5,4,3,2);

Tened cuidado porque los pines que hemos usado, no corresponden a los ejemplos de Arduino, así que podéis cargarlos, pero aseguraros de cambiar la línea de definición de los pines, o no correrán.
 
El resto es sencillo
#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

void setup(){
lcd.begin(16, 2); // Fijar el numero de caracteres y de filas
    lcd.print("magomiguelon.es"); // 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.

El segundo código que vamos a realizar es muy parecido al anterior, pero contando segundos y un mensaje más dirigido a la persona que lee la pantalla.

#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
  lcd.begin(16,2);
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Hola, han pasado");
  lcd.setCursor(0,1);
  lcd.print(millis()/ 1000);
  lcd.print(" seg.");
}
 
El tercér código que vamos a probar es un reloj muy sencillo y nada fiable.

#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

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

void loop(){
   lcd.setCursor(3, 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)+" minutos";
   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. Se usa exactamente igual que Serial.print(). 
 
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. 

El cuarto código es un ejemplo para mostrar cuando salta una alarma

#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
  lcd.begin(16,2);
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Alarma Activa!!!");
  lcd.display();
  delay(500);
  lcd.noDisplay();
  delay(500);
}

El quínto código es un ejemplo típico para una cerradura electrónica que pide la clave para abri la puerta.

#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
  lcd.begin(16,2);
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Introduca clave: ");
  lcd.setCursor(0,1);
  lcd.cursor();
  delay(500);
  lcd.noCursor();
  delay(500);  
}

el sexto código es para probar un scroll, que muestre un cartel largo.  Se ha hecho un doble scroll con dos textos distintos. Pero borrando al 4 últimas líneas tendrías un scroll de línea única.
#include<LiquidCrystal.h>

LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
  lcd.begin(16,2);
}

void loop() {
  lcd.setCursor(2,0);
  lcd.print("Prueba de un Scroll largo");
  lcd.scrollDisplayLeft();
  delay(500);
  lcd.setCursor(2,1);
  lcd.print("Prueba magomiguelon.es");
  lcd.scrollDisplayLeft();
  delay(500);
}

Definiendo tus propios caracteres
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 puede seros de interés saber cómo definir tus propios símbolos.

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:
 
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,6,5,4,3,2);

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

 byte enne[8] =
 {
 0b00001110,
 0b00000000,
 0b00010110,
 0b00011001,
 0b00010001,
 0b00010001,
 0b00010001,
 0b00000000
 };
void setup()
  {
      lcd.begin(16, 2); // Hay que inicializar el LCD
      lcd.createChar(1, grado);
      lcd.createChar(2, enne);
      lcd.setCursor(0, 0);
      lcd.print("Tienes 25 a");
      lcd.write(2);
      lcd.print("os");
      lcd.setCursor(0, 1);
      lcd.print("Hoy hay 25");
      lcd.write(1);
  }
void loop()
 {
 }
 
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.

No hay comentarios:

Publicar un comentario