Pantalla LCD 16x2 (1602A) con Arduino. Varios ejemplos

En este tutorial, aprenderemos a conectar y utilizar una pantalla LCD de 16x2 de referencia 1602A, donde mostraremos texto estático y también texto en movimiento.

Las especificaciones se pueden encontrar en esta página: https://www.crystalfontz.com/products/document/964/CFAH1602XYYHJP_v2.0.pdf


Antes de empezar con el procedimiento, es necesario conocer la funcionalidad de cada pin de la pantalla, ya que así será más fácil su control:
  • VSS: Siempre va a negativo
  • VDD: Es para alimentar la pantalla y su microcontrolador interno, va a 5V. Es recomendable poner una resistencia en serie de 220 ohm para evitar quemarla
  • VO: Con este pin se ajusta el contraste de la pantalla, se puede hacer mediante un potenciómetro cuyos pines de los extremos van a 5V y a tierra, mientras que el del medio se conecta a VO. Es este caso se utilizó uno de 50K pero uno de 10K o cualquier otro valor estará bien. También se puede utilizar una resistencia fija en lugar del potenciómetro, la cual sale desde tierra y va directo al pin. Se recomienda una de 2K.
  • RS: Register Select, controla las órdenes que se le mandan a la pantalla, como escribir un mensaje, borrar la pantalla, etc.
  • RW: Read/Write, controla el modo de lectura o escritura en la pantalla. Como siempre vamos a querer escribir mensajes, lo ponemos en 0, es decir, se conecta siempre a tierra.
  • E: Enable, este pin permite que la pantalla reciba información para escribirla.
  • D0-D7: Como es una pantalla de 8 bits, D0 hasta D7 corresponden a cada uno de ellos. Solamente utilizaremos los pines D4 a D7, con ellos basta para escribir cualquier mensaje.
  • A y K: Corresponden a los pines de la luz de fondo verde de la pantalla, para iluminarla se conecta A a 5V y K a tierra.
Generalmente esta pantalla no viene con pines soldados para conectarla a una protoboard, se recomienda soldar pines tipo macho-macho de 2.54 mm, quedando de la siguiente forma:


La conexión final queda de la siguiente manera:
  • VSS a negativo
  • VDD a 5V a través de una resistencia de 220 ohms
  • VO: Al pin del medio del potenciómetro, o a una resistencia fija que sale desde tierra
  • RS: A algún pin digital del Arduino, en este caso se utilizará el pin 7
  • RW a negativo
  • E: A algún pin digital del Arduino, en este caso se utilizará el pin 8
  • D4: A algún pin digital del Arduino, en este caso se utilizará el pin 9
  • D5: A algún pin digital del Arduino, en este caso se utilizará el pin 10
  • D6: A algún pin digital del Arduino, en este caso se utilizará el pin 11
  • D7: A algún pin digital del Arduino, en este caso se utilizará el pin 12
  • A: Va a 5V
  • K: Va a tierra
Materiales:
  • 1 pantalla LCD de 16x2, referencia 1602A
  • 1 potenciómetro de cualquier valor, o una resistencia de 2K como reemplazo
  • 1 resistencia de 220 ohms
  • 2 resistencias de 10K ohms
  • 2 condensadores de 10 uF
  • 2 pulsadores
  • Cables
  • Protoboard o breadboard
  • Tarjeta Arduino
Con respecto al código, es necesario saber lo siguiente:
  • Se usará la librería LiquidCrystal, la cual está incluida en el IDE de Arduino
  • Se debe inicializar la librería de la pantalla LCD antes del setup(), de esta forma: LiquidCrystal lcd(RS, E, D4, D5, D6, D7). En el paréntesis, se escriben los pines del Arduino en los que se conectó la pantalla. En mi caso queda así: LiquidCrystal lcd(7,8,9,10,11,12)
  • En el setup() se inicializan las filas y columnas de la pantalla, así: lcd.begin(16,2)
  • Se utiliza el comando lcd.setCursor(columna, fila) para elegir la posición donde escribir, por ejemplo: lcd.setCursor(0,1) posiciona el cursor en la columna 0 y fila 1.
  • Los comandos lcd.print("Mensaje") o lcd.write("Mensaje") son para escribir el mensaje que se desea.
  • El comando lcd.clear() es para borrar lo escrito en la pantalla
En la siguiente imagen, se puede ver un ejemplo donde el cursor está en (0,0) para mostrar "Prueba 1:" y luego se posiciona en (0,1) para mostrar: "¡Hola mundo!". A la derecha, un ejemplo donde el cursor está situado en (3,0) para mostrar: "Prueba 2" y luego se posiciona en (2,1) para mostrar: "Arduino y LCD".


Un error muy común es que la pantalla se enciende y no muestra nada, cuando aparentemente todas las conexiones están bien. Esto ocurre porque la polaridad del potenciómetro está al revés.

El diagrama es el siguiente: 

El código de este ejemplo se puede descargar desde aquí: https://drive.google.com/open?id=1TdZXgeKeS2usLLBUyvBVY51Y0_90GenR


También es posible mostrar un texto en la pantalla y luego desplazarlo, ya sea hacia la izquierda o hacia la derecha. Hay varias formas de realizar esto, pero la más sencilla consiste en utilizar dos funciones que trae la librería:
  • scrollDisplayLeft(), la cual desplaza el texto hacia la izquierda
  • scrollDisplayRight(), la cual desplaza el texto hacia la derecha

Ambas funciones desplazan el texto en una unidad y de forma repetitiva. Es necesario que entre un desplazamiento y otro haya una pausa, puesto que estas funciones se ejecutan con mucha rapidez (a la velocidad del Arduino) y sería imposible ver el texto que se muestra.

Realizaremos dos ejemplos con las funciones para desplazar texto, primero se desplazará de manera automática de izquierda a derecha y luego se utilizarán dos pulsadores para desplazar el texto de forma manual. En el ejemplo de los pulsadores, no podemos usar la función delay() como pausa entre un desplazamiento y otro, puesto que el delay "congela" o "bloquea" el programa y no podemos permitirnos esto, ya que se necesitan atender los pulsadores en todo momento. Si por ejemplo, se presiona un pulsador pero el Arduino está bloqueado por un delay, entonces no lo va a leer. Es por eso que se utilizará la función millis(), que consiste en un contador que almacena el tiempo (en milisegundos) transcurrido desde que el Arduino empieza a ejecutar el programa. La función millis() puede comportarse como un delay() pero sin bloquear el programa.

El diagrama correspondiente al ejemplo de los pulsadores se muestra a continuación. No podemos olvidarnos de realizar el antirrebote por software y hardware, tal como se vio en esta entrada.

El funcionamiento de ambos ejemplos queda así: 


El código para el ejemplo del desplazamiento de forma automática: https://drive.google.com/open?id=1eX-uEjMN7WnS9gmUjLBt6JxfZ5XOGR6Z
El código para el desplazamiento usando pulsadores: https://drive.google.com/open?id=13lSJV5C6tvaFv1vb_qHZ1mtUvc8KooYQ

Comentarios