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.

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.

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ística | Valor |
|---|---|
| Tela | 16 colunas × 2 linhas de caracteres |
| Tamanho do caractere | 5 × 8 pixels |
| Chip controlador | HD44780 (ou compatível) |
| Adaptador I2C | PCF8574 / PCF8574A |
| Endereço padrão | 0x27 (PCF8574) ou 0x3F (PCF8574A) |
| Alimentação | 5 V, cerca de 20–30 mA com a luz de fundo ligada |
| Conexões | GND, 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 LCD | Arduino Uno / Nano | Arduino Mega | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| GND | GND | GND | GND | GND |
| VCC | 5V | 5V | VIN (5V) | VBUS (5V) |
| SDA | A4 | 20 | GPIO 21 | GP4 |
| SCL | A5 | 21 | GPIO 22 | GP5 |
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.
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.
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}Os comandos de LCD mais úteis
| Comando | O 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.
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.
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 heartLCD 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:
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.
Projetos para montar depois desta leitura
Ver todos os projetos
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

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

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

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).

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

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

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,

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.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

