Interface LCD 16X2 com ESP32 usando I2C

Tempo de leitura: 5 minutes

Neste tutorial, fazemos a interface do LCD 16×2 com ESP32, usando apenas 2 pinos, com a ajuda da comunicação I2C. Ele reduz o número de pinos usados pelo ESP32 para que mais número de pinos ESP32 permaneçam livres para fazer a interface de diferentes sensores.

 

O que é o protocolo de comunicação I2C?

O termo I2C significa “Circuitos Integrados Inter”. Normalmente é denotado como IIC ou I ao quadrado ou mesmo como protocolo de interface de 2 fios (TWI) em alguns lugares, mas significa o mesmo. I2C é um protocolo de comunicação síncrona, o que significa que ambos os dispositivos que estão compartilhando as informações devem compartilhar um sinal de clock comum. Ele tem apenas dois fios, SDA e SCL para compartilhar informações, dos quais SCL é usado para o sinal do relógio e SDA é usado para enviar e receber dados.

Você pode comprar o módulo I2C LCD no qual o controlador I2C1602 LCD está embutido ou você pode simplesmente comprar o controlador I2C para fazer a interface 16×2 LCD com ESP32.

 

Materiais requisitados

  • ESP32
  • Display LCD 16*2
  • Controlador I2C LCD
  • Fios
  • ProtoBoard

Módulo I2C

O controlador I2C tem um IC PCF8574 que fornece expansão de E/S remota de uso geral por meio do relógio serial bidirecional I2C de dois fios (SCL) e dados seriais (SDA). É um IC muito útil e pode ser usado em placas de sinais de LED, visores, teclados, controle industrial, etc. Existem 8 pinos de E/S, 3 pinos (A0, A1, A2) para endereço de barramento I2C e SDA, pinos SCL .

A placa controladora do LCD possui um potenciômetro embutido para controlar o contraste do LCD.

Os diagramas de pinos do IC e do controlador LCD são fornecidos abaixo.

 

Diagrama de circuito

As conexões para fazer a interface do LCD com ESP32 são fornecidas abaixo

  • conecte o pino 1-16 do módulo I2C ao pino 1-16 do display LCD.
  • Pino SDA do módulo I2C -> pino SDA do ESP32, ou seja, D21
  • Pino SCL do módulo I2C -> pino SCL do ESP32, ou seja, D22

Eu conectei 3v de ESP32 a 5v de I2C apenas para demonstração, mas precisamos de 5V de alimentação para o módulo I2C para exibir os dados corretamente, porque ESP32 só pode fornecer 3,3 volts, o que é baixo para o módulo I2C e os dados não serão visíveis claramente. Portanto, é melhor usar uma fonte externa de 5V.

Precisamos de arquivos de placa para ESP32, portanto, se você é novo no ESP32, siga primeiro o tutorial de Introdução ao ESP32 e depois volte aqui. Você também pode conectar o LCD com ESP32 sem I2C, mas será necessário mais pinos do ESP32.

Código para encontrar o endereço do controlador I2C

Antes de entrar no código principal, primeiro temos que encontrar o endereço do módulo I2C.

O controlador I2C tem um bit ADDRESS embutido que é usado para controlar o barramento I2C. O ADDRESS padrão é 0x27, mas em alguns casos pode ser 0x3f. Portanto, para verificar o endereço do controlador I2C, conecte o circuito conforme mostrado acima, carregue o código fornecido abaixo e abra o monitor serial. Você verá o endereço em hexadecimal.

#include <Wire.h>

void setup() {
   Serial.begin (9600);
   Serial.println ("Scanning I2C device...");

   Wire.begin();
   for (byte i = 0; i <50; i++)
   {
     Wire.beginTransmission (i);
     if (Wire.endTransmission () == 0)
     {
        Serial.print ("Address found->");
        Serial.print (" (0x");
        Serial.print (i, HEX);
        Serial.println (")");
        Count++;
     }
     Serial.print ("Found ");
     Serial.print (count, DEC);
     Serial.println (" device");
  } 
}

void loop() {}

Observe que usamos este endereço em nosso código de interface de LCD.

No controlador I2C, como você pode ver, existem três jumpers / almofadas de solda rotulados como A0, A1 e A2. Eles são usados para alterar o endereço do módulo. Veja como o endereço muda do valor padrão 0x27 ou 0x3F, se você conectar os painéis de endereço. (1 = Não conectado. 0 = Conectado):

A0A1A2HEX Address
1110x27
0110x26
1010x25
0010x24
1100x23
0100x22
1000x21
0000x20

 

Código para ESP32

Primeiro, precisamos de uma biblioteca LiquidCrystal_I2C para o módulo I2C LCD. A biblioteca Liquidcrsytal comum não funcionará porque estamos usando I2C aqui.

Baixe a biblioteca neste Link (NewLiquidCrystal)

O código é escrito de forma que tudo o que for digitado no monitor serial, será exibido no LCD. Arduino IDE foi usado para escrever e fazer upload de nosso código.

Primeiro, temos que incluir a biblioteca de fios para comunicação I2C que vem com o Arduino IDE.

#include <Wire.h>

Em seguida, para I2C LCD, inclua LiquidCrystal_I2C.h que foi baixado anteriormente.

#include <LiquidCrystal_I2C.h>

Em seguida, defina o endereço I2C do LCD para 0x27 ou o endereço que você obteve executando o código do scanner fornecido acima para um display de 2 linhas de 16 caracteres

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Na função de configuração, inicialize a comunicação serial e LCD por 16 caracteres 2 linhas e ligue a luz de fundo. Se você quiser desligar a luz de fundo, use lcd.noBacklight() e altere a função setCursor() de acordo com sua preferência.

void setup()   
{
  Serial.begin(9600);  
  lcd.begin(16, 2); 
  lcd.setBacklight(HIGH)
  lcd.setCursor(0,0); 
  lcd.print("Hello, world!");
  delay(1000);
  lcd.setCursor(0,1);
  lcd.print("CapSistema.com.br");
  delay(3000);

O LCD primeiro exibirá as instruções para usar o Monitor serial e digitar os caracteres a serem exibidos.

Defina a opção Monitor serial para “Sem fim de linha”

  lcd.clear();
  lcd.setCursor(0,0); 
  lcd.print("Use o Monitor Ser.");
  lcd.setCursor(0,1);
  lcd.print("Digite para exibir");  
}

a função de loop verificará continuamente os dados seriais de entrada da porta serial usando a função Serial.available(). Se houver uma mensagem, ele aguarda um segundo e imprime a mensagem no LCD usando as funções lcd.write() e Serial.read().

void loop()   
{
   //quando os personagens chegam pela porta serial ...
   if (Serial.available()) {
      delay(100);             // espere um pouco até que toda a mensagem chegue
      lcd.clear();            // limpar a tela
      while (Serial.available() > 0) { // leia todos os personagens disponíveis
         lcd.write(Serial.read());     // exibir cada caractere no LCD
      }
   }
}

O código do Compete é fornecido abaixo, então carregue o código e abra o monitor serial. Em seguida, digite mensagem e pressione Enter. Sua mensagem será exibida no LCD.

Se você não obtiver uma resposta adequada ou nenhuma resposta no LCD, verifique o endereço do controlador I2C ou digitalize-o novamente com o código fornecido acima para obter o endereço correto.

 

Código

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup()   
{
   Serial.begin(9600);  
   lcd.begin (16,2); 
   lcd.setBacklight(HIGH); 
   lcd.setCursor(0,0); 
   lcd.print("Hello, world!");
   delay(1000);
   lcd.setCursor(0,1);
   lcd.print("CapSistema.com.br");
   delay(3000);  
   lcd.clear();
   lcd.setCursor(0,0); 
   lcd.print("Use o Monitor Ser. ");
   lcd.setCursor(0,1);
   lcd.print("Digite para exibir");  
}

void loop()   
{
   if (Serial.available()) {
      delay(100);
      lcd.clear();
      while (Serial.available() > 0) {
         lcd.wrte(Serial.read();
      }
   }
}