Arduino - LCD

Neste tutorial de LCD com Arduino, vamos aprender a conectar um LCD (Liquid Crystal Display - Display de Cristal Líquido) à placa Arduino. Os LCDs são muito populares e amplamente usados em projetos de eletrônica para mostrar informações. Existem muitos tipos de LCD. Este tutorial usa o LCD 16x2 (16 colunas e 2 linhas) como exemplo. Os outros LCDs são semelhantes.

※ Nota:

Se você quiser simplificar a ligação, pode usar o LCD I2C no lugar. Veja o tutorial LCD I2C

Sobre o LCD 16x2

Pinagem

Pinagem do LCD

O LCD tem até 16 pinos. Nos usos mais comuns, NÃO usamos todos os pinos.

Com a ajuda da biblioteca LiquidCrystal, podemos até usar o LCD SEM saber o significado desses pinos. Porém, se você estiver curioso ou quiser saber em profundidade, vamos ver esses pinos e as suas funções:

  • Pino GND: precisa ser conectado ao GND (0V).
  • Pino VCC: a alimentação do LCD, precisa ser conectado ao VCC (5V).
  • Pino Vo (Contraste do LCD): controla o contraste e o brilho do LCD, pode ser conectado ao 5V (o maior contraste e brilho) ou a um potenciômetro (para ajustar o contraste e o brilho)
  • Pino RS (Register Select): Existem dois tipos de dados que precisam ser enviados ao LCD: comandos (para controlar o LCD) e dados. Os dois são enviados no mesmo barramento de dados. O pino RS informa ao LCD se os dados no barramento são comandos ou dados.
    • Se quisermos enviar um comando para controlar o LCD, precisamos colocar o pino RS em LOW (como posicionar o cursor em um local específico, limpar o display...).
    • Se quisermos enviar dados para mostrar no LCD, precisamos colocar o pino RS em HIGH.
  • Pino R/W (Read/Write - Leitura/Escrita): serve para selecionar o modo LEITURA ou o modo ESCRITA.
    • Se quisermos ler dados do LCD, este pino precisa ficar em HIGH.
    • Se quisermos enviar dados ao LCD, este pino precisa ficar em LOW. Como estamos usando este LCD apenas como dispositivo de SAÍDA, vamos ligar este pino em LOW.
  • Pino EN (Enable - Habilitar): é usado para habilitar o LCD. HIGH para habilitar o LCD, LOW para desabilitar o LCD.
  • Pinos D0-D7 (Barramento de Dados): transportam dados e comandos entre o Arduino e o LCD. Existem dois modos para enviar dados: modo de 4 bits e modo de 8 bits.
  • Pinos A-K (Ânodo e Cátodo): são usados para alimentar a luz de fundo (backlight) do LCD. O pino A precisa ser conectado ao VCC. O pino K precisa ser conectado ao GND.

Modo de 4 bits e modo de 8 bits

  • Modo de 8 bits: os 8 bits de um byte são enviados ao mesmo tempo pelos pinos D0 a D7.
  • Modo de 4 bits: os 8 bits de um byte são enviados em duas vezes, 4 bits de cada vez, pelos pinos D4 a D7.

O modo de 8 bits é mais rápido que o modo de 4 bits, mas usa mais pinos que o modo de 4 bits. A escolha do modo é feita no processo de inicialização, enviando um comando ao LCD.

Este tutorial usa o modo de 4 bits, que é o mais usado.

Neste modo, os pinos do LCD:

  • 6 pinos (RS, EN, D4, D5, D6 e D7) são conectados aos pinos do Arduino.
  • 4 pinos (D0, D1, D2 e D3) NÃO são conectados.
  • Os 6 pinos restantes são conectados ao GND/VCC ou ao potenciômetro.

Tabela de pinos do LCD no modo de 4 bits

PINO DO LCDCONECTADO A
01GNDGND
02VCC5V
03Vo5V ou pino do potenciômetro
04RSUm pino do Arduino
05R/WGND
06ENUm pino do Arduino
07D0NÃO conectado
08D1NÃO conectado
09D2NÃO conectado
10D3NÃO conectado
11D4Um pino do Arduino
12D5Um pino do Arduino
13D6Um pino do Arduino
14D7Um pino do Arduino
15A5V
16KGND

Coordenadas do LCD

O LCD 16x2 tem 16 colunas e 2 linhas. As colunas e as linhas são indexadas a partir de 0.

Coordenadas do LCD com Arduino

Como Funciona

Esta seção traz um conhecimento mais aprofundado. NÃO se preocupe se você não entender. Pule esta seção se ela parecer difícil demais e volte outro dia. Continue lendo as próximas seções.

O processo de envio de dados (para serem mostrados) ao LCD:

  1. O Arduino coloca o pino RS em HIGH (para selecionar o registrador de dados)
  2. O Arduino escreve os dados nos pinos D4 → D7 (barramento de dados).
  3. O LCD recebe os dados no barramento de dados.
  4. O LCD armazena os dados recebidos no registrador de dados, já que o pino RS está em HIGH. Em seguida, o LCD mostra os dados na tela

O processo de envio de comandos (para controlar) ao LCD (por exemplo, piscar o LCD, posicionar o cursor em um local específico, limpar o display...):

  1. O Arduino coloca o pino RS em LOW (para selecionar o registrador de comandos)
  2. O Arduino escreve o comando nos pinos D4 → D7 (barramento de dados).
  3. O LCD recebe os dados no barramento de dados.
  4. O LCD armazena os dados recebidos no registrador de comandos, já que o pino RS está em LOW. Em seguida, o LCD executa a ação com base no valor do comando.

Arduino - LCD

Controlar o LCD é uma tarefa bastante complicada. Felizmente, graças à biblioteca LiquidCrystal, esse processo fica simples para você, então não é preciso conhecer as instruções de baixo nível. Basta conectar o Arduino ao LCD e usar as funções da biblioteca. Usar o LCD fica muito fácil.

Diagrama de Ligação

Diagrama de Ligação do Arduino com LCD

This image is created using Fritzing. Click to enlarge image

Como Programar o LCD

  • Inclua a biblioteca:
#include <LiquidCrystal.h>
  • Defina quais pinos do Arduino estão conectados aos seis pinos do LCD: RS, EN, D4, D4, D6, D7
const int RS = 11, EN = 12, D4 = 2, D5 = 3, D6 = 4, D7 = 5;

Uma das vantagens da biblioteca é que os pinos do Arduino conectados ao LCD podem ser configurados. Isso traz flexibilidade quando você conecta o Arduino ao LCD e a outros sensores/atuadores.

  • Declare um objeto LiquidCrystal:
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
  • Configure o número de colunas e linhas do LCD.
lcd.begin(16, 2);
  • Mova o cursor para a posição desejada (column_index, row_index)
lcd.setCursor(column_index, row_index);
  • Mostre uma mensagem no LCD.
lcd.print("Hello World!");

Há muito mais coisas que podemos fazer com o LCD (veja a parte Faça Mais com o LCD)

※ Nota:

Você pode escolher quaisquer seis pinos do Arduino para conectar ao LCD, desde que especifique os pinos conectados no código do Arduino.

Código Arduino

#include <LiquidCrystal.h> // LCD pins <--> Arduino pins const int RS = 11, EN = 12, D4 = 2, D5 = 3, D6 = 4, D7 = 5; LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); void setup() { lcd.begin(16, 2); // set up number of columns and rows lcd.setCursor(0, 0); // move cursor to (0, 0) lcd.print("Arduino"); // print message at (0, 0) lcd.setCursor(2, 1); // move cursor to (2, 1) lcd.print("GetStarted.com"); // print message at (2, 1) } void loop() { }

Passos Rápidos

  • Copie o código acima e abra-o na Arduino IDE
  • Clique no botão Upload na Arduino IDE para carregar o código no Arduino
  • Veja o resultado no LCD
Arduino mostrando texto no LCD
  • Experimente modificar o texto e a posição

Vídeo

Caractere Personalizado

A função lcd.print() suporta apenas caracteres ASCII. Se você quiser mostrar um caractere ou símbolo especial (por exemplo, um coração, um angry bird), precisa usar o gerador de caracteres abaixo.

O LCD 16x2 pode mostrar 32 caracteres (2 linhas e 16 colunas). Cada caractere é composto por 40 pixels (8 linhas e 5 colunas).

Pixels do LCD 16x2 com Arduino

O gerador de caracteres representa um caractere (40 pixels). Você só precisa seguir os passos abaixo:

Click on each pixel to select/deselect


Copy below custom character code
Replace the customChar[8] in the below code
#include <LiquidCrystal.h> // LCD pins <--> Arduino pins const int RS = 11, EN = 12, D4 = 2, D5 = 3, D6 = 4, D7 = 5; LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); byte customChar[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; void setup() { lcd.begin(16, 2); // set up number of columns and rows lcd.createChar(0, customChar); // create a new custom character lcd.setCursor(2, 0); // move cursor to (2, 0) lcd.write((byte)0); // print the custom char at (2, 0) } void loop() { }

Resultado no LCD:

Caractere personalizado no LCD

Vários caracteres personalizados

Podemos criar até 8 caracteres personalizados (com índices de 0 a 7). O exemplo abaixo cria e mostra três caracteres.

#include <LiquidCrystal.h> // LCD pins <--> Arduino pins const int RS = 11, EN = 12, D4 = 2, D5 = 3, D6 = 4, D7 = 5; LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); byte customChar0[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 }; byte customChar1[8] = { 0b00100, 0b01110, 0b11111, 0b00100, 0b00100, 0b00100, 0b00100, 0b00100 }; byte customChar2[8] = { 0b00100, 0b00100, 0b00100, 0b00100, 0b00100, 0b11111, 0b01110, 0b00100 }; void setup() { lcd.begin(16, 2); // set up number of columns and rows lcd.createChar(0, customChar0); // create a new custom character (index 0) lcd.createChar(1, customChar1); // create a new custom character (index 1) lcd.createChar(2, customChar2); // create a new custom character (index 2) lcd.setCursor(2, 0); // move cursor to (2, 0) lcd.write((byte)0); // print the custom char 0 at (2, 0) lcd.setCursor(4, 0); // move cursor to (4, 0) lcd.write((byte)1); // print the custom char 1 at (4, 0) lcd.setCursor(6, 0); // move cursor to (6, 0) lcd.write((byte)2); // print the custom char 2 at (6, 0) } void loop() { }

Resultado no LCD:

Vários caracteres personalizados no LCD

Resumo: como usar caracteres personalizados no LCD

  • Use o gerador de caracteres acima para criar o código binário do caractere personalizado.
  • Declare o código binário do caractere personalizado (copie do passo acima)
byte customChar[8] = { 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000, 0b00000 };
  • Crie o caractere personalizado e atribua a ele um valor de índice (de 0 a 7) na função setup()
lcd.createChar(index, customChar);
  • Mostre o caractere personalizado no LCD a qualquer momento, em qualquer lugar (na função setup() ou loop())
lcd.setCursor(column, row); // move cursor to a desired position lcd.write((byte)index); // print the custom char at the desired position

Desafie-se

Use o LCD para fazer um dos seguintes projetos:

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!