domingo, 20 de diciembre de 2015

Arduino y Display LCD 16x2

Display LCD y Arduino Mostrando información

Ya conocemos lo que son los displays lcd y ahora queremos utilizarlo con nuestros Arduinos para crear proyectos que luzcan mas profesionales y poder interactuar de una manera mas amigable. En este tutorial de Arduino vamos a ver como conectarlo al Display LCD 16x2 HD44780 para mostrar mensajes y como poder crear caracteres personalizados.

Circuito de conexión LCD HD44780 y Arduino

El circuito básico para conectar nuestro Arduino a un display LCD es el siguiente:

"Circuito Arduino y Display LCD 16x2"
Nuestro circuito en la protoboard seria algo asi:

"Circuito en Protoboard Arduino y Display LCD 16x2"
El potenciometro sera usado para ajustar el contraste del LCD. En el momento que alimentemos el circuito deberiamos ver prender el led y podriamos ajustar el contraste hasta lograr ver los cuadrados negros, esto ademas nos sirve como una primera prueba para verificar nuestro circuito.

Mostrando Mensajes

El código que vamos a cargar en el Arduino es el siguiente:

#include <LiquidCrystal.h>

String Msg[7];
int counter = 0;
int acctime = 0;
// Inicializo la libreria con los numeros d elos pines
// en modo de 4-bit sin utilizar el pin R/W
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
   //Configuro el tamaño del display
   lcd.begin(16, 2);
   Msg[0]= "";
   Msg[1]= "Visita";
   Msg[2]= "ArS-Electronica";
   Msg[3] = "La electronica";
   Msg[4] = "libre-Tutoriales";
   Msg[5] = "Proyectos";
   Msg[6] = Msg[0];
}

void loop() {
   if(millis()/1000-acctime>1){
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(Msg[counter]);
      lcd.setCursor(0, 1);
      lcd.print(Msg[counter+1]);
      counter++;
      acctime = millis()/1000;
   }
   if (counter>=6){
      counter = 0;
   }
}

Vamos a desmenuzar un poquito esto para entender que hace. Lo primero es incluir la librería 
LiquisCrystal:

#include <LiquidCrystal.h>

Defino 3 variables:
  • Msg es un array de String para almacenar los mensajes a mostrar.
  • counter es una variable usada para seleccionar el mensaje dentro del array.
  • y time se utiliza para almacenar el tiempo para poder cambiar el mensaje cada un intervalo de tiempo fijo.
String Msg[7];
int counter = 0;
int acctime = 0;

Luego procedemos a inicializar el LCD, básicamente lo primero que hacemos es instanciar un objeto llamado lcd del tipo LiquidCrystal y le pasamos como parámetros los pines a los que esta conectado nuestro LCD, el orden es muy importante y este es: rs, enable, d4, d5, d6, d7. Al pasar esta cantidad de argumentos interpreta que vamos a trabajar con el bus de 4 bits, que es lo que deseamos.

// Inicializo la libreria con los numeros d elos pines
// en modo de 4-bit sin utilizar el pin R/W
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

En el setup() vamos a definir y configurar las dimensiones del lcd, en este caso de 16x2 y luego inicializo el array con los mensajes que deseo mostrar, como voy a realizar una rotacion vertical del mensaje, copio el en el elemento 6 el contenido del elemento 0 a fin de lograr el efecto continuo en la rotacion.

   //Configuro el tamaño del display
   lcd.begin(16, 2);
   Msg[0]= "";
   Msg[1]= "Visita";
   Msg[2]= "ArS-Electronica";
   Msg[3] = "La electronica";
   Msg[4] = "libre-Tutoriales";
   Msg[5] = "Proyectos";
   Msg[6] = Msg[0];

En el loop() lo que hacemos es verificar si (millis()/1000 - counter > 1), millis() es una función de Arduino que devuelve los milisegundos transcurridos desde el ultimo reset, en caso de que la expresión sea verdadera(es decir que paso 1seg), limpiamos el lcd, posicionamos el cursor en la columna 0 fila 0 y escribimos el mensaje indicado por counter, luego posicionamos el cursor en la columna 0 fila 1 y escribimos el siguiente mensaje del array y por ultimo incrementamos el contador y almacenos el tiempo en time, a fin de poder medir el tiempo transcurrido desde que se mostró el nuevo mensaje.

   if(millis()/1000-acctime>1){
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(Msg[counter]);
      lcd.setCursor(0, 1);
      lcd.print(Msg[counter+1]);
      counter++;
      acctime = millis()/1000;
   }

Por ultimo verificamos si counter llego a 6 que es el ultimo elemento del array y en ese caso lo resetemos a 0.

   if (counter>=6){
      counter = 0;
   }

El resultado final seria como el siguiente:

&quot;Circuito en Protoboard Arduino y Display LCD 16x2&quot;

Definiendo Caracteres

Se pueden crear caracteres propios y almacenar hasta un maximo de 8 caracteres en simultaneo, si no nos alcanzan podriamos estar creando y borrando a medida que lo necesitemos mostrar. Cada caracter es representado por un array de 8 bytes, lo que podriamos pensarlo como una matriz de 8x8. Cada byte representa una fila y los bits las columnas. Asi por ejemplo se puede crear una tablita como la siguiente y completarla para crear el caracter necesario. Un 1 implica el pixel negro. En este display cada caracter es presentado con 8x5 pixeles, por los que los bits de 0 a 2 no se visualizan. Este es un ejemplo para representar la letra griega PI.

&quot;Tabla para crear caracter en display lcd HD44780&quot;

A la derecha se visualiza el valor que le corresponde a cada byte, se representa en binario ya que sale directo de mirar la tabla.
Con esto explicado lo que necesitaríamos hacer en nuestro código de arduino es crear un array de bytes:

byte pi[8]=
  {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00011111,
    0b00001010,
    0b00001010,
    0b00001010,
    0b00001010,
  };

Y posteriormente indicarle al lcd la creación del caracter, que se hace de la siguiente forma:

lcd.createChar(1,pi); //Se crea el caracter en la posicion 1

y finalmente para poder usarlo tenemos que usar la función write(int) indicando el numero del caracter creado:

lcd.write(1);

Por ultimo un ejemplo completo:

#include <LiquidCrystal.h>

byte pi[8]=
  {
    0b00000000,
    0b00000000,
    0b00000000,
    0b00011111,
    0b00001010,
    0b00001010,
    0b00001010,
    0b00001010,
  };
// Inicializo la libreria con el numero de pines
// utilizando el modo de 4 bits sin R/WS
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
   // Configuro el numero de columnas y filas
   lcd.begin(16, 2);
   lcd.createChar(1,pi); //Se crea el caracter en la posicion 1
   lcd.setCursor(0, 0); 
   lcd.write(1);//Escribe el caracter creado en la posicion 1
   lcd.print("=3,141592653589"); 

}

void loop() {

}

&quot;Tabla para crear caracter en display lcd HD44780&quot;
Comparte este articulo
  • Comparte con Facebook
  • Comparte con Twitter
  • Comparte con Google+
  • Comparte con Stumble Upon
  • Comparte con Evernote
  • Comparte con Blogger
  • Comparte con Email
  • Comparte con Yahoo Messenger
  • More...

0 comentarios:

Publicar un comentario