Atualmente, o módulo I2C para LCD é a melhor solução quando necessitamos reduzir a complexidade na montagem dos circuitos. Pois um dos grandes problemas ao trabalhar com o display LCD 16 x 2 é sua grande quantidade de conexões. Conforme é possível observar na Figura 1, temos um total de 16 pinos no LCD 16×2.
Logo, o circuito se torna mais complexo, em virtude da quantidade de fios e conexões.
Em suma, o propósito desse artigo é apresentar uma solução para reduzir a complexidade do circuito e utilizar apenas 2 fios de controle para o LCD. Para isto, utilizaremos o módulo I2C para o LCD.
A seguir, apresentaremos o módulo I2C PCF8574 e sua comunicação com o Display LCD 16×2.
Comunicação I2C com o Display LCD 16×2
O display LCD 16×2 necessita de várias conexões para funcionar. Logo, isso gera diversas consequências nas etapas de projeto, como: aumento da quantidade de conexões, cabeamento e aumento no número de trilhas na placa de circuito impresso.
Desse modo, para que possamos reduzir essa quantidade de elementos, devemos utilizar o módulo I2C para LCD 16×2, conforme apresentado na Figura 1.
Na Figura 1, temos o display da esquerda sem o módulo e o display da direita com o módulo I2C soldado. Esse módulo é composto pelo CHIP PCF8574, que tem a finalidade de controlar suas saídas através de dois pinos de comunicação I2C.
Desse modo, é possível transmitir todas as informações de controle do LCD utilizando apenas dois fios.
A seguir, desenvolvemos uma aplicação onde iremos apresentar um circuito onde faremos a conexão e programação.
Aplicação – Detector de Porta Aberta/Fechada
Primeiramente, apresentação o circuito completo na Figura 2. Para realizar o processo de detecção de porta aberta e fechada, utilizamos o sensor Reed Switch e um ímã.
Portanto, o Reed Switch será o responsável por enviar informação do estado da porta para o Arduino. Quando a porta estiver fechada, o ímã estará próximo do Reed Switch. Caso contrário, o ímã estará afastado. Em seguida, o LCD apresentará a mensagem do estado da porta para o usuário.
Agora, apresentamos a lista de componentes eletrônicos para a construção completa do projeto. Todos os ítens estão disponíveis em nossa Loja Autocore Robótica.
Lista de Componentes Eletrônicos
01 x Arduino Nano
01 x LCD 16×2
01 x Módulo I2C para Display LCD
01 x Sensor Reed Switch
01 x Resistor 10kR
01 x Protoboard 830 pontos
A seguir, iniciaremos a discussão do projeto, a fim de compreendermos o funcionamento do módulo I2C.
Desenvolvimento da Lógica de Programação para o Módulo I2C para LCD 16×2
Primeiramente, apresentamos a lógica de programação completa, para desenvolvimento do detector de estado de porta aberta/fechada. Em seguida, discutiremos a lógica do sistema.
<code>#include <Wire.h> //Biblioteca de Comunicacao I2C #include <LiquidCrystal_I2C.h> //Biblioteca I2C do LCD 16x2 LiquidCrystal_I2C lcd(0x27,20,4); // Configurando o endereco do LCD 16x2 para 0x27 #define REED 8 bool sensor = 0, EstadoAnterior = 1; void setup() { Wire.begin(); //Inicializacao da Comunicacao I2C Serial.begin(9600); //Inicializacao da comunicacao Serial lcd.init(); //Inicializacao do LCD lcd.backlight(); pinMode(8, INPUT); } void loop() { sensor = digitalRead(REED); if(sensor == 1 && EstadoAnterior == 0) { lcd.clear(); lcd.setCursor(2,0); lcd.print("Estado Atual"); lcd.setCursor(1,1); lcd.print("Porta Fechada"); EstadoAnterior = 1; } if(sensor == 0 && EstadoAnterior == 1) { lcd.clear(); lcd.setCursor(2,0); lcd.print("Estado Atual"); lcd.setCursor(2,1); lcd.print("Porta Aberta"); EstadoAnterior = 0; } delay(2000); }</code>
Em suma, o código apresentado é simples e tem o intuito de servir como exemplo básico. Inicialmente, inserimos a biblioteca I2C do módulo (Baixa a Biblioteca) e da comunicação I2C.
Em seguida, declaramos as variáveis do programa e entramos na função void setup, conforme apresentado a seguir.
<code>#include <Wire.h> //Biblioteca de Comunicacao I2C #include <LiquidCrystal_I2C.h> //Biblioteca I2C do LCD 16x2 LiquidCrystal_I2C lcd(0x27,20,4); // Configurando o endereco do LCD 16x2 para 0x27 #define REED 8 bool sensor = 0, EstadoAnterior = 1; void setup() { Wire.begin(); //Inicializacao da Comunicacao I2C Serial.begin(9600); //Inicializacao da comunicacao Serial lcd.init(); //Inicializacao do LCD lcd.backlight(); pinMode(8, INPUT); }</code>
Portanto, realizamos a inicialização da comunicação I2C e do módulo LCD 16 x 2. Finalmente, configuramos o pino do sensor Reed Switch como entrada e, em seguida, executamos a lógica na função loop.
De acordo com a lógica, em cada iteração é realizada uma leitura do estado do sensor, conforme apresentada na linha a seguir.
<code>sensor = digitalRead(REED);</code>
Em seguida, verifica-se o estado da variável, conforme apresentado nas linhas abaixo.
<code>if(sensor == 1 && EstadoAnterior == 0) { lcd.clear(); lcd.setCursor(2,0); lcd.print("Estado Atual"); lcd.setCursor(1,1); lcd.print("Porta Fechada"); EstadoAnterior = 1; } if(sensor == 0 && EstadoAnterior == 1) { lcd.clear(); lcd.setCursor(2,0); lcd.print("Estado Atual"); lcd.setCursor(2,1); lcd.print("Porta Aberta"); EstadoAnterior = 0; }</code>
Caso o valor seja 0, exibirá a mensagem “Porta Aberta”, conforme apresentado na Figura 3.
No entanto, caso o valor seja 1, apresentará a mensagem “Porta Fechada”, conforme mostrado na Figura 4.
Assim, por meio dessa aplicação observamos que os comandos são iguais aos utilizados pela biblioteca LiquidCrystal.
Dessa forma, simplificamos e garantimos maior facilidade na construção do circuito.
Conclusão
Portanto, através do módulo I2C, foi possível realizar sua união nos pinos do LCD e, em seguida, realizar a comunicação. Dessa forma, realizou-se a comunicação com apenas dois fios do Arduino.
Além disso, permitiu reduzir a quantidade de fios, de modo a aumentar a disponibilidade de outros pinos de entrada/saída. Desse modo, é possível desenvolver aplicações que necessitam de uma maior disponibilizade de pinos de E/S, quando desejamos utilizar um LCD 16×2.
Portanto, consideramos o módulo I2C como um módulo ideal para solucionar o problema de excesso de pinos de controle para o LCD 16×2.