How to use 2 or more LCD1602-I2C modules with Arduino

Project Video
Project Details

This is the Arduino showing you how to connect and and use two more LCD1602-I2C modules to display data.

Custom function "floatToStr()" has been written to make is easy to display float values such as 2.76V or 1.872 kg. Also "lcdDisplay()" makes it easy to print information on any line of the LCD1602-I2C modules.

Project Code

 * Arduino code for use two or more LCD1602 with I2C with Arduino
 *  Custom function to display float (like 2.45), integer (like 2 or 8) and string
 *  very easily 
 * this Arduino sketch makes it possible to use two display at the set time
* Watch video instruction for this code:
* * 
 * Written by Ahmad Shamshiri for 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 download from
    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
    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 .

#include  // this is part of arduino

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.print("Display 1"); 
      lcd2.print("Robojax Display");
      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();// clearn screen 1
  lcd2.clear();// clearn screen 2  

void loop() {
  // 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" t 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");
 delay(50); // wait for 200 milliseconds       
}// loop end

 * Written by Ahmad Shamshiri on Nov 17, 2018 for
 * lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
  for example to display
 * dis is display number
 * rowNum  is row number  (0)
 * title is the text (Voltage:)
 * valueText is the value 
 *  value2Text is the appended to the valueText like (A, V etc)
 * @brief prints text on the screen on specific row and character
 * @param tc=text character number, trc=text row number, 
 * @return the remaining time as integet second

void lcdDisplay(int dis, int rowNum, String titleText, String valueText, String value2Text)
    String myStr;
    myStr = String(valueText);

    int titleTextLength = titleText.length();
   // multiple LCD1602 I2C display
   if(dis ==1)
     lcd1.setCursor (0,rowNum); //
     lcd1.setCursor (titleTextLength,rowNum); //
     lcd1.setCursor (myStr.length()+titleTextLength,rowNum); //
   if(dis ==2)
     lcd2.setCursor (0,rowNum); //
     lcd2.setCursor (titleTextLength,rowNum); //
     lcd2.setCursor (myStr.length()+titleTextLength,rowNum); //

 * Written by Ahmad Shamshiri on Nov 17, 2018 for
 * @brief clears only one row of 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 Nov 18, 2018 for
 * @brief converts integer to string
 * @param a, the integer wanted to convert
 * @return the converted value as string
String intToStr(int a)

  return String(a);
}//intToStr end

 * Written by Ahmad Shamshiri on Nov 18, 2018 for
 * @brief converts float to string
 * @param a, the float wanted to convert
 * @return the converted value as string
String floatToStr(float a)
  char buff[6]; // create a buffer of 6 character
  dtostrf(a, positions, decimals, buff );// 5 positions and 2 decimal places
  return buff;// return the buffer
}//floatToStr end

If you found this Arduino course helpful, please support me so I can continue creating content like this. support me via PayPal