Controlando um LCD 16×2 com Arduino

Por: Diego J. Stefanello e Ricardo B. Morim

 

Certamente você já viu aqueles projetos ou equipamentos que mostram informações em pequenos displays de 2 linhas.  Eles são chamados de displays de Cristal Líquido 16×2.

Neste artigo, vou te ensinar a utilizar um display LCD 16×2 com uma placa Arduino Uno.

  O que é um LCD?

O LCD (do inglês Liquid Crystal Display) é um dispositivo de interface máquina-usuário, muito prático e simples de se utilizar. Amplamente utilizado nos mais diversos tipos de projetos, esses displays são formados por uma fina camada de cristal líquido entre duas placas de vidro, com uma fonte de luz fluorescente ou de LEDs por baixo de toda essa estrutura.

A formação de caracteres e imagens ocorre devido ao fato do cristal líquido, naturalmente transparente, se tornar opaco (visível) ao receber uma carga elétrica, impedindo a passagem de luz. Assim você consegue ver a imagem.

 

Existem, basicamente, dois tipos de LCDs:

  • LCD de Caracteres: Esses tipos de LCD permitem apenas a escrita de caracteres, números e pequenos símbolos criados pelo usuário. Alguns tamanhos comuns para esse tipo de display são: 8×2, 16×2, 20×4, 24×4, 40×2, entre outros.
  • LCD Gráficos: Os LCDs gráficos possuem resoluções bem maiores e permitem a exibição de figuras e imagens. Alguns tamanhos comuns para esse tipo de display são: 122×32, 128×64, 240×64, 240×128, entre outros. Os tipos mais comuns são monocromáticos, mas existem os coloridos.

Neste artigo vou lhe mostrar como utilizar um display LCD de caracteres 16×2 no Arduino Uno.

 

  Display LCD 16×2

Displays LCD 16×2 são muito úteis para analisar dados de sensores, depuração de código, funcionamento do microcontrolador, ajuste de controles. Enfim, basta um pouco de imaginação para ver que as aplicações são muitas.

Além disso, por serem displays de caracteres, são baratos e fáceis de se utilizar, o que os torna muito populares e comuns nos mais variados projetos com microcontroladores.

Dentre os vários modelos que descrevi acima, o mais comum que você encontrará , é o LCD 16×2, com controlador HD44780. O controlador é o chip que há no display, responsável por receber os comandos e dados do microcontrolador e acionar os pixels correspondentes para formar os caracteres.

Igualmente, há uma variedade de tipo de iluminação de fundo, também conhecida como blacklight. Ele pode ser encontrado comumente nas cores amarela, verde, azul e vermelha. As cores dos pixels, contudo, são preto ou branco. Neste artigo, eu vou utilizar um modelo com blacklight azul e pixels brancos.

A despeito da maioria dos displays LCD 16×2 de caracteres utilizarem o mesmo chip controlador, disposição dos pinos varia, mas a configuração mais popular é aquela mostrada na Figura 1. É importante que você verifique o modelo do display para fazer as conexões corretas e garantir o funcionamento do projeto.

 

Figura 1: LCD 16×02 com blacklight azul.

 

 A tabela abaixo contém a função de cada pino:

Nos pinos de comando (RS, RW e E), os números entre parêntesis significam o nível lógico para a respectiva função.

 


   Entendendo o funcionamento do display LCD

O display LCD 16×2 de caracteres possui 16 colunas e 2 linhas (32 caracteres no total).  Na Figura 2 você pode ver a disposição dos caracteres na tela. 

 

Figura 2: Visão dos caracteres e pixels de um LCD 16×02.

 

Cada caractere é formado por uma matriz de 5 colunas por 8 linhas de pixels. Pixels são os pontinhos que devem ser acionados para formar o caractere. Portanto, o controlador do LCD desenha os caracteres, ligando e desligando grupos de pixels.
A Figura 3 mostra a disposição desses pixels, na qual os pixels brancos estão ligados para formar a letra “T”.

 

Figura 3: Pixels acionados formando o caractere “T”.

 

O controlador HD44780 possui uma memória interna (CGROM), que armazena alguns caracteres alfanuméricos prontos. Estes caracteres, que são os números e letras do alfabeto quotidianamente usados, são codificados através de valores da tabela ASCII. Isso facilita muito a comunicação e o tamanho do código no microcontrolador, pois evita a necessidade de desenhar cada caractere do LCD através do código do Arduino.

Abaixo você pode ver a tabela da CGROM.

 

Caso você precise utilizar um caractere que não esteja na CGROM, basta informando ao controlador quais pixels devem estar ligados (1) e quais devem ser desligados(0), conforme o exemplo do smile na Figura 4.

Figura 4: Pixels que devem ser acionados para fazer um smile.

 

Não só te mostrarei como implementar este smile no LCD 16×2, como também mostrarei um bonus de implementação de figuras maiores que um catactere.


Montando seu projeto com um LCD 16×2

Chegou o momento da diversão. Para a montagem você vai precisar dos seguintes itens:

  • Arduino Uno
  • Display LCD 16×2 de caracteres
  • Fios Jumper’s
  • Protoboard
  • Potenciômetro 10kOhm

Montando o circuito

Monte seu circuito conforme a Figura 5. Certifique-se que ele esteja desligado durante a montagem.

 

Figura 5: Montagem do circuito com Arduino e o display LCD 16×2.

 

O display LCD com controlador HD44780, pode funcionar com barramento de 4 bits e 8 bits. Neste exemplo, usaremos o barramento de 4 bits. Então os pinos 7, 8, 9 e 10 do display não serão utilizados. Estes pinos devem ser ligados ao GND (negativo), para evitar captação de ruídos..

Contudo, quando se utiliza o barramento de 4 bits economizamos 4 pinos do Arduino, entretatnto como os dados são de 8 bits, necessita-se dois ciclos de envio de dados e comandos para o display LCD, demandando mais tempo para a comunicação. Em suma, isso não representa nenhum problema.

Nesta implementação que estou propondo, o pino RW do display LCD ficará ligado ao 0V, o que o configura como somente escrita. Dessa forma, não é possível ler as informações da memória do display LCD, o que normalmente não é necessário. Assim você economizará um pino do microcontrolador e precisará de uma conexão a menos.

Um detalhe muito importante que você deve observar é sobre a ligação do blacklight: a iluminação de fundo é composta de LEDs, então é necessário um resistor para limitação da corrente. Alguns módulos LCD possuem este resistor montado na placa do próprio display, mas em outros é necessário que se adicione este resistor externamente.

Para saber se é necessário utilizar este resistor limitador de corrente para o backlight do seu display, sugiro que você verifique no datasheet dele a fim de encontrar esta  informação. O display LCD que eu estou utilizando neste tutorial possui o resistor em sua placa, por isso ele não aparece no esquema no esquema elétrico.

O esquema elétrico é mostrado na Figura 6.

 

Figura 6.

Observe que os símbolos com mesmo nome possuem conexão entre si. Exemplo: 0V (negativo) e 5V (positivo).

 


Programando o Arduino

Abra a IDE do Arduino e crie um programa (sketch), então salve-o com um nome qualquer. Exemplo “LCD_1602”.

Neste artigo vou utilizar a biblioteca <LiquidCrystal.h> que já acompanha a IDE Arduino, pois há nela todas as funções de comunicação com o display LCD. Assim você se preocupa somente com a interface visual.

Após a criação do sketch, copie o código abaixo e cole na IDE do Arduino.

 

Você verá a interface, como a abaixo.

 

Figura 7.
 

Entendendo o código

Para utilizar o display LCD 16×2, vou te explicar como funciona a biblioteca LiquidCrystal do Arduino. Eventualmente poderão surgir duvidas, então releia o texto mais de uma vez, se for preciso.

 

– LiquidCrystal

É o construtor que cria um objeto da classe LiquidCrystal. Ele é carregado de 4 maneiras diferentes:

LiquidCrystalRS, Enable, DB4, DB5, DB6, DB7 ) – Utiliza 6 pinos para comunicação com o display. Dois de comando e 4 de dados
LiquidCrystalRS, R/W, Enable, DB4, DB5, DB6, DB7 ) – Utiliza 7 pinos para comunicação com o display. Três de comando e 4 de dados
LiquidCrystalRS, Enable, DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7 ) – Utiliza 10 pinos para comunicação com o display. Dois de comando e 8 de dados
LiquidCrystalRS, R/W, Enable, DB0, DB1, DB2, DB3, DB4, DB5, DB6, DB7 ) – Utiliza 11 pinos para comunicação com o display. Três de comando e 8 de dados

Neste artigo utilizarei o construtor com menos pinos. Portanto, o primeiro passo, em termos de código, é criar o objeto com as características desejadas:

  • LiquidCrystal  lcd( 6, 7, 8, 9, 10, 11);    // Pinos do LCD: RS, ENABLE, D4, D5, D6, D7

Os números entre parênteses são os pinos do Arduino Uno. O pino RW ficará ligado no 0V, assim como você deve ter percebido na montagem. Esta linha de código efetivamente cria a interface de software relacionada ao display LCD.
Usamos o nome do objeto, no caso lcd, para nos referirmos ao display LCD no código, seguido de ponto e o nome da função que queremos usar, isto é, o método. Então, com a interface de software criada (objeto lcd), podemos partir para o código de inicialização do display LCD propriamente dito.

– begin(colunas, linhas)

Função que inicializa o display LCD, recebendo como parâmetros o número de colunas e linhas do display. Portanto, deve ser chamada antes de qualquer outro método da classe.

Como o display possui 16 colunas e 2 linhas, temos:

  • lcd.begin(16, 2);   // Inicializa o display no modo 16 caracteres e 2 linhas


– setCursor(coluna, linha)

Posiciona o cursor do LCD nas coordenadas passadas como parâmetro, para que o texto possa ser escrito na posição desejada.

  • lcd.setCursor(1, 0);  // Seta o cursos para a segunda linha, posição zero

Observe você que a primeira posição é referenciada por zero, logo, para acessar as 16 colunas de caracteres os valores de posição são de zero a 15, assim como a primeira linha é referenciada por zero e a segunda por 1. A Figura 8 ilustra esta peculiaridade.

 

Figura 8.

 

– print(conteúdobase)

Escreve o conteúdo (char, int, string, byte ou long) no display LCD, na posição atual do cursor. Contudo, o parâmetro base é opcional e indica apenas a base em que os números serão impressos (BIN para binário, DEC para decimal, OCT para octal e HEX para hexadecimal).

Ao término da escrita, o cursor é movido para a próxima posição. Exemplo:

  • lcd.print(“Ola mundo!!!“);  // Escreve Ola mundo!!! no LCD
  • lcd.print(123);  // Escreve 123 no display

Limpa a tela do display LCD, isto é, apaga todos os valores mostrados e posiciona o cursor na extremidade superior esquerda (0,0), ficando assim pronto para um novo comando de escrita.

  • lcd.clear();  // Limpa a tela 

 

– createChar(númerocaractere)

Cria um caractere customizado para ser utilizado no display LCD, entretanto só é possível criar até 8 símbolos diferentes. O caractere criado é formado por um arranjo de 8 bytes, em que os 5 bits menos significativos de cada byte determinam os pixels de cada linha.

O parâmetro número recebe um inteiro de 0 a 7, que indica a posição do caractere criado, de tal forma que basta indicar a posição do caracter, que o controlador o mostrará no display. 
O parâmetro caractere recebe um vetor de 8 bytes que desenham o caractere, assim como apresentado na figura 9.

Veja como ficou nosso exemplo de criação do smile:

  • lcd.createChar(0, smile);  // Cria o caractere especial na posição 0

Neste caso, smile é um vetor de 8 bytes que corresponde a formação da imagem. Ele está declarado no inicio do programa.

 

Figura 9.

 

– write(caracter)

Escreve um caractere no display LCD na posição atual do cursor, movendo o cursor para a próxima posição.

  • lcd.write( byte( 0 ));

Para o caractere da posição 0 é necessário que se faça um casting para um byte ( byte(0) ), a fim de que o compilador retorne um erro. Para os demais casos isso não é necessário. Exemplo:

  • lcd.write( 1 );  // Escreve o caractere “1” na posição atual

 


Conectando o Arduino ao computador

Conecte a sua placa Arduino na porta USB do computador, assim, uma porta COM virtual será criada com o nome da placa. 

Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para carregar o programa no Arduino (upload), dessa forma, clique no menu Ferramentas (tools) e abra o submenu Porta (Port). Clique na porta que seu Arduino está conectado, tal como COM3,  COM4, COM5, etc. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

 

Figura 10.

 

Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas (Tools), no submenu Placa (Board), a fim de evita erros durante o upload do firmware.

 

Figura 11.

 

Agora clique em Carregar, desse modo código será compilado e a IDE iniciará o upload do do firmware para a placa Arduino.

 

Figura 12.

 

Colocando para funcionar

Finalmente, depois que o Arduino carregar o firmware, você verá no seu display o texto: Ola mundo!!! e 3 smiles, como na imagem da figura 13.

 

 Figura 13.

 


Finalizando

Espero que tenha se divertido e conseguido aprender como controlar o display LCD 1602. Entretanto se ficaram duvidas, não deixe de perguntar.

Sugestões e criticas também serão bem vidas. Compartilhe a vontade!

4 thoughts on “Controlando um LCD 16×2 com Arduino”

  1. Substituí um display 16×2 que estava com o Backlight danificado por outro do mesmo modelo. O display novo exibe caracteres chineses (eu acho). O que causa isso? É possível corrigir?

    1. Olá Valmir,

      Se tiver certeza que o controlador é o mesmo ou equivalente, pode ser mau contato em algum terminal ou cabo, ou pode ser que o novo display esteja com algum problema. Se possivel, teste ambos em um protoboard, com Arduino.

    1. Olá Ricardo,

      Pode usar o 20×4, só alterando a linha de código, na inicialização do display. Já para o modelo 128×64, o código é diferente. Logo fazemos um post sobre esses displays gráficos.

E aí, gostou? Opine. Assim poderemos melhorar.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *