21 fevereiro 2018

Como conectar dois displays LCD I2C no Arduino

Neste post vamos mostrar como você pode usar dois displays LCD I2C no Arduino para mostrar informações distintas. É uma dúvida que de vez em quando aparece aqui no blog, e você verá que o funcionamento é bem simples.

Dois displays LCD 16x2 I2C com Arduino

Este projeto pode ser usado por exemplo para mostrar em um display um contador parcial e no outro um contador total, ou implementado em uma impressora 3D para que esta exiba mais informações relevantes para o operador. 

Você não precisa necessariamente ter dois displays iguais, podendo ligar um modelo 16x2 com um 20x4, dois displays LCD 20x4, etc. Você pode inclusive usar esses dois displays com outros sensores e módulos I2C, já que eles podem funcionar no mesmo barramento: temos aqui no Arduino e Cia um post mostrando como usar um display LCD 16x2 com um módulo RTC DS1307, ambos I2C.

Descobrindo o endereço I2C do display


Para esse experimento vamos usar dois displays LCD 16x2 I2C Backlight Azul  já com o módulo I2C integrado, o que é muito prático pois evita que você tenha que soldar todos os pinos no display.

Antes de mais nada, precisamos descobrir o endereço I2C dos displays que estamos usando. Isso é necessário pois vamos ligar os dois displays no mesmo barramento, e eles devem ter endereços diferentes para que sejam acionados de forma independente e correta.

O módulo que estou usando já vem com um endereço padrão de fábrica: 0x3F. Para selecionar um novo endereço, você deve soldar o pad correspondente (A0, A1 e A2), mostrado na imagem abaixo (seleção endereço I2C):

Detalhe módulo LCD I2C

Soldando os pads A0, A1 e A2, você pode ter até 8 combinações diferentes de endereço, ou seja, você pode ligar até 8 displays desse tipo no mesmo barramento. No meu teste, soldei o pad A2 e obtive o endereço I2C 0x3B.
Detalhe solda endereço I2C

Esse endereço pode variar de módulo para módulo, ok? Eu tenho um outro display aqui que tem o endereço I2C padrão 0x27. Para se certificar de qual endereço I2C o seu display possui, vamos usar um programa chamado I2CScanner, que faz exatamente o que o nome sugere: escaneia o barramento I2C, mostrando o endereço dos dispositivos conectados.

Antes de mais nada, monte o circuito abaixo, não se esquecendo de deixar os dois displays com endereços I2C diferentes. A alimentação dos displays virá dos pinos Vcc (fio vermelho) e GND (fio preto), e a comunicação I2C será feita pelo pino analógico A4 (SDA - Fio verde), e A5 (SCL - Fio amarelo) do Arduino Uno:

Circuito Arduino Uno e display LCD I2C

Com o circuito montado, carregue o programa abaixo no Arduino:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//Programa: I2CScanner - Escaneamento de barramento I2C

#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0)
    {
      Serial.print("Dispositivo I2C 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("Concluido. Novo escaneamento em 5 segundos...\n");

  delay(5000);        
}

Após o carregamento, abra o serial monitor. Se as ligações estiverem corretas, você verá na tela o endereço dos dois displays:

I2CScanner - Display I2C

Caso apareça apenas um endereço, verifique as conexões e se a solda no pad foi feita corretamente.

Acionando dois displays I2C com Arduino


Existem diversas bibliotecas para uso com display I2C, e neste programa vou usar a biblioteca LiquidCrystal I2C, instalada à partir da própria IDE do Arduino.

Acesse o menu Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas e procure por liquidcrystal_I2c, conforme a imagem abaixo. Clique em instalar:

Biblioteca LiquidCrystal I2C

Para acionar dois displays no mesmo programa, vamos usar os endereços obtidos anteriormente, alterando as linhas 8 e 11 do programa abaixo.

Na linha 8 temos o display1 no endereço 0x3F e na linha 11 o display2 no endereço 0x3B. Com os displays identificados no programa, basta usar os comandos que já estamos acostumados (lcd.setCursor(), lcd.clear(), lcd.print(), etc).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//Programa: Ligando dois displays LCD I2C no Arduino
//Autor: Arduino e Cia

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

//Display LCD 1 no endereco 0x3F, 16 linhas e 2 colunas
LiquidCrystal_I2C display1(0x3F,16,2);

//Display LCD 2 no endereco 0x3B, 16 linhas e 2 colunas
LiquidCrystal_I2C display2(0x3B,16,2);

void setup()
{
  //Inicializa os displays
  display1.init();
  display2.init();

  //Liga o backligh (luz de fundo)
  display1.backlight();
  display2.backlight();

  //Mostra texto no display 1
  display1.setCursor(0,0);
  display1.print("Este e o display");
  display1.setCursor(4,1);
  display1.print("numero 1");
  
  //Mostra texto no display 2
  display2.setCursor(0,0);
  display2.print("Este e o display");
  display2.setCursor(4,1);
  display2.print("numero 2");
}

void loop()
{}

Confira também o post Como usar um display LCD I2C com Raspberry Pi, aqui mesmo no Arduino e Cia.

5 comentários:

  1. Isso funciona sem resistores pull up ou o módulo já tem os resistores pull up embutidos? Pergunto porque queria usar o módulo com um PIC18F4550.

    ResponderExcluir
    Respostas
    1. Bom dia Rogério,

      Já vem com os resistores pull-up no módulo.

      Abraço!

      Adilson

      Excluir
  2. Boa tarde, posso ligar um NFC 532 usando a I2C da mesma forma que o segundo display? Obrigado

    ResponderExcluir