Interface LCD 16X2 com ESP32 usando I2C
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.
Conteudo
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):
A0 | A1 | A2 | HEX Address |
1 | 1 | 1 | 0x27 |
0 | 1 | 1 | 0x26 |
1 | 0 | 1 | 0x25 |
0 | 0 | 1 | 0x24 |
1 | 1 | 0 | 0x23 |
0 | 1 | 0 | 0x22 |
1 | 0 | 0 | 0x21 |
0 | 0 | 0 | 0x20 |
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(); } } }