Difference between revisions of "I²C LCD1602"

From Wiki
Jump to: navigation, search
(Resources)
(Download and run the code)
 
(50 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
As we all know, though LCD and some other displays greatly enrich the man-machine interaction, they share a common weakness. When they are connected to a controller, multiple IOs will be occupied of the controller which has no so many outer ports. Also it restricts other functions of the controller. Therefore, LCD1602 with an I2C bus is developed to solve the problem.<br>  
 
As we all know, though LCD and some other displays greatly enrich the man-machine interaction, they share a common weakness. When they are connected to a controller, multiple IOs will be occupied of the controller which has no so many outer ports. Also it restricts other functions of the controller. Therefore, LCD1602 with an I2C bus is developed to solve the problem.<br>  
 
I2C bus is a type of serial bus invented by PHLIPS. It is a high performance serial bus which has bus ruling and high or low speed device synchronization function required by multiple host system. I2C bus has only two bidirectional signal lines, Serial Data Line (SDA) and Serial Clock Line (SCL). The blue potentiometer on the I2C LCD1602 is used to adjust backlight to make it easier to display on the I2C LCD1602. <br>
 
I2C bus is a type of serial bus invented by PHLIPS. It is a high performance serial bus which has bus ruling and high or low speed device synchronization function required by multiple host system. I2C bus has only two bidirectional signal lines, Serial Data Line (SDA) and Serial Clock Line (SCL). The blue potentiometer on the I2C LCD1602 is used to adjust backlight to make it easier to display on the I2C LCD1602. <br>
[[Image:Back.png|800px]]
 
  
=='''Components'''==
+
[[Image:I2c_lcd1602.png]]<br>
- 1 *SunFounder Uno board <br>
+
 
- 1 * I2C LCD1602 module<br>
+
- '''GND''': Ground<br>
- 1 * USB cable<br>
+
- '''VCC''': Voltage supply, 5V.<br>
- Several jump wires<br>
+
- '''SDA''': Serial data line. Connect to VCC through a pullup resistor.<br>
=='''Experimental Principle'''==
+
- '''SCL''': Serial clock line. Connect to VCC through a pullup resistor.<br>
In this experiment, we will let I2C LCD1602 display “SUNFOUNDER" and “hello, world" by programming.<br>
+
 
I²C (Inter-Integrated Circuit), pronounced I-squared-C, is a multi-master, multi-slave, single-ended, serial computer bus invented by Philips Semiconductor (now NXP Semiconductors). It is typically used for attaching lower-speed peripheral ICs to processors and microcontrollers. Alternatively I²C is spelled I2C (pronounced I-two-C) or IIC (pronounced I-I-C).<br>
+
=='''I2C Address'''==
I²C uses only two bidirectional open-drain lines, Serial Data Line (SDA) and Serial Clock Line (SCL), pulled up with resistors. Typical voltages used are +5 V or +3.3 V although systems I²C (Inter-Integrated Circuit), pronounced I-squared-C, is a multi-master, multi-slave, single-ended, serial computer bus invented by Philips Semiconductor (now NXP Semiconductors). It is typically used for attaching lower-speed peripheral ICs to processors and microcontrollers. Alternatively I²C is spelled I2C (pronounced I-two-C) or IIC (pronounced I-I-C).<br>
+
 
I²C uses only two bidirectional open-drain lines, Serial Data Line (SDA) and Serial Clock Line (SCL), pulled up with resistors. Typical voltages used are +5 V or +3.3 V although systems with other voltages are permitted.<br>
+
The default address is basically 0x27, in a few cases it may be 0x3F.
For more information about I2C operation principle, please visit [https://en.wikipedia.org/wiki/I²C I²C].<br>
+
 
 +
Taking the default address of 0x27 as an example, the device address can be modified by shorting the A0/A1/A2 pads; in the default state, A0/A1/A2 is 1, and if the pad is shorted, A0/A1/A2 is 0.
 +
 
 +
[[Image:I2c address.jpg|600px]]<br>
 +
 
 +
 
 +
=='''Backlight/Contrast'''==
 +
 
 +
Backlight can be enabled by jumper cap, unplug the jumper cap to disable the backlight. The blue potentiometer on the back is used to adjust the contrast (the ratio of brightness between the brightest white and the darkest black).
 +
 
 +
[[Image:Back lcd1602.jpg|600px]]<br>
 +
 
 +
 
 +
- '''Shorting Cap''': Backlight can be enabled by this cap,unplug this cap to disable the backlight.<br>
 +
- '''Potentiometer''': It is used to adjust the contrast (the clarity of the displayed text), which is increased in the clockwise direction and decreased in the counterclockwise direction.<br>
 +
 
 +
=='''For Arduino User'''==
 +
 
 +
==='''<font color="orange">Build the circuit</font>'''===
  
=='''Experimental Procedures'''==
 
===Step 1: Connect the circuit===
 
 
See the following table for connection between the I2C LCD1602 and the SunFounder Uno board:<br>  
 
See the following table for connection between the I2C LCD1602 and the SunFounder Uno board:<br>  
<center>
+
 
 
{| border="1" class="wikitable"
 
{| border="1" class="wikitable"
 
|-
 
|-
 
! scope="col" | I2C LCD1602
 
! scope="col" | I2C LCD1602
! scope="col" | SunFounder Uno board
+
! scope="col" | Arduino Board
  
 
|-
 
|-
Line 38: Line 53:
 
|align="center"|A5 /pin 21 mega2560
 
|align="center"|A5 /pin 21 mega2560
 
|}
 
|}
</center>
 
[[File:Experiment.png|800px|center]]
 
  
===Step 2:Add library===
+
[[File:Experiment.png|1000px]]
 +
 
 +
==='''<font color="orange">Add Library</font>'''===
 +
 
 
Before you upload the code to the control board,you neeed to add the LiquidCrystal_I2C library.<br>
 
Before you upload the code to the control board,you neeed to add the LiquidCrystal_I2C library.<br>
1) Download the '''LiquidCrystal_I2C library.zip'''<br>
+
1) Download the [http://wiki.sunfounder.cc/images/7/7e/LiquidCrystal_I2C.zip '''LiquidCrystal_I2C library''']<br>
 
<br>  
 
<br>  
 
2) Open the Arduino IDE,Select Sketch -> Include Library -> Add ZIP Library<br>
 
2) Open the Arduino IDE,Select Sketch -> Include Library -> Add ZIP Library<br>
Line 51: Line 67:
 
3) Find the file LiquidCrystal_I2C which you just download. Click it open and then you'll be prompted by "Library added to your libraries. Check 'Import libraries'”. You also can see the libraries just imported have appeared on the list by Sketch->Include Library->LiquidCrystal_I2C.<br>  
 
3) Find the file LiquidCrystal_I2C which you just download. Click it open and then you'll be prompted by "Library added to your libraries. Check 'Import libraries'”. You also can see the libraries just imported have appeared on the list by Sketch->Include Library->LiquidCrystal_I2C.<br>  
 
[[File:Fdfds.png]] <br>  
 
[[File:Fdfds.png]] <br>  
<br>  
+
<br>
+
 
===Step 3: Copy the code ===
+
==='''<font color="orange">Copy and Upload the code</font>'''===
Copy the follwing code to the Arduino IDE ,click to the upload icon to upload the code to the control board<br>
+
 
 +
Copy the following code to the Arduino IDE, click to the upload icon to upload the code to the control board<br>
 
<pre>
 
<pre>
 
/********************************
 
/********************************
* name:I2C LCD1602
+
  name:I2C LCD1602
* function:You should now see your I2C LCD1602 display the flowing characters: "SunFounder" and "hello, world".
+
  function:You should now see your I2C LCD1602 display the flowing characters: "SunFounder" and "hello, world".
 
  ********************************/
 
  ********************************/
 
//Email:support@sunfounder.com
 
//Email:support@sunfounder.com
Line 65: Line 82:
 
/********************************/
 
/********************************/
 
// include the library code
 
// include the library code
#include <Wire.h>  
+
#include <Wire.h>
 
#include <LiquidCrystal_I2C.h>
 
#include <LiquidCrystal_I2C.h>
 
/**********************************************************/
 
/**********************************************************/
char array1[]=" SunFounder              ";  //the string to print on the LCD
+
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
char array2[]="hello, world!            ";  //the string to print on the LCD
+
int tim = 500;  //the value of delay time
+
// initialize the library with the numbers of the interface pins
+
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
+
 
/*********************************************************/
 
/*********************************************************/
 
void setup()
 
void setup()
 
{
 
{
 
   lcd.init();  //initialize the lcd
 
   lcd.init();  //initialize the lcd
   lcd.backlight();  //open the backlight  
+
   lcd.backlight();  //open the backlight
 
}
 
}
 
/*********************************************************/
 
/*********************************************************/
void loop()  
+
void loop()
 
{
 
{
   lcd.setCursor(15,0); // set the cursor to column 15, line 0
+
   lcd.setCursor(3, 0); // set the cursor to column 3, line 0
   for (int positionCounter1 = 0; positionCounter1 < 26; positionCounter1++)
+
   lcd.print("SunFounder");  // Print a message to the LCD
  {
+
    
    lcd.scrollDisplayLeft();  //Scrolls the contents of the display one space to the left.
+
   lcd.setCursor(2, 1); // set the cursor to column 2, line 1
    lcd.print(array1[positionCounter1]);  // Print a message to the LCD.
+
   lcd.print("Hello, World!");  // Print a message to the LCD.
    delay(tim);  //wait for 250 microseconds
+
   }
+
  lcd.clear();  //Clears the LCD screen and positions the cursor in the upper-left corner.
+
   lcd.setCursor(15,1); // set the cursor to column 15, line 1
+
   for (int positionCounter = 0; positionCounter < 26; positionCounter++)
+
  {
+
    lcd.scrollDisplayLeft();  //Scrolls the contents of the display one space to the left.
+
    lcd.print(array2[positionCounter]);  // Print a message to the LCD.
+
    delay(tim);  //wait for 250 microseconds
+
  }
+
  lcd.clear();  //Clears the LCD screen and positions the cursor in the upper-left corner.
+
 
}
 
}
 
/************************************************************/
 
/************************************************************/
 
</pre>
 
</pre>
  
=='''experimental phenomenon'''==  
+
==='''<font color="orange">Experimental Phenomenon</font>'''===
You should now see your I2C LCD1602 display the flowing characters "SunFounder" and "hello, world".<br>
+
 
[[File:I2c_lcd102_1.png|800px|center]]
+
 
 +
You should now see your I2C LCD1602 display the "SunFounder" and "hello, world".<br>
 +
[[File:I2c_lcd102_1.png|1000px]]
 +
 
 +
==='''<font color="orange">Read I2C Address</font>'''===
 +
 
 +
If the display is functioning properly but only shows 16 black rectangles on the line, it's likely that the I2C address is not set to 0x27. In this case, you should run the following code to determine the correct address and then replace '0x27' with the address you find.
  
=='''Note'''==
 
If everything is correct,But the display just shows 16 black rectangles on Line 1.it may be the address of i2c is not 0x27,therfore you need to run the following code to read the address,then modify the 0x27 to which you read.
 
 
<pre>
 
<pre>
 
LiquidCrystal_I2C lcd(0x27,16,2);
 
LiquidCrystal_I2C lcd(0x27,16,2);
Line 113: Line 119:
 
<pre>
 
<pre>
 
/*****************************************************
 
/*****************************************************
  * name:I2C_Address
+
  * Name: I2C_Address
  * function:read the address of the I2C lcd1602
+
  * Function: Read the address of the I2C LCD1602
 
  * Connection:
 
  * Connection:
  * I2C                UNO  
+
  * I2C                Arduino UNO  
 
  * GND                GND
 
  * GND                GND
  * VCC                 5V
+
  * VCC                 5V
  * SDA                 A4(pin20 in mega2560)
+
  * SDA                 A4 (pin 20 in Mega2560)
  * SCL                 A5(pin21 in mega2560)
+
  * SCL                 A5 (pin 21 in Mega2560)
 
  ********************************************************/
 
  ********************************************************/
  
#include <Wire.h>
+
#include <Wire.h> // Include Wire library for I2C communication
  
void setup()
+
void setup() {
{
+
   Wire.begin();                     // Initialize I2C communication
   Wire.begin();
+
   Serial.begin(9600);               // Start serial communication at 9600 baud rate
   Serial.begin(9600);
+
   Serial.println("\nI2C Scanner"); // Print a message to the serial monitor
   Serial.println("\nI2C Scanner");
+
 
}
 
}
void loop()
+
 
{
+
void loop() {
   byte error, address;
+
   byte error, address; // Declare variables for storing error status and I2C address
   int nDevices;
+
   int nDevices;         // Variable to keep track of number of devices found
   Serial.println("Scanning...");
+
 
   nDevices = 0;
+
   Serial.println("Scanning..."); // Print scanning message
   for(address = 1; address < 127; address++ )
+
   nDevices = 0;                   // Initialize the device count to 0
  {
+
 
     // The i2c_scanner uses the return value of
+
  // Loop through all possible I2C addresses (1 to 126)
    // the Write.endTransmisstion to see if
+
   for (address = 1; address < 127; address++) {
    // a device did acknowledge to the address.
+
     Wire.beginTransmission(address);  // Start a transmission to the I2C address
     Wire.beginTransmission(address);
+
     error = Wire.endTransmission();   // End the transmission and get the status
     error = Wire.endTransmission();
+
 
     if (error == 0)
+
     // Check if device responded without error (acknowledged)
    {
+
     if (error == 0) {
       Serial.print("I2C device found at address 0x");
+
       Serial.print("I2C device found at address 0x"); // Notify device found
       if (address<16)
+
       if (address < 16) Serial.print("0");             // Print leading zero for addresses less than 16
        Serial.print("0");
+
       Serial.print(address, HEX);                     // Print the address in hexadecimal
       Serial.print(address,HEX);
+
       Serial.println(" !");
       Serial.println(" !");
+
       nDevices++;                                   // Increment the device count
       nDevices++;
+
     } else if (error == 4) {                       // If there was an unknown error
     }
+
       Serial.print("Unknown error at address 0x"); // Notify about the error
    else if (error==4)
+
       if (address < 16) Serial.print("0");         // Print leading zero for addresses less than 16
    {
+
       Serial.println(address, HEX);                 // Print the address in hexadecimal
       Serial.print("Unknow error at address 0x");
+
       if (address<16)
+
        Serial.print("0");
+
       Serial.println(address,HEX);
+
 
     }
 
     }
 
   }
 
   }
 +
 +
  // After scanning, print the results
 
   if (nDevices == 0)
 
   if (nDevices == 0)
     Serial.println("No I2C devices found\n");
+
     Serial.println("No I2C devices found\n"); // No devices found
 
   else
 
   else
     Serial.println("done\n");
+
     Serial.println("done\n"); // Scanning done
   delay(5000); // wait 5 seconds for next scan
+
 
 +
   delay(5000); // Wait 5 seconds before the next scan
 
}
 
}
 +
 
</pre>
 
</pre>
=='''Resources'''==
+
 
[http://www.sunfounder.com/wiki/index.php/File:PCF8574T_datasheet.pdf PCF8574T_datasheet][[File:PDF.jpg]]<br>
+
=='''For Raspberry Pi User'''==
[https://www.sunfounder.com/learn/sensor-kit-v2-0-for-raspberry-pi-b-plus/lesson-30-i2c-lcd1602-sensor-kit-v2-0-for-b-plus.html Test_Experiment_for_Raspberry_Pi][[File:LINK.jpg]]<br>
+
 
[http://www.sunfounder.com/wiki/index.php?title=File:LiquidCrystal_I2C.zip LiquidCrystal_I2C library][[File:ZIP.jpg]]
+
==='''<font color="orange">Build the circuit</font>'''===
 +
 
 +
[[Image:Raspberry i2c lcd2602.png|800px]]<br>
 +
 
 +
==='''<font color="orange">Setup I2C</font>'''===
 +
 
 +
 
 +
Enable the I2C port of your Raspberry Pi (If you have
 +
enabled it, skip this; if you do not know whether you have done that or
 +
not, please continue).<br>
 +
 
 +
'''Step 1''': Run the following command.<br>
 +
<pre>
 +
sudo raspi-config
 +
</pre>
 +
 
 +
'''Step 2''': 3 Interfacing options.<br>
 +
 
 +
 
 +
[[Image:Image282.png]]<br>
 +
 
 +
'''Step 3''': P5 I2C.<br>
 +
 
 +
[[Image:Image283.png]]<br>
 +
 
 +
'''Step 4''': <Yes>, then <Ok> -> <Finish>.<br>
 +
 
 +
[[Image:Image284.png]]<br>
 +
 
 +
'''Step 5''': Check whether the i2c modules are loaded and active.<br>
 +
<pre>
 +
lsmod | grep i2c
 +
</pre>
 +
 
 +
'''Step 6''': Then the following codes will appear (the number may be different).<br>
 +
<pre>
 +
i2c_dev                    6276    0
 +
i2c_bcm2708                4121    0
 +
</pre>
 +
 
 +
'''Step 7''': Install i2c-tools.<br>
 +
<pre>
 +
sudo apt-get install i2c-tools
 +
</pre>
 +
 
 +
'''Step 8''': Check the address of the I2C device.<br>
 +
<pre>
 +
i2cdetect -y 1      # For Raspberry Pi 2 and higher version
 +
</pre>
 +
 
 +
<pre>
 +
i2cdetect -y 0      # For Raspberry Pi 1
 +
</pre>
 +
 
 +
<pre>
 +
    pi@raspberrypi ~ $ i2cdetect -y 1
 +
        0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
 +
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
 +
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 +
    70: -- -- -- -- -- -- -- --
 +
</pre>
 +
 
 +
If there is an I2C device connected, the address of the device will be displayed.<br>
 +
 
 +
'''Step 9''': Install libi2c-dev or smbus.<br>
 +
 
 +
'''<font color="green">For C language users</font>'''<br>
 +
<pre>
 +
sudo apt-get install libi2c-dev
 +
</pre>
 +
 
 +
'''<font color="green">For Python users</font>'''<br>
 +
<pre>
 +
sudo pip3 install smbus2
 +
</pre>
 +
 
 +
==='''<font color="orange">Download and run the code</font>'''===
 +
 
 +
'''Step 1''': Download the [http://wiki.sunfounder.cc/images/2/2e/I2c_lcd1602_for_raspberry_pi.zip code] package.<br>
 +
 
 +
<pre>
 +
wget http://wiki.sunfounder.cc/images/2/2e/I2c_lcd1602_for_raspberry_pi.zip
 +
</pre>
 +
 
 +
'''Step 2''': Extract the package<br>
 +
 
 +
<pre>
 +
unzip I2c_lcd1602_for_raspberry_pi.zip
 +
</pre>
 +
 
 +
'''<font color="green">(For C Language Users)</font>'''<br>
 +
 
 +
'''Step 3''': If you have not installed wiringPi, then you will need to install it first.<br>
 +
 
 +
<pre>
 +
sudo apt-get update
 +
git clone https://github.com/WiringPi/WiringPi
 +
cd WiringPi
 +
./build
 +
</pre>
 +
 
 +
'''Step 4''': You can test whether the wiringPi library is installed successfully or not by the following instruction.<br>
 +
 
 +
<pre>
 +
gpio -v
 +
</pre>
 +
 
 +
'''Step 5''': Get into the folder of code.<br>
 +
<pre>
 +
cd ~/I2c_lcd1602_for_raspberry_pi/c
 +
</pre>
 +
 
 +
'''Step 6''': Compile.<br>
 +
<pre>
 +
gcc lcd1602.c -o lcd1602 -lwiringPiDev -lwiringPi
 +
</pre>
 +
 
 +
'''Step 7''': Run.<br>
 +
<pre>
 +
sudo ./lcd1602
 +
</pre>
 +
 
 +
'''<font color="green">(For Python Users)</font>'''<br>
 +
'''Step 3''': Get into the folder of code.<br>
 +
<pre>
 +
cd ~/I2c_lcd1602_for_raspberry_pi/python
 +
</pre>
 +
 
 +
'''Step 4''': Run.<br> 
 +
<pre>
 +
sudo python lcd1602_show.py
 +
</pre>
 +
 
 +
=='''Resources'''===
 +
 
 +
[http://wiki.sunfounder.cc/images/1/18/PCF8574T_datasheet.pdf PCF8574T_datasheet][[File:PDF.jpg]]<br>
 +
[http://wiki.sunfounder.cc/images/7/7e/LiquidCrystal_I2C.zip LiquidCrystal_I2C library][[File:ZIP.jpg]]
 +
 
 +
[http://wiki.sunfounder.cc/images/2/2e/I2c_lcd1602_for_raspberry_pi.zip I2C LCD1602 for Raspberry Pi][[File:ZIP.jpg]]

Latest revision as of 02:33, 15 November 2023

Introduction

As we all know, though LCD and some other displays greatly enrich the man-machine interaction, they share a common weakness. When they are connected to a controller, multiple IOs will be occupied of the controller which has no so many outer ports. Also it restricts other functions of the controller. Therefore, LCD1602 with an I2C bus is developed to solve the problem.
I2C bus is a type of serial bus invented by PHLIPS. It is a high performance serial bus which has bus ruling and high or low speed device synchronization function required by multiple host system. I2C bus has only two bidirectional signal lines, Serial Data Line (SDA) and Serial Clock Line (SCL). The blue potentiometer on the I2C LCD1602 is used to adjust backlight to make it easier to display on the I2C LCD1602.

I2c lcd1602.png

- GND: Ground
- VCC: Voltage supply, 5V.
- SDA: Serial data line. Connect to VCC through a pullup resistor.
- SCL: Serial clock line. Connect to VCC through a pullup resistor.

I2C Address

The default address is basically 0x27, in a few cases it may be 0x3F.

Taking the default address of 0x27 as an example, the device address can be modified by shorting the A0/A1/A2 pads; in the default state, A0/A1/A2 is 1, and if the pad is shorted, A0/A1/A2 is 0.

I2c address.jpg


Backlight/Contrast

Backlight can be enabled by jumper cap, unplug the jumper cap to disable the backlight. The blue potentiometer on the back is used to adjust the contrast (the ratio of brightness between the brightest white and the darkest black).

Back lcd1602.jpg


- Shorting Cap: Backlight can be enabled by this cap,unplug this cap to disable the backlight.
- Potentiometer: It is used to adjust the contrast (the clarity of the displayed text), which is increased in the clockwise direction and decreased in the counterclockwise direction.

For Arduino User

Build the circuit

See the following table for connection between the I2C LCD1602 and the SunFounder Uno board:

I2C LCD1602 Arduino Board
GND GND
VCC 5V
SDA A4 /pin 20 mega2560
SCL A5 /pin 21 mega2560

Experiment.png

Add Library

Before you upload the code to the control board,you neeed to add the LiquidCrystal_I2C library.
1) Download the LiquidCrystal_I2C library

2) Open the Arduino IDE,Select Sketch -> Include Library -> Add ZIP Library

Rfd.png

3) Find the file LiquidCrystal_I2C which you just download. Click it open and then you'll be prompted by "Library added to your libraries. Check 'Import libraries'”. You also can see the libraries just imported have appeared on the list by Sketch->Include Library->LiquidCrystal_I2C.
Fdfds.png

Copy and Upload the code

Copy the following code to the Arduino IDE, click to the upload icon to upload the code to the control board

/********************************
   name:I2C LCD1602
   function:You should now see your I2C LCD1602 display the flowing characters: "SunFounder" and "hello, world".
 ********************************/
//Email:support@sunfounder.com
//Website:www.sunfounder.com

/********************************/
// include the library code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/**********************************************************/
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
/*********************************************************/
void setup()
{
  lcd.init();  //initialize the lcd
  lcd.backlight();  //open the backlight
}
/*********************************************************/
void loop()
{
  lcd.setCursor(3, 0); // set the cursor to column 3, line 0
  lcd.print("SunFounder");  // Print a message to the LCD
  
  lcd.setCursor(2, 1); // set the cursor to column 2, line 1
  lcd.print("Hello, World!");  // Print a message to the LCD.
}
/************************************************************/

Experimental Phenomenon

You should now see your I2C LCD1602 display the "SunFounder" and "hello, world".
I2c lcd102 1.png

Read I2C Address

If the display is functioning properly but only shows 16 black rectangles on the line, it's likely that the I2C address is not set to 0x27. In this case, you should run the following code to determine the correct address and then replace '0x27' with the address you find.

LiquidCrystal_I2C lcd(0x27,16,2);
/*****************************************************
 * Name: I2C_Address
 * Function: Read the address of the I2C LCD1602
 * Connection:
 * I2C                 Arduino UNO 
 * GND                 GND
 * VCC                 5V
 * SDA                 A4 (pin 20 in Mega2560)
 * SCL                 A5 (pin 21 in Mega2560)
 ********************************************************/

#include <Wire.h>  // Include Wire library for I2C communication

void setup() {
  Wire.begin();                     // Initialize I2C communication
  Serial.begin(9600);               // Start serial communication at 9600 baud rate
  Serial.println("\nI2C Scanner");  // Print a message to the serial monitor
}

void loop() {
  byte error, address;  // Declare variables for storing error status and I2C address
  int nDevices;         // Variable to keep track of number of devices found

  Serial.println("Scanning...");  // Print scanning message
  nDevices = 0;                   // Initialize the device count to 0

  // Loop through all possible I2C addresses (1 to 126)
  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);  // Start a transmission to the I2C address
    error = Wire.endTransmission();   // End the transmission and get the status

    // Check if device responded without error (acknowledged)
    if (error == 0) {
      Serial.print("I2C device found at address 0x");  // Notify device found
      if (address < 16) Serial.print("0");             // Print leading zero for addresses less than 16
      Serial.print(address, HEX);                      // Print the address in hexadecimal
      Serial.println(" !");
      nDevices++;                                   // Increment the device count
    } else if (error == 4) {                        // If there was an unknown error
      Serial.print("Unknown error at address 0x");  // Notify about the error
      if (address < 16) Serial.print("0");          // Print leading zero for addresses less than 16
      Serial.println(address, HEX);                 // Print the address in hexadecimal
    }
  }

  // After scanning, print the results
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");  // No devices found
  else
    Serial.println("done\n");  // Scanning done

  delay(5000);  // Wait 5 seconds before the next scan
}

For Raspberry Pi User

Build the circuit

Raspberry i2c lcd2602.png

Setup I2C

Enable the I2C port of your Raspberry Pi (If you have enabled it, skip this; if you do not know whether you have done that or not, please continue).

Step 1: Run the following command.

sudo raspi-config

Step 2: 3 Interfacing options.


Image282.png

Step 3: P5 I2C.

Image283.png

Step 4: <Yes>, then <Ok> -> <Finish>.

Image284.png

Step 5: Check whether the i2c modules are loaded and active.

lsmod | grep i2c

Step 6: Then the following codes will appear (the number may be different).

i2c_dev                     6276    0
i2c_bcm2708                 4121    0

Step 7: Install i2c-tools.

sudo apt-get install i2c-tools

Step 8: Check the address of the I2C device.

i2cdetect -y 1      # For Raspberry Pi 2 and higher version
i2cdetect -y 0      # For Raspberry Pi 1
    pi@raspberrypi ~ $ i2cdetect -y 1
        0  1  2  3   4  5  6  7  8  9   a  b  c  d  e  f
    00:           -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --

If there is an I2C device connected, the address of the device will be displayed.

Step 9: Install libi2c-dev or smbus.

For C language users

sudo apt-get install libi2c-dev 

For Python users

sudo pip3 install smbus2

Download and run the code

Step 1: Download the code package.

wget http://wiki.sunfounder.cc/images/2/2e/I2c_lcd1602_for_raspberry_pi.zip

Step 2: Extract the package

unzip I2c_lcd1602_for_raspberry_pi.zip

(For C Language Users)

Step 3: If you have not installed wiringPi, then you will need to install it first.

sudo apt-get update
git clone https://github.com/WiringPi/WiringPi
cd WiringPi 
./build

Step 4: You can test whether the wiringPi library is installed successfully or not by the following instruction.

gpio -v

Step 5: Get into the folder of code.

cd ~/I2c_lcd1602_for_raspberry_pi/c

Step 6: Compile.

gcc lcd1602.c -o lcd1602 -lwiringPiDev -lwiringPi

Step 7: Run.

sudo ./lcd1602

(For Python Users)
Step 3: Get into the folder of code.

cd ~/I2c_lcd1602_for_raspberry_pi/python

Step 4: Run.

sudo python lcd1602_show.py

Resources=

PCF8574T_datasheetPDF.jpg
LiquidCrystal_I2C libraryZIP.jpg

I2C LCD1602 for Raspberry PiZIP.jpg