Como utilizar o Módulo I2C com displays 16×2 e 20×4

Um dos maiores problemas em utilizar um display sem um módulo como o I2C é o emaranhado de fios e conexões que devem ser feitas para comunicação entre o display e o microcontrolador. Uma maneira interessante de resolver esse problema é usarmos o módulo I2C, que utiliza a comunicação pelo protocolo I2C para controlar o display. Nesse tutorial iremos aprender como fazer as conexões entre o módulo I2C, o microcontrolador Arduino Uno e o display 16×2.

O módulo I2C pode ser considerado um conversor com função de manipular as conexões de um display, sendo ele de tamanho 16×2 ou 20×4. O módulo usa de um protocolo chamado I2C que faz a manipulação através de um chip que pode ser visto facilmente na interface do módulo. Normalmente, os módulos I2C possuem a mesma pinagem, conforme figura abaixo.

Ainda sobre o módulo I2C, é possível configurá-lo em endereços diferentes através das conexões definidas no próprio módulo como A0, A1 e A2. A tabela abaixo mostra a configuração de endereços possíveis com a manipulação das conexões descritas.

Endereço A0 A1 A2
0x20 0 0 0
0x21 1 0 0
0x22 0 1 0
0x23 1 1 0
0x24 0 0 1
0x25 1 0 1
0x26 0 1 1
0x27 1 1 1

As conexões A0, A1 e A2 podem ser soldadas ligando o ponto de baixo com o de cima. Com essa configuração você vai obter sempre o endereço 0x20 ou 0x28 dependendo do chip do módulo.

O display 16×2 é bastante usado em projetos simples e até mais complexos de automação. No tutorial estaremos utilizando o display 16×2, mas as implementações aqui feitas podem também ser executadas no display 20×4.

A lista de componentes utilizados no tutorial é a seguinte:

* O Arduino Uno pode ser substituído por qualquer outro microcontrolador da família Arduino sem prejudicar o funcionamento da implementação.

** O Display 16×2 pode ser substituído por um display 20×4 sem interferência na execução do projeto.

Montando o projeto

A implementação do projeto pode ser considerada simples e de fácil execução. O esquemático do projeto está abaixo para referência:

Mergulhando no projeto

Software

Utilizaremos a IDE do Arduino para programar e compilar o código. Primeiramente vamos compilar o código que pode ser encontrado na própria IDE do Arduino chamado I2CScanner. Faremos isso pois precisamos descobrir o endereço que está sendo utilizado pelo módulo para comunicação com o Arduino. O código pode ser visto abaixo:

 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Você pode consultar, baixar, modificar e compartilhar o código deste tutorial em nosso repositório do GitHub! E lá você encontra todos os códigos já publicados aqui no blog! Vamos compartilhar conhecimento!

Após compilação e envio do código para o microcontrolador que estiver utilizando, abra o monitor serial e verifique o endereço encontrado.

Agora abra uma nova Sketch e vamos “codar” hehe!

Incluímos as bibliotecas wire.h, LCD.h e LiquidCrystal_I2C.h, responsáveis pelo funcionamento correto do código. Lembre-se de adicionar a biblioteca LiquidCrystal fazendo download pelo link https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/ e adicionando a IDE como já ensinado em outros tutoriais.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>

Utilizamos as #define para definir constantes no código e como uma boa prática de programação, pois, caso você deseje mudar essas informações, basta alterar as constantes.

#define addressI2C 0x27 //Endereço obtido a partir do código anterior
#define BL 3
#define EN 2
#define RW 1
#define RS 0
#define D4 4
#define D5 5
#define D6 6
#define D7 7
#define col 16
#define lin 2

Inicializamos então o objeto LiquidCrystal com as constantes definidas anteriormente.

LiquidCrystal_I2C lcd(addressI2C, EN, RW, RS, D4, D5, D6, D7);

Podemos também definir uma mensagem para ficar passando no display em scroll. É exatamente o que vamos fazer. Para isso definimos uma string contendo a frase.

int Cursor = 16;
int inicioFrase, fimFrase = 0;
int tamanhoFrase = 0;
String frase = "Portal do Arduino: www.portaldoarduino.com.br";

Na função setup() vamos inicializar o objeto criado através da função begin() passando como parâmetro o número de colunas e de linhas, respectivamente, do display. Inicializamos também o pino de luz de fundo e acendemos a mesma.

void setup(){
 lcd.begin(col, lin);
 lcd.setBacklightPin(BL, POSITIVE);
 lcd.setBacklight(HIGH);
}

Na função loop() e rolagem() iremos fazer um scroll com a frase definida acima.

void loop(){
 lcd.setCursor(5,0);
 lcd.print("Lucas");
 lcd.setCursor(0,1);
 lcd.print(frase.substring(inicioFrase,fimFrase));
 delay(200); //Velocidade do scroll. Menor = mais rápido.
 rolagem();
 tamanhoFrase = frase.length();
 if(inicioFrase == tamanhoFrase){
  inicioFrase = 0;
  fimFrase = 0;
 }
}
void rolagem(){
 lcd.clear();
 if(inicioFrase == 0 && Cursor > 0){
  Cursor--;
  fimFrase++;
 } else if (inicioFrase == fimFrase){
  inicioFrase = 0;
  fimFrase = 0;
  Cursor = 16;
 } else if(fimFrase == frase.length() && Cursor == 0){
  inicioFrase++;
 } else {
  inicioFrase++;
  fimFrase++;
 }
}

Hardware

Muita atenção ao Arduino que irá utilizar! No caso do Arduino Mega, os pinos SDA e SCL do Módulo I2C devem ser conectados as portas 20 e 21, respectivamente.

A intensidade de luz de fundo do display pode ser alterada através do potenciômetro localizado atrás do módulo I2C. No sistema utilizamos o display 16×2, mas, caso queiram, o display pode ser substituído por um maior como o display 20×4 (Lembrando sempre de alterar as constantes definidas no código). Mais sobre o protocolo I2C pode ser visto em https://pt.wikipedia.org/wiki/I²2C

Conclusão

A junção entre o módulo I2C e o display facilita muuuuito a utilização dos mesmos em sistemas de automação. Em breve, aqui mesmo, você poderá encontrar mais algumas funcionalidades que podem ser adicionadas a esse sistema, fazendo seu uso mais interessante ao nosso mundo Maker. Qualquer dúvida, sugestão ou crítica pode ser enviada diretamente por e-mail ou nos comentários abaixo. Obrigado e até a próxima 😀

Referências

https://pt.wikipedia.org/wiki/I²2C

Sobre Lucas Soares Gomes 5 artigos
Bacharelando em Ciência da Computação | UFV Campus Florestal (31) 9 9820-1535 l.u.c.a.s.21 - Skype lucas.s.gomes@ufv.br

2 Comentários

    • Olá Edval.
      Verifique se os jumpers estão bem conectados na protoboard, esse tipo der costuma acontecer quando as conexões não estão bem estabelecidas.
      Abraço.

2 Trackbacks / Pingbacks

  1. Sistema de Alarme Codificado com Sensor de Vibração - Portal do Arduino
  2. Sistema de Alarme c/ Arduino, Display 16x2 e Sensor de Vibração SW-420

Deixe uma resposta

O seu endereço de email não será publicado.


*