Como Usar Dois ou Mais Módulos LCD1602-I2C com Arduino
Este projeto demonstra como conectar e controlar dois ou mais displays LCD1602 com módulos I2C a um único Arduino. Esta configuração é altamente versátil e abre uma gama de possibilidades para exibir dados em várias telas.
Aqui estão algumas ideias de projetos usando múltiplos LCDs:
- Exibindo leituras de sensores de diferentes locais em telas separadas.
- Criando um display de informação de múltiplas telas para um projeto.
- Construindo uma interface orientada por menu com opções de navegação em uma tela e conteúdo em outra.
- Ampliando a área de exibição para projetos que exigem mais de 16x2 caracteres.
Hardware/Componentes
- Arduino Uno (ou outra placa compatível)
- Dois ou mais displays LCD1602 com mochilas I2C.
- Fios jumper
- Potenciômetro (para ajuste de contraste nos LCDs - geralmente incluído com a mochila I2C)


Guia de Fiação
(in video at 01:16)
- Conecte o pino VCC de cada LCD I2C ao pino de 5V do Arduino.
- Conecte o pino GND de cada LCD I2C ao pino GND do Arduino.
- Conecte o pino SDA de cada LCD I2C ao pino SDA do Arduino (A4 no Uno).
- Conecte o pino SCL de cada LCD I2C ao pino SCL do Arduino (A5 no Uno).
Para outras placas Arduino, consulte o diagrama de pinos para os pinos SDA e SCL (no vídeo às 02:20).
Endereço:Cada LCD precisa de um endereço I2C único. Isso é tipicamente definido usando pads de solda na mochila I2C (no vídeo em 02:41). Use o código de scanner I2C fornecido (no vídeo em 06:16) para determinar o endereço de cada LCD.
Explicação do Código
O código é projetado para facilitar a exibição de vários tipos de dados (inteiros, floats, strings) em múltiplos LCDs. A funcionalidade principal gira em torno de funções personalizadas:
LiquidCrystal_I2C lcd1(0x3F, 16, 2); // Display 1 (in video at 05:24)
LiquidCrystal_I2C lcd2(0x26, 16, 2); // Display 2
// ... add more LCD objects as needed
Substituir0x3Fe0x26com os endereços I2C dos seus LCDs.
lcdDisplay(1, 0, "Age: ", intToStr(age), " years"); // (in video at 09:23)
Esta função simplifica a exibição de dados em um LCD específico (primeiro argumento), linha (segundo argumento), com um título (terceiro argumento), valor (quarto argumento) e unidades (quinto argumento). OintToStr()efloatToStr()funções convertem dados numéricos em strings para exibição.
Projeto Ao Vivo/Demonstração
A demonstração mostra como exibir idade, dias, peso e voltagem em dois LCDs diferentes. Os valores são atualizados dinamicamente no loop.
Capítulos
- [00:00] Introdução e Visão Geral do Projeto
- [01:16] Explicação da fiação
- [02:20] Pinouts da Placa Arduino
- [02:41] Endereçamento I2C
- [04:40] Visão Geral do Código
- [06:16] Scanner I2C
- [07:21] Casas Decimais e Formatação de Números
- [08:00] Função de Configuração
- [08:58] Função de Loop e Exibição de Dados
- [12:01] Função de Exibição Personalizada
- [13:10] Funções de Conversão de String
/*
* Arduino code for use with two or more LCD1602 I2C displays with Arduino
* Custom function to display floats (like 2.45), integers (like 2 or 8), and strings
* very easily
* This Arduino sketch makes it possible to use two displays at the same time.
*
* Watch video instructions for this code: https://youtu.be/L6ekl2ABcuY
* *
* Written by Ahmad Shamshiri for Robojax.com on Saturday, November 17, 2018
* at 20:45 in Ajax, Ontario, Canada
*
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
* This code has been downloaded from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Wire.h> // this is part of arduino
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x3F, 16, 2);// display 1
LiquidCrystal_I2C lcd2(0x26, 16, 2);// display 2
// number settings
const int decimals = 2;// number of decimal places needed to be displayed
const int positions = 5;// total position of numbers including the decimal places
void setup() {
// initialize the LCD
lcd1.begin();//initialize LCD1
lcd2.begin();//initialize LCD2
lcd1.backlight();// turn the backlight ON for the LCD1
lcd2.backlight();// turn the backlight ON for the LCD2
Serial.begin(9600);// initialize serial monitor with 9600 baud
lcd1.print("Robojax Display");
lcd1.setCursor(0,1);
lcd1.print("Display 1");
lcd2.print("Robojax Display");
lcd2.setCursor(0,1);
lcd2.print("Display 2");
Serial.println("Robojax Displays");
Serial.println("2 or More");
delay(3000);// change this line if you want not to wait
lcd1.clear();// clear screen 1
lcd2.clear();// clear screen 2
}
void loop() {
// Robojax.com multiple LCD1602 I2C display
int age = 31;
int days= age * 365;
float weight = 4.84;
float voltage = 22.1;
lcdDisplay(1, 0, "Age: ", intToStr(age), " years"); // print "Age: 31 years" to line 1 of display 1
lcdDisplay(1, 1, "Days: ", intToStr(days), " days");// print "Days: 11351 days" to line 2 of display 1
lcdDisplay(2, 0, "Weight: ", floatToStr(weight), " kg");//print "Weight: 2.84 kg" to line 1 of display 2
lcdDisplay(2, 1, "Voltage: ", floatToStr(voltage), "V");// print "Voltage 22.10V" to line 2 of display 2
Serial.println("Age: ");Serial.print(age); Serial.print(" years");
Serial.println("Days: ");Serial.print(days); Serial.print(" days");
Serial.println("====");
delay(50); // wait for 200 milliseconds
}// loop end
/*
* Written by Ahmad Shamshiri on November 17, 2018 for Robojax.com
* lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
for example to display:
* dis is the display number
* rowNum is the row number (0 or 1)
* titleText is the text (e.g., "Voltage:")
* valueText is the value
* value2Text is the text appended to the valueText (e.g., "A", "V", etc.)
*
* @brief Prints text on the screen on a specific row and character.
* @param tc=text character number, trc=text row number,
* @return the remaining time as an integer (seconds)
*
*/
void lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
{
clearRow(dis,rowNum);
String myStr;
myStr = String(valueText);
int titleTextLength = titleText.length();
// Robojax.com multiple LCD1602 I2C display
if(dis ==1)
{
lcd1.setCursor (0,rowNum); //
lcd1.print(titleText);
lcd1.setCursor (titleTextLength,rowNum); //
lcd1.print(myStr);
lcd1.setCursor (myStr.length()+titleTextLength,rowNum); //
lcd1.print(value2Text);
}
if(dis ==2)
{
lcd2.setCursor (0,rowNum); //
lcd2.print(titleText);
lcd2.setCursor (titleTextLength,rowNum); //
lcd2.print(myStr);
lcd2.setCursor (myStr.length()+titleTextLength,rowNum); //
lcd2.print(value2Text);
}
}
/*
* Written by Ahmad Shamshiri on November 17, 2018 for Robojax.com
* @brief Clears only one row of a specific display.
* @param d, the display number (integer)
* @param r, the row number (integer)
* @return no return value
*/
void clearRow(int d,int r)
{
//
for(int i=0; i<16; i++)
{
if(d ==1)
{
lcd1.setCursor (i,r); //
lcd1.print(" ");
}
if(d ==2)
{
lcd2.setCursor (i,r); //
lcd2.print(" ");
}
}
}//clearRow end
/*
* Written by Ahmad Shamshiri on November 18, 2018 for Robojax.com
* @brief Converts an integer to a string.
* @param a, the integer to convert.
* @return the converted value as a string.
*/
String intToStr(int a)
{
return String(a);
}//intToStr end
/*
* Written by Ahmad Shamshiri on November 18, 2018 for Robojax.com
* @brief Converts a float to a string.
* @param a, the float to convert.
* @return the converted value as a string.
*/
String floatToStr(float a)
{
char buff[6]; // create a buffer of 6 characters
dtostrf(a, positions, decimals, buff );// 5 positions and 2 decimal places
return buff;// return the buffer
}//floatToStr end
Coisas que você pode precisar
-
AmazonasCompre o LCD1602-I2C na Amazonamzn.to
-
eBayCompre LCD1602-I2C no eBayebay.us
-
AliExpressCompre 10 peças de LCD1602-I2C no AliExpress.s.click.aliexpress.com
-
AliExpressCompre LCD1602-I2C no AliExpresss.click.aliexpress.com
Recursos e referências
-
ExternoPágina de documentação do Arduino Wirearduino.cc
Arquivos📁
Arquivo Fritzing
-
Módulo LCD LCD1602-I2C com 4 fios
LCD1602-I2C.fzpz0.01 MB
Outros arquivos
-
Biblioteca LiquidCrystal LCD1602
robojax-LCD1602_LiquidCrystal.zip