Code de recherche

Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino

Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino

Ce projet démontre comment connecter et contrôler deux écrans LCD1602 ou plus avec des modules I2C à un seul Arduino. Ce système est très polyvalent et ouvre une gamme de possibilités pour afficher des données sur plusieurs écrans.

Voici quelques idées de projets utilisant plusieurs écrans LCD :

  • Affichage des relevés de capteurs provenant de différents emplacements sur des écrans séparés.
  • Création d'un affichage d'informations multi-écrans pour un projet.
  • Créer une interface pilotée par un menu avec des options de navigation sur un écran et du contenu sur un autre.
  • Étendre la zone d'affichage pour les projets nécessitant plus de 16x2 caractères.

Matériel/Composants

  • Arduino Uno (ou autre carte compatible)
  • Deux écrans LCD1602 ou plus avec des modules I2C.
  • Fils de connexion
  • Potentiomètre (pour le réglage du contraste sur les LCD - généralement inclus avec le module I2C)
wiring two LCD1602 or LCD2002 to Arduino
Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino — wiring two LCD1602 or LCD2002 to Arduino
Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino

Guide de câblage

(in video à 01:16)

  1. Connectez la broche VCC de chaque écran LCD I2C à la broche 5V de l'Arduino.
  2. Connectez la broche GND de chaque écran LCD I2C à la broche GND de l'Arduino.
  3. Connectez la broche SDA de chaque LCD I2C à la broche SDA de l'Arduino (A4 sur Uno).
  4. Connectez la broche SCL de chaque LCD I2C à la broche SCL de l'Arduino (A5 sur Uno).

Pour les autres cartes Arduino, consultez le diagramme de brochage pour les broches SDA et SCL (dans la vidéo à 02:20).

Adresse :Chaque écran LCD nécessite une adresse I2C unique. Cela est généralement configuré à l'aide de pistes de soudure sur le backpack I2C (dans la vidéo à 02:41). Utilisez le code de scanner I2C fourni (dans la vidéo à 06:16) pour déterminer l'adresse de chaque écran LCD.

Explication du code

Le code est conçu pour faciliter l'affichage de divers types de données (entiers, flottants, chaînes) sur plusieurs LCD. La fonctionnalité principale tourne autour de fonctions personnalisées :


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

Remplacer0x3Fet0x26avec les adresses I2C de vos écrans LCD.


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

Cette fonction simplifie l'affichage des données sur un LCD spécifique (premier argument), une ligne (deuxième argument), avec un titre (troisième argument), une valeur (quatrième argument) et des unités (cinquième argument). LeintToStr()etfloatToStr()les fonctions convertissent des données numériques en chaînes pour l'affichage.

Projet en direct/Démonstration

La démonstration montre comment afficher l'âge, les jours, le poids et la tension sur deux LCD différents. Les valeurs sont mises à jour dynamiquement dans la boucle.

Chapitres

  • [00:00] Introduction et présentation du projet
  • [01:16] Explication du câblage
  • [02:20] Brochage des broches de la carte Arduino
  • [02:41] Addressage I2C
  • [04:40] Aperçu du Code
  • [06:16] Scanner I2C
  • [07:21] Décimales et formatage des nombres
  • [08:00] Configuration de la fonction
  • Fonction de boucle et affichage des données
  • [12:01] Fonction d'affichage personnalisée
  • [13:10] Fonctions de conversion de chaînes

Images

Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino
Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino
Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino
Comment utiliser deux modules LCD1602-I2C ou plus avec Arduino
170-How to use two or more LCD1602 I2C modules with Arduino
Langue: 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

Ce dont vous pourriez avoir besoin

Ressources et références

Fichiers📁

Fichier Fritzing

Autres fichiers