Saturday, 1 April 2017

I2C LCD display - arduino

 

 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.
 

 There are 4 connections
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.
 
  1. // --------------------------------------
  2. // i2c_scanner
  3. //
  4. // Version 1
  5. //    This program (or code that looks like it)
  6. //    can be found in many places.
  7. //    For example on the Arduino.cc forum.
  8. //    The original author is not know.
  9. // Version 2, Juni 2012, Using Arduino 1.0.1
  10. //     Adapted to be as simple as possible by Arduino.cc user Krodal
  11. // Version 3, Feb 26  2013
  12. //    V3 by louarnold
  13. // Version 4, March 3, 2013, Using Arduino 1.0.3
  14. //    by Arduino.cc user Krodal.
  15. //    Changes by louarnold removed.
  16. //    Scanning addresses changed from 0...127 to 1...119,
  17. //    according to the i2c scanner by Nick Gammon
  18. //    https://www.gammon.com.au/forum/?id=10896
  19. // Version 5, March 28, 2013
  20. //    As version 4, but address scans now to 127.
  21. //    A sensor seems to use address 120.
  22. // Version 6, November 27, 2015.
  23. //    Added waiting for the Leonardo serial communication.
  24. //
  25. //
  26. // This sketch tests the standard 7-bit addresses
  27. // Devices with higher bit address might not be seen properly.
  28. //
  29.  
  30. #include <Wire.h>
  31.  
  32.  
  33. void setup()
  34. {
  35.   Wire.begin();
  36.  
  37.   Serial.begin(9600);
  38.   while (!Serial);             // Leonardo: wait for serial monitor
  39.   Serial.println("\nI2C Scanner");
  40. }
  41.  
  42.  
  43. void loop()
  44. {
  45.   byte error, address;
  46.   int nDevices;
  47.  
  48.   Serial.println("Scanning...");
  49.  
  50.   nDevices = 0;
  51.   for(address = 1; address < 127; address++ )
  52.   {
  53.     // The i2c_scanner uses the return value of
  54.     // the Write.endTransmisstion to see if
  55.     // a device did acknowledge to the address.
  56.     Wire.beginTransmission(address);
  57.     error = Wire.endTransmission();
  58.  
  59.     if (error == 0)
  60.     {
  61.       Serial.print("I2C device found at address 0x");
  62.       if (address<16)
  63.         Serial.print("0");
  64.       Serial.print(address,HEX);
  65.       Serial.println("  !");
  66.  
  67.       nDevices++;
  68.     }
  69.     else if (error==4)
  70.     {
  71.       Serial.print("Unknown error at address 0x");
  72.       if (address<16)
  73.         Serial.print("0");
  74.       Serial.println(address,HEX);
  75.     }    
  76.   }
  77.   if (nDevices == 0)
  78.     Serial.println("No I2C devices found\n");
  79.   else
  80.     Serial.println("done\n");
  81.  
  82.   delay(5000);           // wait 5 seconds for next scan
  83. }
 
// ************************************
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 
// 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() {
}
// *****************************************


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/ 
 
// *********************************
 
#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() {}

// ***********************************
I love synthesizers 2
 The EQ symbol has been made with the online LCD symbol generator:
 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() {}



Links
 

 ---------------------------------
-------------------------------------

No comments:

Post a Comment