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.
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 16×2 com um 20×4, dois displays LCD 20×4, 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 16×2 com um módulo RTC DS1307, ambos I2C.
Descobrindo o endereço I2C do display
Para esse experimento vamos usar dois displays LCD 16×2 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):
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.
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:
Com o circuito montado, carregue o programa abaixo no Arduino:
//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 encontradon"); 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:
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:
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).
//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.
Show. Valeu.
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.
Bom dia Rogério,
Já vem com os resistores pull-up no módulo.
Abraço!
Adilson
Boa tarde, posso ligar um NFC 532 usando a I2C da mesma forma que o segundo display? Obrigado
Boa noite,
Pode sim. Mesmo esquema.
Abraço!
Adilson
Como funcionaria caso eu queira utilizar dois módulos HX711?
Bom dia,
Em breve post sobre m[odulo HX711.
Abraço!
Adilson
Primeiramente, obrigado pelo tutorial; Eu tenho uma pergunta pertinente:
Todo RTC DS3231 tem, em ambas as suas extremidades, as saídas GND, VCC, SDA e SCL, portanto, é possível usar dois dispositivos diferentes com tal RTC? E como fica a alimentação, deve ser alimentado os dois lados com GND e VCC? Obrigado
Oi Dancopy,
É possível sim, você pode "pendurar" vários dispositivos I2C no mesmo barramento. Apenas verifique se o GND e VCC que você está utilizando é realmente uma entrada ou uma saída do GND e VCC principal. Se for uma saída do GND e VCC principal, você pode utilizar como alimentação para os outros módulos.
Abraço!
Adilson
Deu muito jeito
Funciona muito bem e está muito bem explicado
Obrigado
Oi Tiago,
Maravilha, obrigado pelo retorno. 🙂
Abraço!
Adilson
[…] (Atualizado em 21/02/2018) Confira também o post Como conectar dois displays LCD I2C no Arduino. […]
Muito bem explicado, funciona corretamente.
Obrigado