2004 20x4 I2C Serial LCD Module (HCMODU0010) Demo Sketch

Done something cool with one of our products? Got some helpful advice or a handy tutorial? Promote it here by posting or linking to your blog and tell the world.
Forum rules

Any links to third party websites located on this Website are provided for your convenience only. We have not reviewed each third party website and have no responsibility for such third party websites or their content. We do not endorse the third party websites or make representations about them or any material contained in them. If you choose to access a third party website linked to from this Website, it is at your own risk.

You may not post external links for the purpose of promoting products, services, or websites to which such links are deemed to provide a financial benefit to the poster.

Links to posts within this forum must be deemed to be relevant to the products and services of Hobby Components Ltd and is community.
Post Reply
Posts: 2
Joined: Thu Sep 04, 2014 2:58 pm

2004 20x4 I2C Serial LCD Module (HCMODU0010) Demo Sketch

Post by JamiePhonic » Sun Sep 07, 2014 11:05 pm

Since this part of the forum seems under utilised, i though it post a little something here for everyone.

Having recently bought the 2004 20x4 I2C Serial LCD Module from HobbyComponents i decided to write a sketch to test its capabilities, (which i'm delighted with by the way) so this is what i came up with:

Code: Select all

FILE:    LCD_Test
DATE:    07/09/14
Author:	 JamiePhonic
Description: Demos the basic capabilities of the HobbyComponents 2004 20x4 I2C Serial LCD Module (HCMODU0010)


PIN 2: +5V
PIN 3: SDA - Connect to Arduino analogue PIN 4 (Or Digital 20 on a Mega 2560)
PIN 4: SCL - Connect to Arduino analogue PIN 5 (Or Digital 21 on a Mega 2560)

//Include the SPI/IIC Library
#include <Wire.h> // Import the arduino Wire (I2C) library used by the next library to controll the LCD
#include <LiquidCrystal_I2C.h> // Import the I2C LCD control library

/* Initialise the LiquidCrystal library. The default address is 0x27 and this is a 20 character, 4 line display. Change the values to '16, 2' if you have the smaller version */
LiquidCrystal_I2C lcd(0x27, 20, 4); // Create the LCD object

// Setup function (Run once at the start)
void setup()
	Serial.begin(9600); // Open a serial connection
	delay(100); // Wait 100 milli seconds
	Serial.println("Serial started"); // Print "serial started" to the console then move to a new line
	/* Initialise the LCD */
	Serial.println("Attempting to Initalise LCD..."); // Print whats happening to the serial monitor
	delay(100); // Wait 100 milli seconds
	lcd.init(); // Call the special I2C LCD initalisation function
	Serial.println("LCD Initalised!"); // Update the serial monitor
	lcd.backlight(); // Turn on the LCD backlight

	LCD_progress_bar_Setup(); // Call the progress bar setup function (we only want to do this once)

/* Main program loop */
void loop()
	LCD_Demo(); // Now run the Demo function
	delay(1000); // Wait 1 second before we go again

void LCD_Demo()
	// Demo data to display. 
	char Numbers[] = "1 2 3 4 5 6 7 8 9 0";
	char* LowerAlpha[] = { "abcdefghijklmnopqrst", "uvwxyz" };
	char* UpperAlpha[] = { "ABCDEFGHIJKLMNOPQRST", "UVWXYZ" };
	char* Punctuation[] = { "!\"$%^&*()-=,./<>?:;'", "@#~[]{}\\" };
	int delayTime = 2000; // The delay before moving to the next screen (2 seconds here)

	Serial.println("Running LCD Demo"); // Print to the serial monitor whats going on
	lcd.print("Running Demo..");

	// Lets demo numbers
	Serial.println("Demoing Numbers"); // Print to the serial monitor whats going on
	lcd.setCursor(0, 2);

	// Now lets demo the lowe case alphabat
	Serial.println("Demoing Lower case alphabet"); // Print to the serial monitor whats going on
	lcd.print("Lower case alphabet:");
	lcd.setCursor(0, 2);
	lcd.setCursor(0, 3);

	// Then the upper case alphabet
	Serial.println("Demoing Upper case alphabet"); // Print to the serial monitor whats going on
	lcd.print("Upper case alphabet:");
	lcd.setCursor(0, 2);
	lcd.setCursor(0, 3);

	// Now some punctuation
	Serial.println("Demoing Punctuation"); // Print to the serial monitor whats going on
	lcd.print("Basic Punctuation:");
	lcd.setCursor(0, 2);
	lcd.setCursor(0, 3);

	// And finally a progress bar
	Serial.println("Demoing a progress bar"); // Print to the serial monitor whats going on
	lcd.print("Progress bar:");
	for (int J = 0; J < 100; J++)
		LCD_progress_bar(J, 0, 100, 1, 20); // Call the progress bar function to update it
		delay(20); // Wait 20 milli seconds before we continue to smooth out the motion
	lcd.setCursor(0, 3);

	Serial.println("Demo complete!");


// Sets up the custom characters used by the progress bar function.
// Copy this function and the one below to your own sektch to add a progress bar to it!
// Call the 'LCD_progress_bar_Setup' in your setup, then call the 'LCD_progress_bar' function to draw/update it
void LCD_progress_bar_Setup()
	/* LCD Progress Bar Characters, create your custom bars */
	uint8_t bar0[8] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
	uint8_t bar1[8] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 };
	uint8_t bar2[8] = { 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 };
	uint8_t bar3[8] = { 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C };
	uint8_t bar4[8] = { 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E };
	uint8_t bar5[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };
	/* Now create those custom characters and store them in the LCD's memory */
	lcd.createChar(0, bar0);
	lcd.createChar(1, bar1);
	lcd.createChar(2, bar2);
	lcd.createChar(3, bar3);
	lcd.createChar(4, bar4);
	lcd.createChar(5, bar5);

// Actually draws the progress bar on screen
void LCD_progress_bar(int data, int dataMinVal, int dataMaxVal, int row, int lcd_size)
	int B = map(data, dataMinVal, dataMaxVal, 0, 6 * lcd_size);
	int A = B / 6;
	lcd.setCursor(A, row);
	lcd.write(B % 6);

Post Reply