domingo, 9 de maio de 2021

Aula 17 - Programação Arduino com display LCD 16×02 com módulo I2C

Vamos utilizar o display LCD 16×2 com módulo I2C no Arduino.
O módulo I2C para display LCD 16×2 ou 20×4 tem como principal função simplificar as conexões e facilitar a utilização de displays LCD ao microcontrolador.
O módulo I2C deve ser acoplado ao display LCD por meio da conexão dos seus 16 pinos, conforme ilustra a figura 01.
No centro do módulo I2C, está o chip PCF8574, um expansor de 8 bits que converte os dados I2C de um microcontrolador nos dados paralelos exigidos pelo display LCD.
Na parte lateral, o módulo I2C conta com quatro pinos para conexão com o Arduino ou qualquer outro microcontrolador que suporte o protocolo de comunicação I2C. Estes quatro pinos são: GND, VCC, SDA e SCL. O pino SDA (do inglês, Serial Data) é o responsável pela transferência e recebimento de dados. Por sua vez, o pino SCL (do inglês, Serial Clock) é utilizado para temporização.
O módulo I2C conta também com dois pinos para controle da luz de fundo do visor do display, que se encontram conectados por um jumper, por padrão. Assim, a luz de fundo estará sempre ligada. Você pode remover este jumper para desligar a luz de fundo do display.
Além disto, a placa conta com um pequeno trimpot para fazer ajustes finos no contraste do display e um barramento para configuração do endereço I2C.
A figura 02 detalha as partes que compõem o módulo I2C para display LCD 16×2 ou 20×4.
O barramento de configuração do endereço possui três jumpers de solda (A0, A1 e A2) ou pads de solda, usados para codificar o endereço. Acima de cada pad há uma conexão de aterramento (GND). Para alterar o endereço, basta conectar qualquer pad ao pino GND localizado acima deles, soldando-os. 
A figura 3 mostra um modelo de como mudar endereço por meio de soldagem em um display e demonstra todas as conexões e endereços hexadecimais possíveis.

Ligação dos componentes
Inicialmente, certifique-se de que a sua placa Arduino esteja desligada. Em seguida monte o circuito da Figura 4 utilizando o Módulo I2C e os jumpers macho-fêmea.
Ao montar o circuito observe os seguintes pontos:
  • O GND do módulo I2C deve ser conectado ao pino GND do Arduino;
  • O módulo I2C opera com uma tensão de alimentação de 5V. Deste modo, conecte o VCC ao pino 5V do Arduino;
  • Nas placas Arduino UNO, os pinos associados ao I2C são A4 (SDA) e A5 (SCL).
Na utilização do código, utilizaremos o endereço I2c do nosso módulo. Como existem diferentes endereços é necessário conhecer qual o nosso está cadastrado, para isso basta fazer o upload do código abaixo na Arduino IDE.
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
nDevices = 0;
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("Endereço I2C encontrado: 0x");
if (address<16)
Serial.print("0 ");
Serial.println(address,HEX);
nDevices++;
}
else if (error==4)
{
Serial.print("ERRO ");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("Nenhum endereço i2C encontrado ");
else
Serial.println(" Feito !");
delay(5000);
}
Com o código compilado, poderemos ter acesso ao endereço I2C do módulo no monitor serial, no nosso caso foi encontrado o endereço 0x3F, mostrado na figura ao 05.
Após a montagem do circuito, vamos programação do Sketch no Arduino IDE. Nesse projeto, vamos utilizar o Display 16×02 com módulo I2C para exibir inicialmente as mensagens:

“Prof. Sinesio Gomes”
“ Projetos 2025 ”

Para fazer a comunicação do modulo I2C o Arduino, vamos utilizar a biblioteca Wire.h que já se encontra instalada com o Arduino IDE. Para incluí-la ao sketch acesse o seguinte caminho: Sketch>Incluir Biblioteca> Wire.
Vamos usar também a biblioteca LiquidCrystal_I2C.h que permite controlar displays I2C com funções exatamente semelhantes à biblioteca LiquidCrystal. Para instalá-la, abra o Gerenciador de Bibliotecas através do caminho: Ferramentas>Gerenciar Bibliotecas… ou por meio do atalho Ctrl+Shift+I. Em seguida, busque por LiquidCrystal I2C e clique em instalar, conforme a figura 05.

Vamos entender a lógica de programação desse projeto a partir dos seguintes passos:
1. Incluir as bibliotecas:
Foram incluídas as bibliotecas Wire.h para fazer a comunicação com o I2C e LiquidCrystal_I2C.h para controlar displays I2C.
2. Definir as constantes:
No código definiremos 3 constantes. A constante “col” que se refere ao número de colunas utilizadas no Display, a constante “lin” que se refere ao número de linhas utilizadas no display e a constante “ende” que se refere ao endereço o qual o display se encontra, no nosso caso encontramos 0x3F, se o seu for diferente, substitua pelo endereço encontrado.
3. Criar objeto do tipo LiquidCrystal_I2C
Em seguida, criaremos o objeto lcd, do tipo LiquidCrystal_I2C, e informamos o endereço, número de counas e linhas do display, no seguinte formato: LiquidCrystal lcd(<endereço>, <coluna>, <linha>);
4. Função setup();
No setup(), inicializaremos a exibição do display LCD usando a função init(). A função clear() será usada para limpar o buffer de exibição. A função backlight deve ser utilizada para ativar a luz de fundo do display.
Para iniciar a escrita no display LCD precisamos colocar o cursor na posição na coluna 0 e linha 0. Para isso, usaremos a função lcd.setCursor(0, 0);. A partir daí, escreveremos a primeira parte do texto, que será feita a partir da função lcd.print (“Prof. Sinesio Gomes”);
Para escrever a segunda linha do texto, posicionaremos o cursor para a posição linha 1 e coluna 0 com a função lcd.setCursor(0, 1);. Daí, escreveremos o texto com a função lcd.print(“ Projetos 2025 ”);
5. Função loop()
No loop, chamaremos a função que desliga o display lcd.noDisplay() e liga o display lcd.display();.
Desta forma, o Sketch do projeto ficará da seguinte maneira, para o display 20x4:

#include <Wire.h> // Biblioteca utilizada para fazer a comunicação com o I2C
#include <LiquidCrystal_I2C.h> // Biblioteca utilizada para fazer a comunicação com o display 20x4
#define col 20 // Serve para definir o numero de colunas do display utilizado
#define lin 4 // Serve para definir o numero de linhas do display utilizado
#define ende 0x3F // Serve para definir o endereço do display.
LiquidCrystal_I2C lcd(ende,col,lin); // Chamada da funcação LiquidCrystal para ser usada com o I2C
void setup() //Incia o display
{
lcd.init(); // Serve para iniciar a comunicação com o display já conectado
lcd.backlight(); // Serve para ligar a luz do display
lcd.clear(); // Serve para limpar a tela do display
}
void loop()
{
lcd.setCursor(1,0); // Coloca o cursor do display na coluna 1 e linha 1
lcd.print("SENAI Henrique Lupo"); // Comando de saída com a mensagem que deve aparecer na coluna 2 e linha 1.
lcd.setCursor(1, 1); //Coloca o cursor do display na coluna 1 e linha 2
lcd.print("2EL - SEDUC - EEBA"); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 2
lcd.setCursor(1,2); //Coloca o cursor do display na coluna 1 e linha 1
lcd.print("Prof. Sinésio Gomes"); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 3
lcd.setCursor(1 ,3); //Coloca o cursor do display na coluna 1 e linha 2
lcd.print(" Projetos 2025 "); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 4
delay(3000); // delay de 5 segundos com todas as mensagens na tela
lcd.clear(); // Limpa o display até o loop ser reiniciado
}
Após a transferência do código, o display exibirá as mensagens:
"SENAI Henrique Lupo"
"2EL - SEDUC - EEBA"
“Prof. Sinesio Gomes”
“ Projetos 2025 ”
OBSERVAÇÃO: Caso seu display não exiba as mensagens após a transferência do código, ajuste o contraste do display.
O módulo I2C para display LCD 16×2 ou 20×4 possui um pequeno trimpot de ajuste do contraste do display, conforme Figura 8. Para aumentar o contraste do display basta girar o trimpot no sentido anti-horário. Por sua vez, para diminuir o contraste gire no sentido horário.

O manual com diagrama elétrico da placa do LCD I2C está disponìvel em: 25_0-10_10 LCD Display I2C .

© Direitos de autor. 2021: Gomes; Sinésio Raimundo. Última atualização: 10/10/2025