Cerca codice

Come utilizzare due o più moduli LCD1602-I2C con Arduino

Come utilizzare due o più moduli LCD1602-I2C con Arduino

Questo progetto dimostra come collegare e controllare due o più display LCD1602 con moduli I2C a un singolo Arduino. Questa configurazione è altamente versatile e apre una serie di possibilità per visualizzare dati su più schermi.

Ecco alcune idee di progetto che utilizzano più LCD:

  • Visualizzazione delle letture dei sensori da diverse posizioni su schermi separati.
  • Creazione di un display informativo multi-schermo per un progetto.
  • Creare un'interfaccia basata su menu con opzioni di navigazione su uno schermo e contenuto su un altro.
  • Estendere l'area di visualizzazione per i progetti che richiedono più di 16x2 caratteri.

Hardware/Componenti

  • Arduino Uno (o altra scheda compatibile)
  • Due o più display LCD1602 con zaini I2C
  • Cavi jumper
  • Potenziometro (per la regolazione del contrasto sugli LCD - solitamente incluso con il backpack I2C)
wiring two LCD1602 or LCD2002 to Arduino
Come utilizzare due o più moduli LCD1602-I2C con Arduino — wiring two LCD1602 or LCD2002 to Arduino
Come utilizzare due o più moduli LCD1602-I2C con Arduino

Guida all'impianto elettrico

(in video at 01:16)

  1. Collega il pin VCC di ciascun LCD I2C al pin 5V dell'Arduino.
  2. Collegare il pin GND di ciascun LCD I2C al pin GND dell'Arduino.
  3. Collega il pin SDA di ciascun LCD I2C al pin SDA dell'Arduino (A4 su Uno).
  4. Collegare il pin SCL di ogni LCD I2C al pin SCL dell'Arduino (A5 su Uno).

Per altre schede Arduino, consulta il diagramma dei pin per i pin SDA e SCL (nel video al 02:20).

Indirizzo:Ogni LCD ha bisogno di un indirizzo I2C unico. Questo viene solitamente impostato utilizzando pad di saldatura sul backpack I2C (nel video al 02:41). Usa il codice dello scanner I2C fornito (nel video al 06:16) per determinare l'indirizzo di ciascun LCD.

Spiegazione del codice

Il codice è progettato per facilitare la visualizzazione di vari tipi di dati (interi, float, stringhe) su più LCD. La funzionalità principale ruota attorno a funzioni personalizzate:


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

Sostituire0x3Fe0x26con gli indirizzi I2C dei tuoi LCD.


lcdDisplay(1, 0, "Age: ", intToStr(age), " years"); // (in video at 09:23)

Questa funzione semplifica la visualizzazione dei dati su un LCD specifico (primo argomento), riga (secondo argomento), con un titolo (terzo argomento), valore (quarto argomento) e unità (quinto argomento). IlintToStr()efloatToStr()le funzioni convertono i dati numerici in stringhe per la visualizzazione.

Progetto dal vivo/Demostrazione

La dimostrazione mostra come visualizzare età, giorni, peso e voltaggio su due diversi LCD. I valori vengono aggiornati dinamicamente nel ciclo.

Capitoli

  • [00:00] Introduzione e panoramica del progetto
  • [01:16] Spiegazione del cablaggio
  • [02:20] Pinout della scheda Arduino
  • [02:41] Indirizzamento I2C
  • [04:40] Panoramica del codice
  • [06:16] Scanner I2C
  • [07:21] Posizioni decimali e formattazione dei numeri
  • [08:00] Funzione di configurazione
  • [08:58] Funzione di loop e visualizzazione dei dati
  • [12:01] Funzione di Visualizzazione Personalizzata
  • [13:10] Funzioni di Conversione delle Stringhe

Immagini

Come utilizzare due o più moduli LCD1602-I2C con Arduino
Come utilizzare due o più moduli LCD1602-I2C con Arduino
Come utilizzare due o più moduli LCD1602-I2C con Arduino
Come utilizzare due o più moduli LCD1602-I2C con Arduino
170-How to use two or more LCD1602 I2C modules with Arduino
Lingua: 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

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

File Fritzing

Altri file