Como utilizar o display lcd 16x02 com Arduino e I2C
- Eduardo Brennand Paranhos
- 20 de set. de 2024
- 5 min de leitura
A programação do display LCD com o Arduino é bastante simples e descomplicada. Apenas com o auxílio da biblioteca LiquidCrysta_l2C.h>, a programação torna-se bastante fácil.
Segue o circuito do projeto:

Código necessário para descobrir o endereço I2C de seu display:
#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);
} // o codigo acaba aqui
O resultado deve ser impresso no monitor serial. Com isso, agora segue o código necessário para fazê-lo funcionar:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20,16,2); // Criando um LCD de 16x2 no endereço 0x20
void setup()
{
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
lcd.print("Hello, world!"); // Exibindo no LED Hello, world!
}
void loop()
{
} // o codigo acaba aqui
Projeto prático com o display lcd I2C
Agora vamos pôr nossos conhecimentos em prática em um projeto utilizando o display! Nosso objetivo é construir um nível de bolha digital, com o auxílio do acelerômetro e giroscópio MPU6050.
Segue o circuito do projeto:

Código:
#include <Wire.h>
const int endereco_MPU = 0x68; // endereço I2C do MPU-6050 (Padrão = 0x68)
// Variável para armazenar o valor de aceleração
float acel_y; // eixo Y
#include <LiquidCrystal_I2C.h> // inclui a biblioteca para uso do Display LCD
// inicializa um objeto nos pinos para acesso as funções do LCD
LiquidCrystal_I2C lcd(0x27,16,2); // Criando um LCD de 16x2 no endereço 0x27
// Define os caraceteres especiais para formar um ponteiro no LCD
byte ponteiro_esquerda[8] = { // metade esquerda do ponteiro
B00000,
B00000,
B00000,
B11111,
B01111,
B00111,
B00001
};
byte ponteiro_direita[8] = { // metade direita do ponteiro
B00000,
B00000,
B00000,
B11111,
B11110,
B11000,
B10000
};
// variável que armazena o fator de calibração do MPU6050
// esta variável deve ser alterada caso o seu sensor esteja desregulado
// para isso é necessário usar as leituras "cruas" do sensor
const int fator_calibracao = 0;
// variável para armazenar os valores atual e anterior do ângulo
int angulo;
int angulo_anterior = -100; // inicia com -100 para forçar atualização do LCD
int coluna; // variável para armazenar a posição da coluna do LCD
void setup(){
// Configura o LCD com os número de colunas e linhas
lcd.init(); // Inicializando o LCD
lcd.backlight(); // Ligando o BackLight do LCD
// Cria os caracteres especiais na memória do LCD
lcd.createChar(0, ponteiro_esquerda); // Posição 0
lcd.createChar(1, ponteiro_direita); // Posição 1
// Inicia o barramento I2C:
Wire.begin();
Serial.begin(9600);
// Inicializa o MPU-6050:
Wire.beginTransmission(endereco_MPU); // T
Wire.write(0x6B); // registrador PWR_MGMT_1
Wire.write(0); // seta para zero
Wire.endTransmission(true); // encerra transmissão
lcd.setCursor(2, 0); // posiciona o cursor do LCD (coluna, linha)
lcd.print("Inclinometro"); // Imprime mensagem
lcd.setCursor(5, 1);
lcd.print("Digital");
delay(2000); // aguarda 2 segundo para iniciar
// Limpa o LCD
lcd.clear();
}
void loop(){
// Inicia transmissão de dados para o MPU-6050
Wire.beginTransmission(endereco_MPU);
// Define o endereço inicial para leitura
Wire.write(0x3D); // registrador ACCEL_YOUT_H
Wire.endTransmission(false); // encerra transmissão
// Solicita os 2 registradores correspondentes ao eixo y do acelerômetro
Wire.requestFrom(endereco_MPU, 2, true);
Serial.print("Valor cru = ");
Serial.print(acel_y);
acel_y = acel_y - fator_calibracao; // subtrai a leitura do sensor pelo fator de calibração
// Os valores do acelerômetro vão de -16384 até 16384
acel_y = constrain(acel_y, -16384.0, 16384.0); // limitamos sua leitura entre estes valores
angulo = asin(acel_y / 16384.0) * 180.0 / PI; // converte os valores de aceleração em ângulo
Serial.print("\t|\t");
Serial.print("Angulo calculado = ");
Serial.println(angulo);
int nivel = angulo / 12; // = 15 Níveis ( -7...0...+7)
coluna = nivel + 7; // As colunas do LCD vão de 0 a 15.
// Só atualiza o LCD se o ângulo mudar (evita que fique o LCD "piscando")
if (angulo != angulo_anterior) {
lcd.clear(); // Limpa o LCD
// imprime o caracteres especiais da memória do LCD
lcd.setCursor(coluna, 0);
lcd.write(byte(0)); // metade esquerda do ponteiro
lcd.write(byte(1)); // metade direita do ponteiro
// Imprime a escala
lcd.setCursor(0,1);
lcd.print("90 45 00 45 90");
}
angulo_anterior = angulo; // atualiza o ângulo anterior
delay(500); // aguarda 0.5 segundo para uma nova leitura
} // o código acaba aqui
O resultado deverá ser esse:
Comments