Componentes · 5 min de leitura

Como usar um display LCD I2C (16x2) com Arduino, ESP32 e Pico

Como ligar um LCD I2C 16x2 no Arduino? Ligação com 4 fios, como descobrir o endereço I2C (0x27, 0x3F), a biblioteca LiquidCrystal_I2C, ajuste de contraste, caracteres personalizados e texto rolante.

O LCD 16x2, que mostra 2 linhas de 16 caracteres, é o display mais comum no mundo Arduino. Ele é usado para mostrar leituras como temperatura e distância, menus, relógios e placares de jogos. O display sozinho tem 16 pinos e precisa de pelo menos 6 pinos digitais; o pequeno módulo I2C soldado na parte de trás reduz isso para apenas 2 fios de dados. Neste post você vai ver, passo a passo, como ligar um LCD I2C, descobrir o endereço dele e mostrar o que quiser na tela.

Display LCD 16x2 com módulo I2C
LCD 16x2 com módulo I2C: graças à plaquinha na parte de trás, ele é ligado com apenas 4 fios.

Como funciona um display LCD?

Esses displays funcionam com um chip controlador chamado HD44780. Cada caractere é desenhado em uma pequena caixa de 5x8 pixels, e o chip tem uma tabela de caracteres embutida com letras, dígitos e alguns símbolos. O Arduino só envia um comando como "escreva esta letra nesta posição"; transformar a letra em pixels é tarefa do display. A luz de fundo de LED deixa o texto legível no escuro, enquanto a camada de cristal líquido forma o texto escurecendo os pixels.

O que é I2C e por que ele facilita as coisas?

I2C é uma forma de vários dispositivos conversarem por dois fios: o SDA leva os dados e o SCL leva o sinal de clock. Cada dispositivo tem seu próprio endereço, e o Arduino chama o dispositivo que quer por esse endereço. Os módulos LCD costumam usar o endereço 0x27 ou 0x3F. Um módulo de relógio, um display OLED e sensores como o BME280 podem dividir os mesmos dois fios; desde que os endereços sejam diferentes, todos funcionam juntos.

Módulo adaptador I2C para LCD com PCF8574
Módulo I2C baseado no PCF8574: o trimpot azul ajusta o contraste e o jumper liga e desliga a luz de fundo.

O chip PCF8574 do módulo converte os comandos que chegam pelo I2C nos 8 sinais paralelos que o display espera. Você pode usar o display sem o módulo I2C, mas aí precisa de 6 pinos, um potenciômetro e muitos fios. O módulo economiza pinos e deixa seu circuito organizado.

Especificações

CaracterísticaValor
Tela16 colunas × 2 linhas de caracteres
Tamanho do caractere5 × 8 pixels
Chip controladorHD44780 (ou compatível)
Adaptador I2CPCF8574 / PCF8574A
Endereço padrão0x27 (PCF8574) ou 0x3F (PCF8574A)
Alimentação5 V, cerca de 20–30 mA com a luz de fundo ligada
ConexõesGND, VCC, SDA, SCL

Ligação do LCD I2C: Arduino, ESP32 e Pico

A ligação é a mesma em todas as placas, com quatro fios; a única coisa que muda é em quais pinos ficam o SDA e o SCL. Para ver os pinos I2C da sua placa, confira a ferramenta Pinagem.

Pino do LCDArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5V)VBUS (5V)
SDAA420GPIO 21GP4
SCLA521GPIO 22GP5
O módulo I2C puxa as linhas SDA e SCL para o próprio VCC, que é 5 V. Os pinos do ESP32 e do Pico são de 3,3 V. Embora na prática isso costume funcionar bem, o mais seguro é colocar um conversor de nível I2C bidirecional no meio, ou remover os resistores de pull-up do módulo e puxar as linhas para 3,3 V.

Como descobrir o endereço I2C: sketch scanner

Se você não tem certeza do endereço do seu display, carregue o código abaixo. Ele testa todos os endereços de 1 a 126 e mostra no Monitor Serial o endereço de cada dispositivo que responder. Você vai usar esse endereço ao configurar o display.

C++ (Arduino IDE)
1#include <Wire.h>
2
3void setup() {
4  Wire.begin();
5  Serial.begin(9600);
6  Serial.println("I2C taranıyor / scanning...");
7  for (byte addr = 1; addr < 127; addr++) {
8    Wire.beginTransmission(addr);
9    if (Wire.endTransmission() == 0) {   // cihaz cevap verdi / device answered
10      Serial.print("Bulundu / found: 0x");
11      Serial.println(addr, HEX);
12    }
13  }
14}
15
16void loop() {
17}

Instalando a biblioteca e mostrando texto

No Gerenciador de Bibliotecas, busque LiquidCrystal I2C e instale a biblioteca de Frank de Brabander. O código abaixo escreve uma saudação na primeira linha e, na segunda, quantos segundos se passaram desde que o Arduino ligou.

C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);  // adres, sütun, satır / address, columns, rows
5
6void setup() {
7  lcd.init();
8  lcd.backlight();               // arka ışığı aç / backlight on
9  lcd.setCursor(0, 0);           // sütun 0, satır 0 / column 0, row 0
10  lcd.print("Merhaba Dunya!");
11}
12
13void loop() {
14  lcd.setCursor(0, 1);           // ikinci satır / second row
15  lcd.print("Sure: ");
16  lcd.print(millis() / 1000);    // saniye / seconds
17  lcd.print(" sn   ");           // eski rakamları sil / clear old digits
18  delay(200);
19}
Se o display acende mas não mostra texto, ou se a linha de cima mostra só blocos cheios, gire devagar o trimpot azul na parte de trás do módulo com uma chave de fenda pequena. Esse é o ajuste de contraste, e ele resolve a maioria dos problemas de "meu display não funciona".

Os comandos de LCD mais úteis

ComandoO que faz
lcd.init()Inicializa o display; chame uma vez em setup().
lcd.backlight() ou lcd.noBacklight()Liga ou desliga a luz de fundo.
lcd.setCursor(coluna, linha)Define onde o texto começa; a contagem começa em 0.
lcd.print(valor)Mostra um texto ou um número.
lcd.clear()Limpa o display inteiro e leva o cursor para o início.
lcd.scrollDisplayLeft()Desloca o display inteiro um caractere para a esquerda.
lcd.blink() ou lcd.cursor()Mostra um cursor piscante ou sublinhado.
lcd.createChar(posição, matriz)Guarda um caractere personalizado nas posições 0–7.

Texto rolante

Para mostrar um texto com mais de 16 caracteres, você pode rolar o display. O código abaixo escreve o texto e o desloca para a esquerda a cada 300 milissegundos, então uma mensagem longa passa pela tela como um letreiro.

C++ (Arduino IDE)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);
5
6void setup() {
7  lcd.init();
8  lcd.backlight();
9  lcd.print("BlueGrays ile elektronik ogren");  // 16 karakterden uzun / longer than 16 chars
10}
11
12void loop() {
13  lcd.scrollDisplayLeft();   // bir adım sola / one step left
14  delay(300);
15}

Caracteres personalizados e letras especiais

A tabela de caracteres do HD44780 não tem letras acentuadas como ã, ç, é, õ (nem ñ); se você tentar mostrá-las, vai ver símbolos sem sentido. A solução é definir até 8 caracteres personalizados de 5x8 pixels. Cada linha é escrita como um byte, e os bits em 1 são os pixels acesos. O exemplo abaixo desenha um coração; você pode desenhar qualquer letra acentuada do mesmo jeito.

C++ (Arduino IDE)
1byte heart[8] = {
2  0b00000,
3  0b01010,
4  0b11111,
5  0b11111,
6  0b01110,
7  0b00100,
8  0b00000,
9  0b00000
10};
11
12// setup() içinde / inside setup()
13lcd.createChar(0, heart);   // 0. yuvaya kaydet / store in slot 0
14lcd.setCursor(15, 0);
15lcd.write(byte(0));         // kalbi göster / show the heart

LCD I2C com o ESP32 e o Raspberry Pi Pico

No ESP32, o mesmo código e a mesma biblioteca do Arduino funcionam; Wire.begin() usa por padrão o GPIO 21 (SDA) e o GPIO 22 (SCL). Se quiser outros pinos, escreva Wire.begin(SDA, SCL). No Raspberry Pi Pico com MicroPython, copie para o Pico dois arquivos pequenos chamados lcd_api.py e pico_i2c_lcd.py e use-os assim:

MicroPython
1from machine import I2C, Pin
2from pico_i2c_lcd import I2cLcd   # Pico'ya kopyalanan dosya / file copied to the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5addr = i2c.scan()[0]              # ilk bulunan adres / first found address
6lcd = I2cLcd(i2c, addr, 2, 16)    # 2 satır, 16 sütun / 2 rows, 16 columns
7
8lcd.putstr("Merhaba Pico!")
9lcd.move_to(0, 1)                 # sütun 0, satır 1 / column 0, row 1
10lcd.putstr("BlueGrays")

Ideias de projetos com LCD I2C

  • Termômetro digital: mostre a temperatura e a umidade no display; para a parte do sensor, veja Sensor de temperatura e umidade DHT11.
  • Medidor de distância: mostre em centímetros a distância medida com um HC-SR04; detalhes em Sensor de distância HC-SR04.
  • Voltímetro digital: mostre a tensão lida em um pino analógico.
  • Fechadura com senha: mostre como asteriscos a senha digitada em um teclado matricial.
  • Sistema de menus: navegue pelas opções no display com um potenciômetro ou dois botões.
  • Minijogo: faça um corredor desenhado com caracteres personalizados desviar de obstáculos.

Erros comuns e como resolvê-los

  • Display aceso, mas sem texto: o contraste não está ajustado; gire o trimpot.
  • Blocos cheios na linha de cima: o display está alimentado, mas não foi inicializado; o endereço pode estar errado, o SDA e o SCL podem estar trocados ou lcd.init() não foi chamado.
  • Endereço errado: o código diz 0x27, mas o display é 0x3F; descubra o endereço real com o sketch scanner.
  • Dígitos antigos sobrando: um número que cai de 100 para 99 aparece como 990; escreva alguns espaços depois do número. lcd.clear() também funciona, mas é lento, e o display pisca se você chamá-lo com frequência no loop.
  • Letras acentuadas embaralhadas: elas não estão na tabela do display; defina caracteres personalizados ou evite-as.
  • Texto corrompido aleatoriamente: fios longos e frouxos ou peças ruidosas como motores podem atrapalhar o barramento I2C; use fios curtos e alimente os motores com uma fonte separada.

Juntar o display com um sensor é o caminho mais rápido para montar seu primeiro projeto de verdade. No app BlueGrays você encontra dezenas de projetos com LCD I2C, com esquemas do circuito e código pronto, e para mudar valores girando um botão, O que é potenciômetro? vai ser útil.

Perguntas frequentes

Por que meu LCD mostra só blocos?

Blocos cheios na linha de cima significam que o display está alimentado, mas não foi inicializado. O endereço pode estar errado, o SDA e o SCL podem estar trocados ou o contraste está alto demais. Primeiro confirme o endereço com o sketch scanner I2C e depois ajuste o trimpot.

O endereço do meu LCD I2C é 0x27 ou 0x3F?

Módulos com o chip PCF8574 costumam usar 0x27, e os com PCF8574A usam 0x3F. O jeito mais fácil de descobrir é o sketch scanner I2C; depois é só mudar o código para LiquidCrystal_I2C lcd(0x3F, 16, 2).

Posso ligar dois LCDs em um Arduino?

Sim. Unir com solda os pads A0, A1 e A2 do módulo muda o endereço dele, então até 8 LCDs podem dividir os mesmos dois fios. No código, você define um objeto separado para cada display, com o seu próprio endereço.

O mesmo código funciona em um LCD 20x4?

Sim. Basta mudar a declaração para LiquidCrystal_I2C lcd(0x27, 20, 4); as linhas vão de 0 a 3 e as colunas de 0 a 19.

Como mostro caracteres acentuados ou especiais em um LCD?

A tabela embutida do display não inclui letras como ã, ç, é ou õ. Desenhe cada uma como um caractere personalizado de 5x8 pixels com lcd.createChar() e mostre-a com lcd.write(). Lembre-se de que você pode definir no máximo 8 caracteres personalizados ao mesmo tempo.

Devo usar um LCD ou um display OLED?

O LCD é barato, legível sob o sol e ideal para texto e números. O OLED é menor, tem alto contraste e consegue desenhar gráficos e ícones, mas pode sofrer burn-in (marcas permanentes) se mostrar a mesma imagem por muito tempo. Escolha o LCD para texto e o OLED para gráficos.

Ver todos os projetos
Uso do display LCD com I2C
#32Iniciante
Premium

Uso do display LCD com I2C

Dê ao seu Arduino um display próprio e faça-o escrever sua primeira mensagem. O display LCD de duas linhas é conectado com poucos fios; primeiro aparece uma saudação na linha de cima, depois uma segun

4.8(53)
70
Exibição de mensagens no display LCD 2x16
#29Avançado
Premium

Exibição de mensagens no display LCD 2x16

Seu primeiro passo para escrever textos em um display. O display LCD de duas linhas mostra primeiro uma mensagem de espera, depois escreve uma saudação na linha de cima e uma palavra letra por letra n

4.6(37)
51
Animação de texto que rebate nas bordas do LCD
#30Avançado
Premium

Animação de texto que rebate nas bordas do LCD

Na linha de cima do display LCD, a palavra BLUEGRAYS desliza de uma borda à outra e volta como uma bola que bate na parede, repetindo o movimento sem parar. Você só precisa de um Arduino, um display L

4.5(29)
40
Display LCD I2C com ESP32 (16x2)
#119Intermediário
Premium

Display LCD I2C com ESP32 (16x2)

Neste projeto, exibimos texto conectando um display LCD de 16x2 caracteres ao ESP32 pelo protocolo I2C. Com o I2C, controlamos o display usando apenas dois pinos de dados (SDA e SCL), dispensando o uso de seis ou mais pinos da conexão paralela tradicional. O código mostra uma mensagem fixa na primeira linha e um contador que aumenta a cada segundo na segunda linha. Na inicialização, também executamos um scanner I2C para mostrar o endereço do display no Monitor Serial (geralmente 0x27 ou 0x3F).

4.9(23)
40
Temperatura e umidade com DHT11
#55Intermediário

Temperatura e umidade com DHT11

Qual é a temperatura do seu quarto? O ar está úmido ou seco? O sensor DHT11 mede a temperatura e a umidade, e o Arduino mostra os valores em um display LCD de duas linhas, atualizando a cada poucos se

4.7(47)
73
Voltímetro digital com display LCD
#56Intermediário
Premium

Voltímetro digital com display LCD

Descubra a tensão de uma pilha ou de um adaptador de alimentação com um medidor feito por você. Um divisor formado por dois resistores reduz a tensão alta a um nível que a placa consegue ler, e o Ardu

4.5(27)
36
Fechadura com senha, teclado 4x4 e LCD
#64Avançado
Premium

Fechadura com senha, teclado 4x4 e LCD

Uma pequena fechadura eletrônica que impede a entrada de quem não sabe a senha. Você pressiona a cerquilha e digita a senha no teclado. Se estiver correta, o display indica que o acesso foi permitido,

4.8(59)
75
Jogo de corrida no LCD com Arduino
#98Intermediário
Premium

Jogo de corrida no LCD com Arduino

Jogo de corrida infinita com rolagem lateral em um display LCD de 16x2 caracteres. O herói corre automaticamente, e o jogador pressiona o botão para pular os obstáculos. Obstáculos aleatórios aparecem nas linhas superior e inferior. O buzzer passivo toca a melodia de abertura, o som de pulo, o som de comemoração a cada 50 pontos e a melodia de fim de jogo. A tela de abertura "BlueGrays - Arduino Projects" aparece ao iniciar. A pontuação é atualizada em tempo real no canto superior direito.

4.6(32)
55