How to Use Two or More LCD1602-I2C Modules with Arduino
This project demonstrates how to connect and control two or more LCD1602 displays with I2C modules to a single Arduino. This setup is highly versatile and opens up a range of possibilities for displaying data across multiple screens.
Here are a few project ideas using multiple LCDs:
- Displaying sensor readings from different locations on separate screens.
- Creating a multi-screen information display for a project.
- Building a menu-driven interface with navigation options on one screen and content on another.
- Extending the display area for projects that require more than 16x2 characters.
Hardware/Components
- Arduino Uno (or other compatible board)
- Two or more LCD1602 displays with I2C backpacks
- Jumper wires
- Potentiometer (for contrast adjustment on the LCDs - usually included with I2C backpack)
Wiring Guide
(in video at 01:16)
- Connect the VCC pin of each I2C LCD to the Arduino's 5V pin.
- Connect the GND pin of each I2C LCD to the Arduino's GND pin.
- Connect the SDA pin of each I2C LCD to the Arduino's SDA pin (A4 on Uno).
- Connect the SCL pin of each I2C LCD to the Arduino's SCL pin (A5 on Uno).
For other Arduino boards, consult the pinout diagram for SDA and SCL pins (in video at 02:20).
Addressing: Each LCD needs a unique I2C address. This is typically set using solder pads on the I2C backpack (in video at 02:41). Use the provided I2C scanner code (in video at 06:16) to determine the address of each LCD.
Code Explanation
The code is designed to make it easy to display various data types (integers, floats, strings) on multiple LCDs. The core functionality revolves around custom functions:
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
Replace 0x3F and 0x26 with the I2C addresses of your LCDs.
lcdDisplay(1, 0, "Age: ", intToStr(age), " years"); // (in video at 09:23)
This function simplifies displaying data on a specific LCD (first argument), row (second argument), with a title (third argument), value (fourth argument), and units (fifth argument). The intToStr() and floatToStr() functions convert numerical data to strings for display.
Live Project/Demonstration
(in video at 09:07) The demonstration shows how to display age, days, weight, and voltage on two different LCDs. The values are updated dynamically in the loop.
Chapters
- [00:00] Introduction and Project Overview
- [01:16] Wiring Explanation
- [02:20] Arduino Board Pinouts
- [02:41] I2C Addressing
- [04:40] Code Overview
- [06:16] I2C Scanner
- [07:21] Decimal Places and Number Formatting
- [08:00] Setup Function
- [08:58] Loop Function and Data Display
- [12:01] Custom Display Function
- [13:10] String Conversion Functions
/*
* 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
资源与参考
尚无可用资源。
文件📁
没有可用的文件。