Framework Arduino II: Aula 07 Display LCD 16 x 2

Imagem meramente ilustrativa


Introdução

    Até agora utilizamos o monitor serial como dispositivo padrão de saída na Framework Arduino, porém para evoluirmos com nossos projetos precisamos oferecer uma interface que funcione de forma independente de um computador.

    Pensando nisso o mercado oferece diversas opções como dispositivos de saída na forma de displays LCD, displays OLED e até o antigo display de sete segmentos. No texto de hoje abordaremos como exemplo o mais comum deles que é o Display LCD 16 x 2, no entanto os conceitos que vamos explorar também servem para o LCD 20 x 2.

Conhecendo o Display LCD 16 x 2

    Conforme diz o seu nome, esse dispositivo é uma pequena tela de cristal líquido que permite exibir caracteres alfanuméricos dispostos em 16 colunas por 2 linhas, o que totalizam 32 caracteres. 

    Cada coluna e linha é identificada por um número começando pelo zero, assim temos as colunas de 0 a 15 e as linhas de 0 a 1. Essa identificação permite formar um sistema de coordenadas que é utilizado para informar onde queremos que um caractere seja exibido na tela.

    Geralmente são oferecidos no mercado com diferentes cores de fundo, o chamado Backlight, podendo o comprador escolher o fundo azul, verde, etc, mas com as letras escritas somente em branco ou preto, não admitindo palavras coloridas.

    Seu baixo custo próximo dos três dólares, torna o uma boa opção barata como dispositivo de saída, razão de sua popularidade. Sua tensão de trabalho geralmente é 5 volts e o consumo de corrente também é baixo. Porem esse consumo de corrente pode sofrer grande aumento dependendo do uso do Led do Backlight, isto é, da luz da cor de fundo.

    Para diminuir essa corrente, alguns autores recomendam desligar a luz de fundo ou utilizar resistores mas fortes que os 220/330 Ω recomendados tradicionalmente para a maioria dos leds. Em nossas pesquisas encontramos montagens sugerindo resistores de 1 e até 4,7 KΩ.

    Quanto a pinagem, eles apresentam 16 pinos ou terminais, sendo que na prática 12 são realmente utilizados. Destes, três são conectados a um GND e dois ao VCC. Dos sete restantes, um deles que é responsável pelo contraste da tela, pode ser conectado a um potenciômetro independente.

    Sendo assim, se você fez as contas, podemos ter de seis a sete terminais do LCD conectados a pinos do Arduino, ou seja, quase metade da pinagem disponível na placa pode ser ocupada por esse dispositivo, mas poderia ser pior... Já te explico.

    Oito desses 16 terminais do LCD são utilizados para transferência de dados que pode ser de oito ou quatro bits. Se trabalharmos no modo 8 bits seremos obrigados a usar mais quatro pinos do Arduino, por isso trabalhamos no chamado modo quatro bits, economizando pinos. 

    De acordo com a própria documentação do Arduino, no modo quatro bits você pode fazer praticamente de tudo com textos no display, por isso que a maioria dos tutoriais encontrados pelo Web não utilizam quatro desse pinos.

    Assim, podemos ter a seguinte tabela de conexão como exemplo:

Sugestão para uso dos pinos do Arduino com LCD 16 x 2
Sugestão para uso dos pinos do Arduino com LCD 16 x 2


    Com relação ao comercio, podemos encontra-los em três apresentações:

  • Display com 16 pontos de solda pra conexão;
  • Display com 16 terminais já soldados para conexão
  • Display com módulo (Shield) com apenas 4 terminais para conexão
Diferentes apresentações do LCD 16 x 2
Diferentes apresentações do LCD 16 x 2


    Essa última opção resolve aquele problema de uso dos pinos no Arduino, porque ao invés de 6-7 pinos para conectá-lo utilizamos apenas dois. Para isso utiliza-se o protocolo I2C que abordaremos na nossa próxima aula.

    Independentemente de possuir ou não um shield, para utilização desses displays se faz necessário a inclusão da biblioteca LiquidCrystal disponibilizada pela Adafruit e incluída na documentação do Arduino.

    Essa documentação mostra todos os métodos da classe lcd, dos quais mostrarei os principais no Sketch de hoje. Abaixo uma tabela de especificações de um LCD genérico:

Especificações encontradas na maioria dos LCDs genéricos
Especificações encontradas na maioria dos LCDs genéricos

    Esses display geralmente usam o chip Hitachi HD44780 LCD Controller que possui um tipo de letra embutida (fonte) com a capacidade de apresentar oito caracteres personalizados, que dependendo da ROM podem ser caracteres katakana japoneses ou da Europa ocidental.

Montagem

    Para ganhar tempo estou disponibilizando uma montagem pronta que o estudante poderá salvar uma cópia. Uma observação importante é que no Wokwi o ajuste de contraste não é simulado, senso assim o potenciômetro e suas ligações, no Wokwi não terão efeito. Fica apenas como uma referência para ligação. 

    As conexões utilizadas, seguiram a tabela sugerida para o uso de pinos que comentamos anteriormente neste texto. Sendo que no pino VCC do Led do BackLight utilizamos um resistor. Para ver o efeito da led do backlight, o estudante pode rodar uma simulação sem a conexão do resistor para ver como fica mais escuro o fundo.

Simulação com Led de fundo desligado
Simulação com Led de fundo desligado

    Link: https://wokwi.com/projects/413670072319904769

Sketch

    Inclusão da biblioteca LiquidCrystal que o próprio Wokwi coloca pra gente. Em seguida em instanciei o objeto lcd com base na classe LiquidCrystal utilizando como parâmetros os pinos do Arduino, conforme o comentário na linha 2. A função setup() está apenas iniciando o objeto lcd, informando o seu número de colunas e linhas.

    No loop() eu comecei na linha 10 ajustando o cursor do lcd para começara a escrever na coluna 0 com a linha 0 com setCursor(0, 0), ou seja, o o topo superior esquerdo do LCD. Quando eu mandei escrever com o método print() ele partiu desse ponto.

    Na linha 13 eu já ajustei para começar a escrever no coluna 0 mas da linha 1, por isso ele escreveu na linha debaixo. O método clear() apaga o que está na tela e também algumas configurações já feitas.

    Na linha 17 a 20 eu mostro um exemplo de como centralizar palavras no LCD. Basicamente criei uma variável para armazenar uma String, depois fiz uma pequena conta para descobrir qual coluna colocaria a string no centro. 

    Para isso eu determinei a largura da string com o método length(), subtraí do número de colunas e dividi tudo por 2.

    Já na linha 23 eu configurei o cursor para ficar piscando com blink(). Esse ajuste desaparece quando eu dou o noBlink() na linha 27. Na linha 29 temos o método cursor() que torna o cursor um caractere underline. Isso é desligado na linha 32 com noCursor().

    Da linha 33 a 38 mostro um exemplo de como fazer uma palavra rolar (scroll) para a direita através do método scrollDisplayRight() executado várias vezes dentro de um laço for. Da linha 39 a 42 faço o mesmo para a esquerda com o método scrollDisplayLeft().

    Na linha 46 eu apago o display sem o uso do clear com noDisplay() para conservar o seu conteúdo, no entanto, como eu dou scrollDisplayLeft() três vezes enquanto ele está apagado, ao trazê-lo de volta com o display() a frase "Desligando em 3s" vira "ligando em 3s" e dai ele volta a repetir as instruções.

  1. #include <LiquidCrystal.h>
  2. //LiquidCrystal(rs, enable, d4, d5, d6, d7)
  3. LiquidCrystal lcd(7,6,5,4,3,2);

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

  7. void loop() {
  8.   lcd.setCursor(0, 0);
  9.   lcd.print("Escrevendo em L1");
  10.   delay(1000);
  11.   lcd.setCursor(0, 1);
  12.   lcd.print("Escrevendo em L2");
  13.   delay(1000);
  14.   lcd.clear();
  15.   String texto="centro";
  16.   int coluna=(16-texto.length())/2;
  17.   lcd.setCursor(coluna,0);
  18.   lcd.print(texto);
  19.   delay(3000);
  20.   lcd.clear();
  21.   lcd.blink();
  22.   lcd.print("Pisca cursor");
  23.   delay(3000);
  24.   lcd.clear();
  25.   lcd.noBlink();
  26.   lcd.print("underline");
  27.   lcd.cursor();
  28.   delay(3000);
  29.   lcd.clear();
  30.   lcd.noCursor();
  31.   lcd.print("scroll");
  32.   delay(1000);
  33.   for (int i= 0; i <= 3; i++){
  34.     lcd.scrollDisplayRight();
  35.     delay(1000);  
  36.   }
  37.   for (int i= 0; i <= 3; i++){
  38.     lcd.scrollDisplayLeft();
  39.     delay(1000);  
  40.   }
  41.   lcd.clear();
  42.   lcd.print("Desligando em 3s");
  43.   delay(3000);
  44.   lcd.noDisplay();
  45.   delay(3000);
  46.     for (int i= 0; i < 3; i++){
  47.     lcd.scrollDisplayLeft();
  48.     delay(1000);  
  49.   }
  50.   lcd.display();
  51.   delay(3000);
  52.   lcd.clear();
  53. }

    Tentei dar alguns exemplos e mostrar como se usa alguns métodos para LCD. Espero que tenha sido útil. Na próxima postagem mostrei o uso do LCD I2C.

Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO. Liquid Cristal. Disponível em <https://docs.arduino.cc/libraries/liquidcrystal/> Acesso em 04 nov 2024.

BLOG ELETROGRATE. Guia Completo do Display LCD – Arduino. Disponível em <https://blog.eletrogate.com/guia-completo-do-display-lcd-arduino/> Acesso em 04 nov 2024.

BLOG MWE SHOP. Como usar com Arduino – Display LCD 16X2 com Backlight Azul. Disponível em <https://blogmasterwalkershop.com.br/arduino/como-usar-com-arduino-display-lcd-16x2-com-backlight-azul> Acesso em 04 nov 2024.

LCD. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2024. Disponível em: <https://pt.wikipedia.org/w/index.php?title=LCD&oldid=68619095>. Acesso em: 04 nov 2024.

HITACHI HD44780 LCD CONTROLLER. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2024. Disponível em: <https://en.wikipedia.org/wiki/Hitachi_HD44780_LCD_controller>. Acesso em: 04 nov 2024.

MAKER HERO. Controlando um LCD 16×2 com Arduino. Disponível em <https://www.makerhero.com/blog/controlando-um-lcd-16x2-com-arduino/> Acesso em 04 nov 2024.

MAKER HERO. Display LCD 16×2 Backlight Azul. Disponível em <https://www.makerhero.com/produto/display-lcd-16x2-backlight-azul> Acesso em 04 nov 2024.

ROBO CORE. LCD 16x2 5V Branco no Azul. Disponível em <https://www.robocore.net/display/lcd-16x2-5v-branco-no-azul> Acesso em 04 nov 2024.

WOKWI. Referência do wokwi-lcd1602l. Disponível em <https://docs.wokwi.com/pt-BR/parts/wokwi-lcd1602/> Acesso em 04 nov 2024.