I2C LCD Display Interfacing with Arduino – Complete Beginner to Advanced Guide
Introduction
In embedded systems and Arduino-based projects, displaying data such as sensor values, system status, or user messages is essential. One of the most popular display devices is the 16×2 or 20×4 LCD module. However, traditional LCD interfacing requires multiple Arduino pins, which becomes inefficient in complex projects.
This limitation is solved using an I2C LCD module, which significantly reduces wiring complexity while maintaining full functionality.
In this detailed guide, you will learn:
What is an I2C LCD display?
An I2C LCD display is a standard character LCD (based on the HD44780 controller) combined with an I2C interface module (PCF8574 chip).
This interface converts parallel data into serial communication, allowing the LCD to communicate using only two wires:
- SDA (Serial Data)
- SCL (Serial Clock)
Why Use an I2C LCD?
Compared to traditional LCD:
| Feature | Normal LCD | I2C LCD |
|---|---|---|
| Pins required | 6–12 pins | Only 2 pins |
| Wiring complexity | High | Very low |
| Expandability | Limited | Multiple devices supported |
| Code simplicity | Medium | Easy with libraries |
Using I2C LCD saves Arduino pins and simplifies circuit design.
Understanding I2C Communication Protocol
I2C (Inter-Integrated Circuit) is a two-wire serial communication protocol.
Key Signals
- SCL (Clock Line): Synchronizes data transfer
- SDA (Data Line): Transfers data bits
Important Features
- Master-slave communication
- Each device has a unique address (e.g., 0x27, 0x3F)
- Multiple devices share the same bus
Arduino acts as the master, and the LCD acts as a slave device.
Study more: DHT22 Temperature and Humidity Sensor.
Components Required
To interface an I2C LCD with Arduino, you need the following:
- Arduino UNO / Nano / Mega
- I2C LCD (16×2 or 20×4)
- Jumper wires
- Breadboard (optional)
I2C LCD Pin Configuration
The I2C module has 4 pins:
| Pin | Function |
|---|---|
| VCC | Power supply (5V) |
| GND | Ground |
| SDA | Data line |
| SCL | Clock line |
Circuit Diagram & Wiring
Arduino UNO Connection
Connecting an I2C LCD display to an Arduino is simpler than connecting a standard LCD display. You only need to connect four wires to the Arduino. First, connect the LCD’s VCC pin to the 5V pin on the Arduino, and then connect the LCD’s ground pin to the ground pin on the Arduino. The other two connections are for the SCL and SDA pins. Connect the SCL pin from the LCD to the SCL pin on the Arduino, and the SDA pin from the LCD to the SDA pin on the Arduino.
For the Arduino Uno, the SCL pin is located at A5, while the SDA pin is at A4. Please make the connections accordingly.
| I2C LCD | Arduino UNO |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4/SDA |
| SCL | A5/SCL |
Only 4 wires are required, making it extremely efficient.
Study more: Arduino Interfacing with Visual Basic
How I2C LCD Works Internally
The key component is the PCF8574 I/O expander.
Internal Working:
- Arduino sends data via I2C (SDA & SCL)
- PCF8574 receives serial data
- Converts serial → parallel signals
- Sends signals to LCD controller (HD44780)
- LCD displays characters
This conversion reduces pin usage drastically.
Installing Required Library
In this tutorial, I will use the LiquidCrystal-I2C library to control the display. This library offers many pre-built functions that simplify the process of managing an I2C LCD display.
To simplify coding, use:
- LiquidCrystal_I2C Library
Installation Steps:
- Open Arduino IDE
- Go to Sketch → Include Library → Manage Libraries
- Search:
LiquidCrystal_I2C - Install
Arduino Code Example (Basic)
#include <Wire.h> #include <LiquidCrystal_I2C.h> // Set I2C address (commonly 0x27 or 0x3F) LiquidCrystal_I2C lcd(0x27, 16, 2); void setup() { lcd.init(); // Initialize LCD lcd.backlight(); // Turn on backlight lcd.setCursor(0, 0); lcd.print("Hello World!"); } void loop() { }
Code Explanation (Line-by-Line)
1. Library Inclusion
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
Wire.h→ Handles I2C communicationLiquidCrystal_I2C.h→ Controls LCD
2. LCD Object Initialization
LiquidCrystal_I2C lcd(0x27, 16, 2);
0x27→ I2C address16,2→ LCD size
3. Setup Function
lcd.init();
lcd.backlight();
- Initializes LCD
- Turns ON backlight
4. Display Text
lcd.setCursor(0,0);
lcd.print("Hello World!");
- Set cursor position
- Print text
Finding I2C Address
Sometimes your LCD may not work because of the wrong address. In that case, you have to find out the correct LDC address. For doing so, upload the following code into your Arduino, and then you can see the I2C LCD display address on the serial monitor.
Once you have identified the correct address, you can update your code accordingly to ensure proper communication between your Arduino and the LCD. This will help resolve any issues and allow your display to function as intended.
I2C Scanner Code
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
for (byte i = 1; i < 127; i++)
{
Wire.beginTransmission(i);
if (Wire.endTransmission() == 0)
{
Serial.print("Found: 0x");
Serial.println(i, HEX);
}
}
delay(5000);
}
Common Addresses:
- 0x27
- 0x3F
Advanced Functions
1. Clear Display
lcd.clear();
2. Move Cursor
lcd.setCursor(col, row);
3. Print Numbers
lcd.print(123);
4. Scroll Text
lcd.scrollDisplayLeft();
Study more:
What Is a DS3231 RTC Module?
Custom Characters (Advanced Feature)
Each character is made of a 5×8 pixel grid, allowing custom symbol creation.
Example: Battery icon, arrows, etc.
Advantages of I2C LCD
- Requires only 2 Arduino pins
- Easy wiring and debugging
- Supports multiple devices on same bus
- Reduces circuit complexity
- Ideal for IoT and embedded systems
Disadvantages
- Slightly slower than parallel LCD
- Requires correct I2C address configuration
- Needs library support
Common Problems & Troubleshooting
1. LCD Backlight ON but No Text
- Adjust contrast potentiometer
- Check I2C address
2. No Display
- Check wiring (SDA, SCL)
- Verify library installation
3. Wrong Characters
- Check baud rate / code
- Ensure correct LCD size
Applications of I2C LCD
- Temperature monitoring system
- Smart home display
- Industrial automation systems
- Arduino-based SCADA interface
- IoT dashboards
Pro Tips for Better Performance
- Use pull-up resistors (if needed)
- Keep wires short to avoid noise
- Use multiple I2C devices on same bus
- Always scan I2C address before coding
Conclusion
The I2C LCD display interfacing with Arduino is one of the most efficient and beginner-friendly techniques in embedded systems. By reducing wiring complexity and saving valuable I/O pins, it allows you to build scalable and professional projects.
Whether you are building IoT systems, automation projects, or industrial interfaces, mastering I2C LCD will significantly enhance your project capabilities.
Written by: Md. Mahabub Hasan
Md. Mahabub Hasan is an electrical engineer with experience in industrial automation, SCADA systems, and embedded systems development. He writes technical articles on electrical engineering, automation systems, microcontrollers, and industrial communication protocols. He is the founder of Electrical-Info.net, a website dedicated to providing practical knowledge on electrical and electronic engineering.
.png)




0 Comments