
With IIC/I2C interface, it only takes two I/O port thus saving more for other usages. You can adjust the contrast by the potentiometer at its back. If you dont want the backlight, you can also unplug the jumper cap at the LCD back.

Features:IIC/I2C interface was developed to reduce the IO port usage on Arduino board.* Old 1602 screen requires 7 IO ports but this module uses only two.* Much needed control panel IO ports can be used to add some sensors, SD card and so on.* A New High-Quality 4 Line 20 Character Lcd Module.* Potentiometer can be adjusted to control the contrast.* Back light can be turned off by removing the jumper on the back panel.Specification:* Interface: I2C* I2C Address: 0x27* Pin Definition : GND、VCC、SDA、SCL* Back lit (Yellow with Black char color)* Supply voltage: 5V* Size : 60mm×99mm* Contrast Adjust : Potentiometer* Backlight Adjust : Jumper

// Based on the work by DFRobot#include "LiquidCrystal_I2C.h"#include #if defined(ARDUINO) && ARDUINO >= 100#include "Arduino.h"#define printIIC(args)Wire.write(args)inline size_t LiquidCrystal_I2C::write(uint8_t value) {send(value, Rs);return 1;}#else#include "WProgram.h"#define printIIC(args)Wire.send(args)inline void LiquidCrystal_I2C::write(uint8_t value) {send(value, Rs);}#endif#include "Wire.h"// When the display powers up, it is configured as follows://// 1. Display clear// 2. Function set:// DL = 1; 8-bit interface data// N = 0; 1-line display// F = 0; 5x8 dot character font// 3. Display on/off control:// D = 0; Display off// C = 0; Cursor off// B = 0; Blinking off// 4. Entry mode set:// I/D = 1; Increment by 1// S = 0; No shift//// Note, however, that resetting the Arduino doesn"t reset the LCD, so we// can"t assume that its in that state when a sketch starts (and the// LiquidCrystal constructor is called).LiquidCrystal_I2C::LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows){_Addr = lcd_Addr;_cols = lcd_cols;_rows = lcd_rows;_backlightval = LCD_NOBACKLIGHT;}void LiquidCrystal_I2C::init(){init_priv();}void LiquidCrystal_I2C::init_priv(){Wire.begin();_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;begin(_cols, _rows);}void LiquidCrystal_I2C::begin(uint8_t cols, uint8_t lines, uint8_t dotsize) {if (lines > 1) {_displayfunction |= LCD_2LINE;}_numlines = lines;// for some 1 line displays you can select a 10 pixel high fontif ((dotsize != 0) && (lines == 1)) {_displayfunction |= LCD_5x10DOTS;}// SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!// according to datasheet, we need at least 40ms after power rises above 2.7V// before sending commands. Arduino can turn on way befer 4.5V so we"ll wait 50delay(50);// Now we pull both RS and R/W low to begin commandsexpanderWrite(_backlightval);// reset expanderand turn backlight off (Bit 8 =1)delay(1000);//put the LCD into 4 bit mode// this is according to the hitachi HD44780 datasheet// figure 24, pg 46// we start in 8bit mode, try to set 4 bit modewrite4bits(0x03 << 4);delayMicroseconds(4500); // wait min 4.1ms// second trywrite4bits(0x03 << 4);delayMicroseconds(4500); // wait min 4.1ms// third go!write4bits(0x03 << 4);delayMicroseconds(150);// finally, set to 4-bit interfacewrite4bits(0x02 << 4);// set # lines, font size, etc.command(LCD_FUNCTIONSET | _displayfunction);// turn the display on with no cursor or blinking default_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;display();// clear it offclear();// Initialize to default text direction (for roman languages)_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;// set the entry modecommand(LCD_ENTRYMODESET | _displaymode);home();}/********** high level commands, for the user! */void LiquidCrystal_I2C::clear(){command(LCD_CLEARDISPLAY);// clear display, set cursor position to zerodelayMicroseconds(2000); // this command takes a long time!}void LiquidCrystal_I2C::home(){command(LCD_RETURNHOME); // set cursor position to zerodelayMicroseconds(2000); // this command takes a long time!}void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };if ( row > (_numlines-1) ) {row = _numlines-1; // we count rows starting w/0}command(LCD_SETDDRAMADDR | (col + row_offsets[row]));}// Turn the display on/off (quickly)void LiquidCrystal_I2C::noDisplay() {_displaycontrol &= ~LCD_DISPLAYON;command(LCD_DISPLAYCONTROL | _displaycontrol);}void LiquidCrystal_I2C::display() {_displaycontrol |= LCD_DISPLAYON;command(LCD_DISPLAYCONTROL | _displaycontrol);}// Turns the underline cursor on/offvoid LiquidCrystal_I2C::noCursor() {_displaycontrol &= ~LCD_CURSORON;command(LCD_DISPLAYCONTROL | _displaycontrol);}void LiquidCrystal_I2C::cursor() {_displaycontrol |= LCD_CURSORON;command(LCD_DISPLAYCONTROL | _displaycontrol);}// Turn on and off the blinking cursorvoid LiquidCrystal_I2C::noBlink() {_displaycontrol &= ~LCD_BLINKON;command(LCD_DISPLAYCONTROL | _displaycontrol);}void LiquidCrystal_I2C::blink() {_displaycontrol |= LCD_BLINKON;command(LCD_DISPLAYCONTROL | _displaycontrol);}// These commands scroll the display without changing the RAMvoid LiquidCrystal_I2C::scrollDisplayLeft(void) {command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVELEFT);}void LiquidCrystal_I2C::scrollDisplayRight(void) {command(LCD_CURSORSHIFT | LCD_DISPLAYMOVE | LCD_MOVERIGHT);}// This is for text that flows Left to Rightvoid LiquidCrystal_I2C::leftToRight(void) {_displaymode |= LCD_ENTRYLEFT;command(LCD_ENTRYMODESET | _displaymode);}// This is for text that flows Right to Leftvoid LiquidCrystal_I2C::rightToLeft(void) {_displaymode &= ~LCD_ENTRYLEFT;command(LCD_ENTRYMODESET | _displaymode);}// This will "right justify" text from the cursorvoid LiquidCrystal_I2C::autoscroll(void) {_displaymode |= LCD_ENTRYSHIFTINCREMENT;command(LCD_ENTRYMODESET | _displaymode);}// This will "left justify" text from the cursorvoid LiquidCrystal_I2C::noAutoscroll(void) {_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;command(LCD_ENTRYMODESET | _displaymode);}// Allows us to fill the first 8 CGRAM locations// with custom charactersvoid LiquidCrystal_I2C::createChar(uint8_t location, uint8_t charmap[]) {location &= 0x7; // we only have 8 locations 0-7command(LCD_SETCGRAMADDR | (location << 3));for (int i=0; i<8; i++) {write(charmap[i]);}}// Turn the (optional) backlight off/onvoid LiquidCrystal_I2C::noBacklight(void) {_backlightval=LCD_NOBACKLIGHT;expanderWrite(0);}void LiquidCrystal_I2C::backlight(void) {_backlightval=LCD_BACKLIGHT;expanderWrite(0);}/*********** mid level commands, for sending data/cmds */inline void LiquidCrystal_I2C::command(uint8_t value) {send(value, 0);}/************ low level data pushing commands **********/// write either command or datavoid LiquidCrystal_I2C::send(uint8_t value, uint8_t mode) {uint8_t highnib=value&0xf0;uint8_t lownib=(value<<4)&0xf0;write4bits((highnib)|mode);write4bits((lownib)|mode);}void LiquidCrystal_I2C::write4bits(uint8_t value) {expanderWrite(value);pulseEnable(value);}void LiquidCrystal_I2C::expanderWrite(uint8_t _data){Wire.beginTransmission(_Addr);printIIC((int)(_data) | _backlightval);Wire.endTransmission();}void LiquidCrystal_I2C::pulseEnable(uint8_t _data){expanderWrite(_data | En);// En highdelayMicroseconds(1);// enable pulse must be >450nsexpanderWrite(_data & ~En);// En lowdelayMicroseconds(50);// commands need > 37us to settle}// Alias functionsvoid LiquidCrystal_I2C::cursor_on(){cursor();}void LiquidCrystal_I2C::cursor_off(){noCursor();}void LiquidCrystal_I2C::blink_on(){blink();}void LiquidCrystal_I2C::blink_off(){noBlink();}void LiquidCrystal_I2C::load_custom_character(uint8_t char_num, uint8_t *rows){createChar(char_num, rows);}void LiquidCrystal_I2C::setBacklight(uint8_t new_val){if(new_val){backlight();// turn backlight on}else{noBacklight();// turn backlight off}}void LiquidCrystal_I2C::printstr(const char c[]){//This function is not identical to the function used for "real" I2C displays//it"s here so the user sketch doesn"t have to be changedprint(c);}// unsupported API functionsvoid LiquidCrystal_I2C::off(){}void LiquidCrystal_I2C::on(){}void LiquidCrystal_I2C::setDelay (int cmdDelay,int charDelay) {}uint8_t LiquidCrystal_I2C::status(){return 0;}uint8_t LiquidCrystal_I2C::keypad (){return 0;}uint8_t LiquidCrystal_I2C::init_bargraph(uint8_t graphtype){return 0;}void LiquidCrystal_I2C::draw_horizontal_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_col_end){}void LiquidCrystal_I2C::draw_vertical_graph(uint8_t row, uint8_t column, uint8_t len, uint8_t pixel_row_end){}void LiquidCrystal_I2C::setContrast(uint8_t new_val){}

I"m using this with a Digistump DigiX, and it works very nicely. I like the white display on blue backlight.Some notes which I hope may be useful to others:- If it doesn"t seem to work at first, some suggestions: a- check the I2C address, that"s probably the main culprit (see below) b- if your Arduino has more than 1 I2C bus, check you are using the right one. c- check the voltage level on the IIC, the 2 pins on the left above the LCD are ground followed by Vcc, should be 5V.- There seems to be a lot of confusion on the I2C address. Mine was on the expected 0x27 address.There are 2 versions of the i2c chip which differ in their address and I suspect that"s why some people indicate they need to use address 0x3F instead of 0x27. Explanation follows.Look on the back at the marking on the i2c chip, it"s going to be either a PCF8574T or a PCF8574AT.The address is fixed by the 3 pins #1, #2 and #3 of the PCF8574, which you can verify are all connected to Vcc.Next check page 9 of the datasheet from http://www.nxp.com/documents/data_sheet/PCF8574.pdf :- For the "T" version, the address is going to be [0 1 0 0 A2 A1 A0], which is 0x27.- For the "AT" version, the address is going to be [0 1 1 1 A2 A1 A0], which is 0x3F.- The DigiX, like the Arduino DUE or a Raspberry Pi, uses 3.3V I/O. You MUST NOT connect this directly on the I2C bus when powering the LCD via 5V. Instead just grab any i2c level shifter, for example something like
or any similar board.- The I2C chip PCF8574T should work fine with a 3.3V level, and the HD44780 is supposed too. However when I tried, this was not enough to power the whole display. I had to provide 5V to Vcc and use a level shifter for the I2C SDA and SCL.- The DigiX from Digistump did not require any extra LiquidCrystal_I2C library: it"s already included in the DigiX libraries. However the DigiX has 2 I2C buses, and the library by default uses Wire1, which is pins 70 and 71. To try it out, use Examples > DigiX > DigiXLCD > BasicUsage in the Arduino IDE if configured with the DigiX libraries.- The library has an LCD::backlight() and noBacklight() functions which work well. The display is NOT readable with the backlight turned off.- Note that by default the display line "wraps" around (from line 1 to 3 then to 2 then to 4). Internally the HD44780 has 80 bytes of display. The default LCD::print() method thus wraps at the end of the line to the next logical line unless you clip/trim your strings.- On the back of the I2C board there"s a red led when powered and a jumper to deactivate it. There"s also a little knob to adjust the contrast -- it only changes the white dots contrasts and does not adjust the level of the blue backlight.

This is a high-quality I2C LCD 2004 display. It"s in elegant blue with white contents displayed. Can display 4 rows with 20 characters for each. With the LCD shield, you can display whatever you want by programming for Arduino board or Raspberry Pi. Therefore, this is a perfect choice to make your project more interesting and vivid! 2004 LCD WITH i2c interface MODULE Specification: Display: 4 lines x 20 characters Backlight: Blue with white character color LCD controller: HD44780 Pin Definition: VCC/ GND/SDL and SCA Contrast Adjust: Potentiometer Backlight Adjust: Jumper Default Address: 0x27, 0x3F Working Voltage: 5V Package: 1 x blue 20x4 2004 lcd display + I2C serial interface 2004 LCD Module IIC/I2C interface With IIC/I2C interface, it only takes two I/O port thus saving more for other usages. You can adjust the contrast by the potentiometer at its back. If you don’t want the backlight, you can also unplug the jumper cap at the LCD back.

LCD2004-character LCD display module is a new high-quality 4 line 20 character LCD module not only set the contrast control knob selector switch also has a backlight and IIC communication interface. For Arduino beginners, not for the cumbersome and complex LCD driver circuit connection and a headache, the real significance of this LCD module will simplify the circuit, this module directly into the Arduino Sensor Shield V5.0 sensor expansion board IIC device interface can, GM 4P sensor connection cable, programmed through the Arduino controller, you can easily identify the slogan, sensor data records