Código de Pesquisa

Como Usar Dois ou Mais Módulos LCD1602-I2C com Arduino

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)
wiring two LCD1602 or LCD2002 to Arduino
Como usar dois ou mais módulos LCD1602-I2C com Arduino — wiring two LCD1602 or LCD2002 to Arduino
Como usar dois ou mais módulos LCD1602-I2C com Arduino

Guia de Fiação

(in video at 01:16)

  1. Conecte o pino VCC de cada LCD I2C ao pino de 5V do Arduino.
  2. Conecte o pino GND de cada LCD I2C ao pino GND do Arduino.
  3. Conecte o pino SDA de cada LCD I2C ao pino SDA do Arduino (A4 no Uno).
  4. 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

Imagens

Como usar dois ou mais módulos LCD1602-I2C com Arduino
Como usar dois ou mais módulos LCD1602-I2C com Arduino
Como usar dois ou mais módulos LCD1602-I2C com Arduino
Como usar dois ou mais módulos LCD1602-I2C com Arduino
170-How to use two or more LCD1602 I2C modules with Arduino
Idioma: C++
/*
 * 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

Recursos e referências

Arquivos📁

Arquivo Fritzing

Outros arquivos