top of page
Buscar

Como utilizar o display lcd 16x02 com Arduino e I2C

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

 acel_y = Wire.read() << 8 | Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

 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


Seja o primeiro a saber das novidades

2024 Mundo do Arduino

bottom of page