Display LCD 20×4 e LCD 16×2 com Adaptador I2C – Utilizando o display com Arduino
No tutorial sobre a utilização de um display lcd 16×2 com Arduino aprendemos a importância dos displays e como usar um LCD de caracteres, em especial o 16×2. Apesar de esse LCD ser prático e simples, ele possui um problema, uma grande demanda por ligações. Para resolver isso, podemos usar um módulo adaptador I2C que facilita ainda mais o uso desse tipo de recurso. Nesse tutorial iremos aprender a usar o Display LCD 20×4 com Adaptador I2C junto a um Arduino.
O uso tanto do display LCD 16×2 tanto do display LCD 20×4 é muito semelhante, a diferença entre eles é o numero de caracteres que dispõem na tela. Como falamos sobre o modelo 16×2 no último tutorial, iremos aproveitar a oportunidade para mostrar um pouco mais sobre o modelo 20×4. Caso você tenha em suas mão o 16×2, você poderá facilmente adaptar o programa usado nesse tutorial para você.
[toc]
Porque usar comunicação I2C para controlar seu LCD?
Na figura acima, percebemos a existência de uma grande quantidade de contatos para realização do seu acionamento. Para facilitar o seu uso, iremos trabalhar com o adaptador I2C para display LCD.
Para usar esse LCD diretamente no Arduino, você irá precisa, além das ligações de alimentação, de 6 pinos: RS, EN, D7, D6, D5, e D4 para que seu LCD converse com seu Arduino. Se você estiver trabalhando com um projeto mais complexo, talvez você não terá tantos pinos disponíveis no seu Arduino para seu LCD da forma usual.
Com o módulo de interface I2C, você precisará de apenas 2 pinos (I2C) para imprimir as informações que deseja em seu LCD. Se você já tiver usando outros componentes I2C em seu projeto, esse pino não precisará usar mais nenhuma porta, visto que ele poderá usar os mesmo pinos já usado para o outro dispositivo I2C.
Adaptador I2C para Display LCD 20×4 e 16×2
Para que seja possível a comunicação entre o Arduino e o LCD, precisaremos de um adaptador I2C. Esse adaptador nada mais é que um conversor cuja função consiste em manipular os contatos do LCD, de modo que, após este processo, teremos apenas 2 contatos para realizar a comunicação com uma placa Arduino através do protocolo I2C.
Ele conta com o chip PCF8574T ou PCF8574AT que é responsável por essa interface . Você pode encontrar vários modelos de módulos ligeiramente diferentes.
Em geral eles possuem o seguinte formato:
Como você pode ver na imagem, a maioria dos módulos de interface I2C para LCD possuem:
- Pinos para conexão com o Display (16 pinos);
- Pinos de Alimentação do Módulo (GND e VCC);
- Pinos de comunicação I2C (SDA e SCL);
- Trimpot para ajuste de contraste da tela;
- Jumper para ligar e desligar a luz de fundo (Backlight);
- Led indicador de módulo ligado.
- Chip de Interface (PCF8574T ou PCF8574AT )
Endereço do módulo I2C
Para alguns modelos ainda é possível configurar o endereço do módulo I2C através de A0, A1 e A2. Abaixo você pode conferir a tabela de endereços possíveis para cada um dos chips (PCF8574T ou PCF8574AT ):
A0, A1 e A2 são portas do nosso Chip:
Que em geral vem ligados a alimentação do módulo (VCC):
Quando conectamos o ponto 1 com 1, 2 com 2 ou 3 com 3, estamos colocando um nivel lógico baixo em A0, A1 ou A2 respectivamente. Na figura anterior, os pinos A0, A1 e A2 estão conectados ao chip do módulo. Veja que segundo esse esquemático, estamos com 5V em cada um dos 3 pinos. Ou seja, nosso endereço será 0x27 caso o chip seja o PCF8574T ou 0x3F caso o chip seja o PCF8574AT.
Para alterar o endereço podemos colocar um ponto de solda para conectar os pinos A0, A1 ou A2 ao GND para as placas que tenha essa opção:
Para conectar os pinos A0, A1 ou A2 ao GND, você precisa pode usar solda de estanho para ligar o ponto de baixo com o de cima, tal como na figura a seguir:
Display LCD 20×4 com adaptador I2C
Para o nosso tutorial, iremos usar um LCD que já possui o adaptador soldado ao módulo display. Para o display que usaremos não temos a opção de mudança de endereço:
Veja em detalhes o módulo I2C usado:
Repare que ele não tem a opção de mudança de endereço. O chip dele é o PCF8574T, ou seja, iremos usar o endereço 0x27.
Display LCD 16×2 com adaptador I2C
Você também pode usar a versão do Display LCD 16×2 com adaptador I2C. A maior diferença é a quantidade de caracteres. Explicaremos mais a frente como adaptar o programa que usamos nesse tutorial para o display LCD 16×2.
O endereçamento funcionará da mesma forma que o explicado anteriormente. Verifique o modelo do seu adaptador para descobrir o endereço do mesmo.
Mãos à obra – Imprimindo informações no display LCD 20×4 I2C
Componentes utilizados
Caso tenha um LCD 16×2 ou 20×4 e queira adapta-lo, basta adquirir o Módulo i2C separado. Módulo I2C para Display LCD compativel com 16×02 e 20×4
Montando o projeto
Na figura abaixo, o leitor poderá conferir como foi realizada a montagem do projeto apresentado neste tutorial. Lembre-se de montar o projeto com o seu Arduino desligado.
Veja como ficou o nosso:
Programando
Antes de adentrarmos na apresentação do código, disponibilizamos uma seção para ajudar aqueles que são iniciantes no assunto. Sinta-se livre para prosseguir caso você já tem domínio da IDE do Arduino.
Conectando o Arduino ao computador
Primeiramente, conecte seu Arduino ao computador e abra a IDE Arduino. Em seguida, é necessário selecionar a porta COM na qual o Arduino está conectado (este procedimento pode ser feito clicando no menu Ferramentas (tools) e em seguida escolhendo-se a porta correspondente no submenu Porta (port). Neste caso, a porta na qual está o Arduino é apresentada da seguinte maneira: COM3 (Arduino Micro).
Por fim, garanta também que o tipo de placa apropriado esteja selecionado (isso pode ser feito acessando o menu Ferramentas (tools) e o submenu Placa (board)).
– Biblioteca
Para desenvolver o projeto proposto com o Display LCD I2C 20X4 utilizou-se uma biblioteca capaz de atuar sobre o protocolo I2C para facilitar os processos de endereçamento e troca de dados que fazem parte do funcionamento do protocolo citado. Esta biblioteca pode ser encontrada aqui.
Adquirindo e instalando a biblioteca que será utilizada
Após a realização do download dos arquivos compactados no formato ZIP, abra a IDE do Arduino, selecione o menu Sketch, o submenu Incluir Bilioteca e por fim, basta clicar na opção Adicionar biblioteca .ZIP (Add ZIP Library) e encontrar o arquivo que acabou de ser baixado.
Uma outra forma de fazer isso é extrair o conteúdo do arquivo ZIP dentro da pasta Libraries (onde foi instalada a IDE do Arduino).
– Código do projeto
Segue o código a ser utilizado no Arduino para imprimir informações no Display LCD I2C 20×4.
#include <Wire.h> #include <LiquidCrystal_I2C.h> // Inicializa o display no endereco 0x27 LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); void setup() { lcd.begin (20,4); } void loop() { lcd.setCursor(0,0); lcd.print("********************"); lcd.setCursor(9,1); lcd.print("VIDA"); lcd.setCursor(5,2); lcd.print("DE SILICIO"); lcd.setCursor(0,3); lcd.print("********************"); }
Entendendo a fundo
Software
– Incluindo as bibliotecas
Inicialmente, observe que foi necessário incluir duas bibliotecas no código para que o mesmo pudesse funcionar corretamente. A biblioteca wire.h é a responsável pela comunicação utilizando o protocolo I2C enquanto a biblioteca LiquidCrystal_I2C.h atua sobre a biblioteca wire.h simplificando o processo de comunicação através do protocolo citado, para que assim, o usuário possa utilizar o Display LCD I2C 20×4 de maneira mais fácil.
#include <Wire.h> #include <LiquidCrystal_I2C.h>
– Criando o objeto lcd
Em seguida, cria-se um objeto que será utilizado posteriormente para representar o Display LCD I2C 20×4 no código.
Lembre-se: lcd é apenas um nome, sendo assim, é importante ressaltar que este objeto poderia ser chamado por qualquer outro nome, como por exemplo, display.
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
Essa função é padrão tanto para o LCD 20×4 como para o 16×2. Nela definimos o endereço do adaptador, que para o nosso equivale sempre 0x27.
Além do endereço, definimos, nesse comando, os pinos no chip I2C usados para conexões no LCD. Como esse pinos sempre são os mesmos, temos esse comando sendo usado para definir apenas o endereço, que para alguns módulos pode ser alterado. As demais configurações são padrões.
// Define os pinos do chip I2C usados para as conexões do LCD: // (Endereço,en,rw,rs,d4,d5,d6,d7,bl, blpol) LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
– Definindo as configurações iniciais
Dentro da função setup() utilizamos a função lcd.begin() (repare que o nome lcd corresponde ao objeto criado anteriormente) para inicializar o Display LCD I2C 20×4, de modo que, os parâmetros utilizados são o número de colunas e o número de linhas do display, nesta ordem.
void setup() { lcd.begin (20,4); }
Veja que, caso esteja usando um display LCD 16×2, aqui você definirá o tamanho do LCD com 16 colunas e 2 linhas:
void setup() { lcd.begin (16,2); //configuração para display 16x2 }
– Imprimindo informações no Display
O primeiro passo na manipulação do display consiste em localizar o cursor no local adequado. Este cursor nada mais é do que o elemento que apontará para o espaço que será preenchido com um caractere, sendo assim, utilizamos a função setCursor() para determinar qual será o ponto de partida da escrita de uma sequência de caracteres.
Perceba que a as posições dos espaços para escrita são dadas da seguinte forma:
Desta maneira, ao utilizarmos “0” e “0” como parâmetros, estaremos definindo a coordenada (0,0) como ponto de partida para o começo da escrita.
lcd.setCursor(0,0);
Em seguida, utilizamos a função print() para poder escrever algo a partir da posição que definimos como ponto de partida. Neste caso, simplesmente preencheremos com ‘*’.
lcd.print("********************");
Posteriormente, utilizamos novamente a função setCursor() para posicionar o cursor na segunda linha.
lcd.setCursor(9,1);
Com o cursor posicionado, escrevemos a palavra ‘VIDA’.
lcd.print("VIDA");
Para continuar, posicionamos o cursor na próxima linha.
lcd.setCursor(4,2);
E escrevemos as palavras “DE SILICIO”.
lcd.print("DE SILICIO");
Para finalizar, posicionamos o cursor no início da última linha.
lcd.setCursor(0,3);
Neste momento, iremos proceder da mesma maneira que fizemos na primeira linha, preenchendo a mesma com ‘*’.
lcd.print("********************");
Veja como ficou nossa função loop():
void loop() { lcd.setCursor(0,0); lcd.print("********************"); lcd.setCursor(0,1); lcd.print("aaaaaaaaaaaaaa"); lcd.setCursor(0,2); lcd.print("ssssssssssssssss"); lcd.setCursor(0,3); lcd.print("ddddddddddddddd"); }
Adaptando o programa para o display LCD 16×2
Para adaptar esse programa para o LCD 16×2 você precisa ter em mente que a tela é menor. Tendo 16 colunas e 2 linhas.
– Definindo as configurações iniciais
Dentro da função setup() utilizamos a função lcd.begin() para inicializar o Display LCD I2C 16×2, de modo que, os parâmetros utilizados são o número de colunas e o número de linhas do display, nesta ordem.
void setup() { lcd.begin (16,2); //configuração para display 16x2 }
– Imprimindo informações no Display
Na manipulação do display precisamos localizar o cursor no local adequado usando o comando setCursor() . Perceba que a as posições dos espaços para escrita são dadas da seguinte forma:
Em seguida basta usar o comando lcd.print().
Considerações finais
Neste tutorial buscamos elaborar um conteúdo semelhante ao que já temos sobre a utilização de displays LCD, no entanto, neste caso, utilizamos um display que ao invés de utilizar vários pinos numa placa Arduino, este necessita apenas de 4 pinos em virtude de a comunicação ser feita através do protocolo de comunicação I2C. Esperamos que você tenha gostado deste conteúdo, sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.
21 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Caro Daniel;
Utilizando a biblioteca fornecida para esse módulo, a função “lcd.clear()” aparentemente não funciona ou eu não estou usando corretamente.
Tento utilizar essa função de forma a limpar o lcd para excutar a função lcd.print() no display vazio. No entanto, aparentemente a função “clear()” impede qualquer posterior exibição no display.
Por acaso há oputros relatos identicos ao meu?
Att;
Marcelo Euler
Estou tentando fazer funcionar a lib em um display 16×4, porém o mais próximo que consegui foi utilizar o 20×4 e diminuir 4 posições na hora de imprimir, mas fica chato, queria deixar certinho, até abri e lib e tentei ver onde estava o código para alterar e deixar certo pra utilizar esse display, mas por enquanto não deu certo, se alguem souber indicar uma opção.
aula de automacao boa
Fui compilar e o IDE acusou :error: “POSITIVE” não declarado. Pode me ajudar?
Fui compilar esse esket e a IDE diz: error: ‘POSITIVE’ was not declared in this scope
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
Fui compilar essa programação e a IDE acusou um erro, diz que POSITIVE não foi declarado ! O que pode ser ??
Muito bom seu tutorial, parabéns! Me esclareça uma dúvida, por favor: tenho um display lcd 16×2 com teclado – 6 botões; usando esse módulo I2C terei acesso normalmente aos seus botões? Obrigado.
Tutorial Muito Bom e Completo!!! Irei utilizar em um projeto.
Parabéns pelo tutorial, ficou muito bom!
Comprei o Display 20×4 I2C e fiz o mesmo procedimento mas não funcionou, descobri que o problema era o endereço do display, no tutorial está como 0x27 e o meu era 0x3F. Depois de alterar funcionou!
Como adendo ao tutorial deixo o código abaixo que deve ser rodado antes só para descobrir o endereço do display:
#include
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println(“\nI2C Scanner”);
}
void loop()
{
byte error, address;
int nDevices;
Serial.println(“Scaneando dispositivos”);
nDevices = 0;
for(address = 1; address < 127; address++ )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device encontrado no endereco 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Erro desconhecido no endereco 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("Nenhum dispositivo I2C encontrado\n");
else
Serial.println("FIM \n");
delay(5000); // wait 5 seconds for next scan
}
Fonte: https://eletronicafacil.net/2017/09/24/curso-de-arduino-display-de-lcd-i2c-20-x-4-eletronica-facil/
Faltou o no include: #include
Comprei dois Display, com o módulo I2C acoplado, e liguei um deles a um Arduino Mega. O Display funcionou corretamente, mas induz erros nas portas seriais do Arduino. Ocorre o mesmo trocando o Display e utilizando uma fonte de 5V independente.
Qual a solução?
tive que pesquisar mais na internet pois meu display acendia mas não recebia dados, tenho esse módulo I2C acoplado e o endereçamento 0x27 não procedia… encontrei algo parecido com 0x3F – mas sou iniciante e não sei onde encaixar esse endereçamento e não entendi muito bem o tutorial. alguém tem algo mais fácil de entender?
Fiz tudo do jeito que explicou e nada acontece no meu display, o que será?
ja desconectei e montei tudo de novo e nada.
estou muito chateado com arduino, comprei um display de nokia e não funcionou.
comprei um display de oled 0.96 porém os pinos deles são totalmente diferente, não achei um tutorial sequer
que explique como ligar esse modelo de oled.
ai agora comprei esse display lcd de 20×4 e nada de novo, nem acende a luz, consigo ligar sensores, leds, etc.. mais este display não consegui.
Alan, você já testou estes displays com outro Arduino?
BOM DIA.
CONSIGO LIGAR DOIS DISPLAY COM 12C NO MESMO ARDUINO?
Certamente meu amigo!
Daniel, bom dia, o programa roda, porque vejo o display piscar (inclui a linha backlight e variei o tempo de LOW e HIGH para teste) mas não escreve. Acredito que seja algo que devo setar no Display ou será que preciso variar a intensidade no potenciometro? Grato.
Você tentou fazer esta variação para termos certeza?
Parabéns Daniel sou inscrito no seu canal (vida de silicio), posta um vídeo tutorial sobre display 20×4 com i2c na pratica.
Estou tentando iniciar a começar a programar em c com pic16f628a e ccs como compilador.
Muito obrigado pelo seu retorno Pedro!