fbpx
ArduinoNovidade

Como utilizar o display LCD 20×04 com módulo I2C no Arduino

Neste tutorial aprendemos sobre a importância, especificações e forma de utilização do display LDC 20×04. 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 20×4 com módulo I2C no Arduino. 

Figura1: Módulo I2C para display LCD 16×2 ou 20×4.

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.

Figura 2: Display 20×4 com módulo I2C.

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.

A imagem detalha modulo I2C acoplado no display
Figura 3: Partes que compõem 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 as conexões e endereços hexadecimais.

A imagem mostra um modelo de como mudar endereço por meio de soldagem em um display
Figura 4: Possíveis endereços do módulo I2C.

MATERIAIS NECESSÁRIOS

1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
1 x Cabo USB;
1 x Display LCD 20×04;
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 que sua placa UNO esteja desligada. Em seguida monte o circuito da Figura 3 utilizando o Módulo I2C e os jumpers macho-fêmea.

Descrição do circuito para utilização do display 20x4  e módulo I2C.
Figura 5: Circuito utilizando o módulo I2C Display 20×4 e Arduino UNO.

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:

 SCLSDA
Arduino NanoA5A4
Arduino Mega2120
Arduino Leonardo32
Arduino Micro32

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.

Figura 6: endereço encontrado do módulo I2C

Elaborando o código:

Após a montagem do circuito, vamos programação do Sketch no Arduino IDE. Nesse projeto, vamos utilizar o Display 20×04 com módulo I2C para exibir inicialmente as mensagens:

“BLOG DA ROBOTICA”

“TUTORIAL DISPLAY”

“CASA 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.

Figura 7: Instalação da biblioteca LiquidCrystal I2C através do Gerenciador de Bibliotecas.

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”);.

Para escrever a terceira linha do texto, posicionaremos o cursor para a posição linha 2 e coluna 0 com a função lcd.setCursor(0, 2);. Daí, escreveremos o texto com a função lcd.print(“CASA DA ROBOTICA” );.

Para escrever a quarta linha do texto, posicionaremos o cursor para a posição linha 3 e coluna 0 com a função lcd.setCursor(0, 3);. 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 20 // Serve para definir o numero de colunas do display utilizado
#define lin  4 // 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 piscando em intervalos de 1 segundo.

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.

Figura 8: ajuste do Trimpot de ajuste do contraste

Espero ter ajudado,

Obrigado a todos e em caso de dúvidas deixe seu comentário abaixo!

Att. Jonas Souza

Dúvidas? Deixe seu comentário

Graduando em Engenharia Elétrica.

Jonas Souza

Graduando em Engenharia Elétrica.

Deixe uma pergunta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.