You might have experienced some issue when connecting a LCD display to Arduino with nearly 16 pins. Some times it is hard to put an LCD at a distance from Arduino due to the bulky wires. So in this case its better to use an adapter which is made to simplify this process, by interfacing this adapter with only 2 wires we can control the LCD display with Arduino. This I2C adapter has some special inbuilt controls to change the contrast and backlight of the LCD display module.
This tutorial is similar to the LCD Tutorial, connecting your Arduino to an LCD1602 and LCD2004 , with the slight difference that we will now use an LCD to I2C adapter module. We will work with few examples that demonstrate using the adapter module is as simple as if we were working directly with the LCD.
Table of Contents
LCD to I2C Adapter Module Hardware
The LCD to I2C adapter module that we will use is based on the I2C PCF8574 controller, which is an I2C-controlled digital Input and Output Expander. Due to the PCB design, this module is specially used to control an Alphanumeric LCD.
The default I2C address of the module can be 0x3F or in other cases 0x27. It is very important to correctly identify the I2C address of our module, otherwise our program will not work correctly. To identify the specific address of our module we can use a small test sketch called: I2C Scanner, which allows us to identify the I2C address of the device connected to the Arduino. If there is a need to work with more than one LCD, we can modify the I2C address of the adapter module. For this it is necessary to solder the jumpers A0, A1 and A2 present in the module, these three jumpers are the least significant bits of the I2C address of the module. The address 0x3F in binary would be: 0 | 0 | 1 | 1 | 1 | A2 | A1 | A0 and the address 0x27: 0 | 0 | 1 | 0 | 0 | A2 | A1 | A0. By default A0, A2, A1 are worth 1 but if we solder the bridges, they are connected to ground having a value of 0. For example if we solder the three bridges the new address would be 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 (0x20), for a chip that was previously 0x27.

To control the contrast of the digits on the LCD we only need to turn the potentiometer on the module, until we are satisfied with the contrast shown.
The backlight is mainly controlled by software from the Arduino, but the module also allows you to disconnect the Led from the backlight by removing an LED jumper.
Interfacing Arduino and LCD to I2C adapter module
The LCD to I2C adapter has the pins arranged to connect directly to the LCD, this can be done through a breadboard or by soldering directly to the LCD.
To connect to the module with the Arduino we only use the I2C pins of the Arduino (SDA and SCL) and power (GND and 5V), the I2C pins vary according to the Arduino model with which we work, in the following table we can see which They are the I2C pins for each Arduino model.
LCD to I2C adapter | Arduino Uno, Nano, Mini. | Arduino Mega, DUE | Arduino Leonardo |
---|---|---|---|
GND | GND | GND | GND |
VCC | 5V | 5V | 5V |
SDA | A4 | 20 | 2 |
SCL | A5 | 21 | 3 |
* You can connect 20 x 4 LCD in the same way as shown in the above circuit diagram. As the I2C adapter used is same.
LiquidCrystal_I2C library for Arduino
There are different types and versions of libraries to work with the LCD to I2C Adapter module, more complete information can be found at: http://playground.arduino.cc/Code/LCDi2c ,
we will use the LiquidCrystal_I2C library. Download here.
The functions this library uses are similar to the Arduino LiquidCrystal library , Lets see what are the available functions and what they perform:
LiquidCrystal_I2C (lcd_Addr, lcd_cols, lcd_rows)
Constructor function, creates an object of class LiquidCrystal_I2C, with indicated address, columns and rows.
init ()
Initialize the LCD to I2C adapter module, this function internally configures and initializes the I2C and LCD.
clear ()
Clear the LCD screen and position the cursor in the upper left corner (position (0,0)).
setCursor (col, row)
Position the LCD cursor at the position indicated by col and row (x, y); that is, set the location where text written for the LCD will be displayed later.
print ()
Write a text or message on the LCD, its use is similar to a Serial.print
scrollDisplayLeft ()
Scrolls the screen content (text and cursor) one space to the left.
scrollDisplayRight ()
The screen content (text and cursor) is moved one space to the right.
backlight ();
Turn on the LCD Backlight
noBacklight ();
Turn off the LCD Backlight
createChar (num, data)
Create a custom character for use on the LCD screen. Up to eight 5×8 pixel characters (numbered 0-7) are supported. Where: num is the character number and data is an array containing the pixels of the character. An example of this will be seen later.
As we learnt about the functions lets see them perform tasks in live examples below
Example 1: Display simple text on LCD module using Arduino
In this example we just show a simple text on the display module. Just copy the code below and upload in the Arduino.
// #include < Wire .h> we are removing this because it is already added in library #include < LiquidCrystal_I2C .h> // Create the lcd object address 0x3F and 16 columns x 2 rows LiquidCrystal_I2C lcd (0x3F, 16,2); // void setup () { // Initialize the LCD connected lcd. init (); // Turn on the backlight on LCD. lcd. backlight (); // print the Message on the LCD. lcd. print ( "CIRCUITSCHOOLS." ); } void loop () { //Here cursor is placed on first position (col: 0) of the second line (row: 1) lcd. setCursor (0, 1); // We write the number of seconds elapsed lcd. print ( millis () / 1000); lcd. print ( "SECONDS" ); delay (100); }
After upload the code your LCD display will display as the image shown below.
Example 2: Text Scrolling on the LCD module
In this example we will use the scrollDisplayLeft () function to move the text from right to left. Copy the code below and upload it on Arduino:
//#include < Wire .h> removed as it is already added in the library #include < LiquidCrystal_I2C .h> // Create the lcd object address 0x3F and 16 columns x 2 rows LiquidCrystal_I2C lcd (0x3F, 16,2); // void setup () { // Initialize the LCD connected lcd. init (); // Turn on the backlight of LCD display. lcd. backlight (); // We write the Message on the LCD in a central position. lcd. setCursor (10, 0); lcd. print ( "HTTPS://WWW.CIRCUITSCHOOLS.COM" ); lcd. setCursor (4, 1); lcd. print ( "THIS IS THE SCROLLING TEST" ); } void loop () { // move one position to the left lcd. scrollDisplayLeft (); delay (500); }
After uploading the code your display module shows as below image.
Example 3: Create custom characters on LED display using arduino
In some cases the LCD does not include by default the characters that we need, or we want to draw custom characters, in this case we use the createChar () function but before we study how a character is constituted:
A character is made up of an array of 5×8 pixels which are represented by 8 bytes, one for each row, the least significant 5 bits represent the pixels of the character:
If you cannot create those binary or hex codes for the your custom characters the simply use the tool LCD Custom Character Generator from this link here.
The code for the this example will be automatically generated in the LCD Custom Character Generator.
If you find this project helpful, please support us by following our Facebook page and share it with your friends. If you have any doubts please comment below. Thanks