Como utilizar o display LCD 16×02 com módulo I2C no Arduino
No tutorial Como utilizar o Display LCD 16×2 no Arduino aprendemos sobre a importância, especificações e forma de utilização do display LDC 16×2. Apesar de ser simples, a conexão deste componente ao Arduino requer o uso de muitas portas digitais, o que pode ser um problema em projetos maiores.
Este problema pode ser contornado com o uso de um módulo I2C para display LCD 16×2 ou 20×4, conforme Figura 1. Com este componente, é possível controlar um display 16×2 ou 20×4 utilizando apenas duas portas do Arduino.
Neste tutorial, vamos aprender como utilizar o display LCD 16×2 com módulo I2C no Arduino.
MÓDULO I2C PARA DISPLAY LCD 16X2 OU 20X4
O módulo I2C para display LCD 16×2 ou 20×4 tem como principal função simplificar as conexões e facilitar a utilização de displays LCD ao microcontrolador.
O módulo I2C deve ser acoplado ao display LCD por meio da conexão dos seus 16 pinos, conforme ilustra a Figura 2.
No centro do módulo I2C, está o chip PCF8574, um expansor de 8 bits que converte os dados I2C de um microcontrolador nos dados paralelos exigidos pelo display LCD.
Na parte lateral, o módulo I2C conta com quatro pinos para conexão com o Arduino ou qualquer outro microcontrolador que suporte o protocolo de comunicação I2C. Estes quatro pinos são: GND, VCC, SDA e SCL. O pino SDA (do inglês, Serial Data) é o responsável pela transferência e recebimento de dados. Por sua vez, o pino SCL (do inglês, Serial Clock) é utilizado para temporização.
O módulo I2C conta também com dois pinos para controle da luz de fundo do visor do display, que se encontram conectados por um jumper, por padrão. Assim, a luz de fundo estará sempre ligada. Você pode remover este jumper para desligar a luz de fundo do display.
Além disto, a placa conta com um pequeno trimpot para fazer ajustes finos no contraste do display e um barramento para configuração do endereço I2C.
A Figura 3 detalha as partes que compõem o módulo I2C para display LCD 16×2 ou 20×4.
O barramento de configuração do endereço possui três jumpers de solda (A0, A1 e A2) ou pads de solda, usados para codificar o endereço. Acima de cada pad há uma conexão de aterramento (GND). Para alterar o endereço, basta conectar qualquer pad ao pino GND localizado acima deles, soldando-os. A Figura 4 abaixo demonstra todas as conexões e endereços hexadecimais possíveis.
MATERIAIS NECESSÁRIOS
1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
1 x Cabo USB;
1 x Display LCD 16×02;
1x Conversor I2C Módulo para Display 16×02 ou 20×04;
Jumpers macho-fêmea.
ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES
Inicialmente, certifique-se de que a sua placa Arduino esteja desligada. Em seguida monte o circuito da Figura 5 utilizando o Módulo I2C e os jumpers macho-fêmea.
Ao montar o circuito observe os seguintes pontos:
- O GND do módulo I2C deve ser conectado ao pino GND do Arduino;
- O módulo I2C opera com uma tensão de alimentação de 5V. Deste modo, conecte o VCC ao pino 5V do Arduino;
- Nas placas Arduino UNO, os pinos associados ao I2C são A4 (SDA) e A5 (SCL).
Caso você esteja utilizando uma placa Arduino diferente, consulte a Tabela 1 abaixo:
SCL | SDA | |
Arduino Nano | A5 | A4 |
Arduino Mega | 21 | 20 |
Arduino Leonardo | 3 | 2 |
Arduino Micro | 3 | 2 |
Conhecendo o endereço I2C do módulo
Na utilização do código, utilizaremos o endereço I2c do nosso módulo. Como existem diferentes endereços é necessário conhecer qual o nosso está cadastrado, para isso basta fazer o upload do código abaixo na Arduino IDE.
#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); }
Com o código compilado, poderemos ter acesso ao endereço I2C do módulo no monitor serial, no nosso caso foi encontrado o endereço 0x3F, mostrado na Figura 6.
ELABORANDO O CÓDIGO
Após a montagem do circuito, vamos programação do Sketch no Arduino IDE. Nesse projeto, vamos utilizar o Display 16×02 com módulo I2C para exibir inicialmente as mensagens:
“BLOG DA ROBOTICA”
“TUTORIAL DISPLAY”
Para fazer a comunicação do modulo I2C o Arduino, vamos utilizar a biblioteca Wire.h que já se encontra instalada com o Arduino IDE. Para incluí-la ao sketch acesse o seguinte caminho: Sketch>Incluir Biblioteca> Wire.
Vamos usar também a biblioteca LiquidCrystal_I2C.h que permite controlar displays I2C com funções exatamente semelhantes à biblioteca LiquidCrystal. Para instalá-la, abra o Gerenciador de Bibliotecas através do caminho: Ferramentas>Gerenciar Bibliotecas… ou por meio do atalho Ctrl+Shift+I. Em seguida, busque por LiquidCrystal I2C e clique em instalar, conforme a Figura 7.
Vamos entender a lógica de programação desse projeto a partir dos seguintes passos:
1. Incluir as bibliotecas:
Foram incluídas as bibliotecas Wire.h para fazer a comunicação com o I2C e LiquidCrystal_I2C.h para controlar displays I2C.
2. Definir as constantes:
No código definiremos 3 constantes. A constante “col” que se refere ao número de colunas utilizadas no Display, a constante “lin” que se refere ao número de linhas utilizadas no display e a constante “ende” que se refere ao endereço o qual o display se encontra, no nosso caso encontramos 0x3F, se o seu for diferente, substitua pelo endereço encontrado.
3. Criar objeto do tipo LiquidCrystal_I2C
Em seguida, criaremos o objeto lcd, do tipo LiquidCrystal_I2C, e informamos o endereço, número de colunas e linhas do display, no seguinte formato: LiquidCrystal lcd(<endereço>, <coluna>, <linha>);
4. Função setup()
No setup(), inicializaremos a exibição do display LCD usando a função init(). A função clear() será usada para limpar o buffer de exibição. A função backlight deve ser utilizada para ativar a luz de fundo do display
Para iniciar a escrita no display LCD precisamos colocar o cursor na posição na coluna 0 e linha 0. Para isso, usaremos a função lcd.setCursor(0, 0);. A partir daí, escreveremos a primeira parte do texto, que será feita a partir da função lcd.print(“BLOG DA ROBOTICA”);.
Para escrever a segunda linha do texto, posicionaremos o cursor para a posição linha 1 e coluna 0 com a função lcd.setCursor(0, 1);. Daí, escreveremos o texto com a função lcd.print(“TUTORIAL DISPLAY”);.
5. Função loop()
No loop, chamaremos a função que desliga o display lcd.noDisplay() e liga o display lcd.display();.
Desta forma, o Sketch do projeto ficará da seguinte maneira:
#include <Wire.h> // Biblioteca utilizada para fazer a comunicação com o I2C #include <LiquidCrystal_I2C.h> // Biblioteca utilizada para fazer a comunicação com o display 20x4 #define col 16 // Serve para definir o numero de colunas do display utilizado #define lin 2 // Serve para definir o numero de linhas do display utilizado #define ende 0x3F // Serve para definir o endereço do display. LiquidCrystal_I2C lcd(ende,col,lin); // Chamada da funcação LiquidCrystal para ser usada com o I2C void setup() //Incia o display { lcd.init(); // Serve para iniciar a comunicação com o display já conectado lcd.backlight(); // Serve para ligar a luz do display lcd.clear(); // Serve para limpar a tela do display } void loop() { lcd.setCursor(1,0); // Coloca o cursor do display na coluna 1 e linha 1 lcd.print("CASA DA ROBOTICA "); // Comando de saída com a mensagem que deve aparecer na coluna 2 e linha 1. lcd.setCursor(1, 1); //Coloca o cursor do display na coluna 1 e linha 2 lcd.print("MELHOR LOJA 2022"); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 2 lcd.setCursor(1,2); //Coloca o cursor do display na coluna 1 e linha 1 lcd.print("BLOG DA ROBOTICA"); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 3 lcd.setCursor(1 ,3); //Coloca o cursor do display na coluna 1 e linha 2 lcd.print("MELHOR BLOG 2022"); // Comando de saida com a mensagem que deve aparecer na coluna 2 e linha 4 delay(3000); // delay de 5 segundos com todas as mensagens na tela lcd.clear(); // Limpa o display até o loop ser reiniciado }
Após a transferência do código, o display exibirá as mensagens conforme o vídeo 1.
OBSERVAÇÃO: Caso seu display não exiba as mensagens após a transferência do código, ajuste o contraste do display.
AJUSTANDO O CONTRASTE DO DISPLAY
O módulo I2C para display LCD 16×2 ou 20×4 possui um pequeno trimpot de ajuste do contraste do display, conforme Figura 8. Para aumentar o contraste do display basta girar o trimpot no sentido anti-horário. Por sua vez, para diminuir o contraste gire no sentido horário.
Espero ter ajudado,
Obrigada a todos e, em caso de dúvidas, deixe seu comentário abaixo!
Carol Correia Viana
Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.