This is not your usual LCD.
It's a 1602 16X2 LCD Display IIC/I2C/TWI/SPI Serial Interface Module For Arduino
It has a backlight and is ideal for displaying text characters... 32 ASCII in 2 rows.
There is room for 16 characters in each row.
Each character is made up of a tiny grid of 5x8 pixels.
There is also a 20 character by 4 lines version
The pin resources of many Arduinos are limited.
I'm using a Uno.
Sometimes the project may be not able to use a normal LCD
once it's connected with sensors, etc. Sometimes, you use up to 8 pins.
However, with this I2C interface LCD module, you can display data with only 2 wires..... I2C (and of course Vcc & Gnd)
The I2C is a type of serial bus
developed by Philips, which uses two bidirectional lines, called SDA
(Serial Data Line) and SCL (Serial Clock Line).
The supply voltage is 5V
Many adapters use a 8-bit PCF8574 chip from Texas Instruments which does the i2c data conversions.
Here is the datasheet:
This particular adapter is from NXP Semiconductors.
Here is their datasheet.
GND
Vcc - 5V
SDA - serial data (A4 on the Uno)
SCL - serial clock (A5 on the Uno)
The trimpot adjusts the LCD contrast.
Note the jumper on the left of the board. This supplies power to the backlight.
If you wish to
control the intensity of the backlight, remove the jumper and
apply a control voltage to the pin that is marked as ‘LED’.
Before you can use it you need to find the i2c address of the display
Here is a simple piece of code to upload to the IDE
scanner code
********************************************
Thanks to Nick Gammon.
- // --------------------------------------
- // i2c_scanner
- //
- // Version 1
- // This program (or code that looks like it)
- // can be found in many places.
- // For example on the Arduino.cc forum.
- // The original author is not know.
- // Version 2, Juni 2012, Using Arduino 1.0.1
- // Adapted to be as simple as possible by Arduino.cc user Krodal
- // Version 3, Feb 26 2013
- // V3 by louarnold
- // Version 4, March 3, 2013, Using Arduino 1.0.3
- // by Arduino.cc user Krodal.
- // Changes by louarnold removed.
- // Scanning addresses changed from 0...127 to 1...119,
- // according to the i2c scanner by Nick Gammon
- // https://www.gammon.com.au/forum/?id=10896
- // Version 5, March 28, 2013
- // As version 4, but address scans now to 127.
- // A sensor seems to use address 120.
- // Version 6, November 27, 2015.
- // Added waiting for the Leonardo serial communication.
- //
- //
- // This sketch tests the standard 7-bit addresses
- // Devices with higher bit address might not be seen properly.
- //
- #include <Wire.h>
- void setup()
- {
- Wire.begin();
- Serial.begin(9600);
- while (!Serial); // Leonardo: wait for serial monitor
- Serial.println("\nI2C Scanner");
- }
- void loop()
- {
- byte error, address;
- int nDevices;
- Serial.println("Scanning...");
- nDevices = 0;
- for(address = 1; address < 127; address++ )
- {
- // The i2c_scanner uses the return value of
- // the Write.endTransmisstion to see if
- // a device did acknowledge to the address.
- Wire.beginTransmission(address);
- error = Wire.endTransmission();
- if (error == 0)
- {
- Serial.print("I2C device found at address 0x");
- if (address<16)
- Serial.print("0");
- Serial.print(address,HEX);
- Serial.println(" !");
- nDevices++;
- }
- else if (error==4)
- {
- Serial.print("Unknown error at address 0x");
- if (address<16)
- Serial.print("0");
- Serial.println(address,HEX);
- }
- }
- if (nDevices == 0)
- Serial.println("No I2C devices found\n");
- else
- Serial.println("done\n");
- delay(5000); // wait 5 seconds for next scan
- }
// ************************************
Another option is to hardwire the address.
This is useful if you have multiple devices. You can set a different I2C address so that
it doesn't conflict with any other I2C devices.
The back of the module has these solder pads:
A0, A1, A2
Short these jumpers to set the address.
The jumpers take two inputs .. HIGH or LOW
We can create 8 (23) different combinations.
By default on Texas chips, all the 3 address inputs are pulled HIGH using onboard pullups, giving their PCF8574 a default I2C address of 0100111Binary or 0x27Hex.
Ther three address selection bits (A0, A1 and A2) are placed at the end of the 7-bit I2C address register.
X,X,X,X,A0,A1,A2
On a NXP chip,
all the 3 address inputs are pulled HIGH using onboard pullups, giving their PCF8574 a default I2C address of 0111111Binary or 0x3FHex.
***************************************
My LCD displays address was 0x3F
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Change the 0x3F i2c address to your i2c
// Change the 0x3F i2c address to your i2c
// LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
You need this library:
The LiquidCrystal_I2C library works in combination with the Wire.h library which allows you to communicate with I2C devices.
// **********************************************************
//code 1..Hello World
// include the library code:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// Change the 0x3F i2c address to your i2c
// LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.clear();
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
}
// ****************************************************************
// Example 3
// hELLO synth nerds
// Moving text on the two lines:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // set the LCD address to 0x3F for a 16 chars and 2 line display
void setup() {
lcd.begin(16, 2);
lcd.clear();
lcd.backlight(); // Make sure backlight is on
// Print a message on both lines of the LCD.
lcd.setCursor(2,0); //Set cursor to character 2 on line 0
lcd.print("Hello Synth");
lcd.setCursor(5,1); //Move cursor to character 5 on line 1
lcd.print("Nerds !");
}
void loop() {
}
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // set the LCD address to 0x3F for a 16 chars and 2 line display
void setup() {
lcd.begin(16, 2);
lcd.clear();
lcd.backlight(); // Make sure backlight is on
// Print a message on both lines of the LCD.
lcd.setCursor(2,0); //Set cursor to character 2 on line 0
lcd.print("Hello Synth");
lcd.setCursor(5,1); //Move cursor to character 5 on line 1
lcd.print("Nerds !");
}
void loop() {
}
// *****************************************
Example 4 - creating symbols
I love synthesizers 1
The heart symbol has been made with the online LCD symbol generator:
https://maxpromer.github.io/LCD-Character-Creator/
https://maxpromer.github.io/LCD-Character-Creator/
// *********************************
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
byte heart[] = {
0x00,
0x0A,
0x1F,
0x1F,
0x0E,
0x04,
0x00,
0x00
};
void setup() {
lcd.begin(16, 2);
lcd.backlight(); // turn backlight on
lcd.clear(); // clear the screen
lcd.createChar(1, heart); // define a symbol for memory position 1
lcd.setCursor(0, 1); // set the cursor to position 1, line 2
lcd.print("I "); // write on the screen
lcd.write(1); // write symbol from memory position 1
lcd.print(" Synthesizers"); // write on the screen
}
void loop() {}
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
byte heart[] = {
0x00,
0x0A,
0x1F,
0x1F,
0x0E,
0x04,
0x00,
0x00
};
void setup() {
lcd.begin(16, 2);
lcd.backlight(); // turn backlight on
lcd.clear(); // clear the screen
lcd.createChar(1, heart); // define a symbol for memory position 1
lcd.setCursor(0, 1); // set the cursor to position 1, line 2
lcd.print("I "); // write on the screen
lcd.write(1); // write symbol from memory position 1
lcd.print(" Synthesizers"); // write on the screen
}
void loop() {}
// ***********************************
I love synthesizers 2
The EQ symbol has been made with the online LCD symbol generator:
https://maxpromer.github.io/LCD-Character-Creator/
https://maxpromer.github.io/LCD-Character-Creator/
// *********************************
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// RS, E, D4, D5, D6, D7
byte customChar[] = {
0x00,
0x02,
0x02,
0x0A,
0x0B,
0x1B,
0x1F,
0x1F
};
void setup() {
lcd.begin(16, 2);
lcd.backlight(); // turn backlight on
lcd.clear(); // clear the screen
lcd.createChar(1, customChar); // define a symbol for memory position 1
lcd.setCursor(0, 1); // set the cursor to position 1, line 2
lcd.print("I "); // write on the screen
lcd.write(1); // write symbol from memory position 1
lcd.print(" Synthesizers"); // write on the screen
}
void loop() {}
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// RS, E, D4, D5, D6, D7
byte customChar[] = {
0x00,
0x02,
0x02,
0x0A,
0x0B,
0x1B,
0x1F,
0x1F
};
void setup() {
lcd.begin(16, 2);
lcd.backlight(); // turn backlight on
lcd.clear(); // clear the screen
lcd.createChar(1, customChar); // define a symbol for memory position 1
lcd.setCursor(0, 1); // set the cursor to position 1, line 2
lcd.print("I "); // write on the screen
lcd.write(1); // write symbol from memory position 1
lcd.print(" Synthesizers"); // write on the screen
}
void loop() {}
Links
---------------------------------
-------------------------------------
No comments:
Post a Comment