SOLVED Tricky software problem with LCD Keypad Shield and LiquidCrystal library

Hi all,

I have a tricky software problem with the following LCD Keypad Shield:

http://www.ebay.co.uk/itm/280934201935?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649#ht_1111wt_952

(which I have since found to be a pretty exact knock-off of the dfrobot product: http://www.robotshop.com/dfrobot-lcd-keypad-shield-arduino-1.html).

The seller has told me to use the following library: https://www.r3cube.com/driver/LCD4Bit_mod.zip, which I can only compile with Arduino 0023 and no later. The following example code works well:

//example use of LCD4Bit_mod library

#include <LCD4Bit_mod.h> 
//create object to control an LCD.  
//number of lines in display=1
LCD4Bit_mod lcd = LCD4Bit_mod(2); 

//Key message
char msgs[5][15] = {"Right Key OK ", 
                    "Up Key OK    ", 
                    "Down Key OK  ", 
                    "Left Key OK  ", 
                    "Select Key OK" };
int  adc_key_val[5] ={30, 150, 360, 535, 760 };
int NUM_KEYS = 5;
int adc_key_in;
int key=-1;
int oldkey=-1;

void setup() { 
  pinMode(13, OUTPUT);  //we'll use the debug LED to output a heartbeat

  lcd.init();
  //optionally, now set up our application-specific display settings, overriding whatever the lcd did in lcd.init()
  //lcd.commandWrite(0x0F);//cursor on, display on, blink on.  (nasty!)
   lcd.clear();
  lcd.printIn("KEYPAD testing... pressing");
    
}

void loop() {

	adc_key_in = analogRead(0);    // read the value from the sensor  
  digitalWrite(13, HIGH);  
  key = get_key(adc_key_in);		        // convert into key press
	
	if (key != oldkey)				    // if keypress is detected
	{
    delay(50);		// wait for debounce time
		adc_key_in = analogRead(0);    // read the value from the sensor  
    key = get_key(adc_key_in);		        // convert into key press
    if (key != oldkey)				
    {			
      oldkey = key;
      if (key >=0){
      lcd.cursorTo(2, 0);  //line=2, x=0
  			lcd.printIn(msgs[key]);
      }
    }
  }
  
  //delay(1000);
  digitalWrite(13, LOW);
  

 
  
  
}

// Convert ADC value to key number
int get_key(unsigned int input)
{
	int k;
    
	for (k = 0; k < NUM_KEYS; k++)
	{
		if (input < adc_key_val[k])
		{
           
    return k;
        }
	}
    
    if (k >= NUM_KEYS)
        k = -1;     // No valid key pressed
    
    return k;
}

(see first attachment for picture)

I want to use Arduino 1.0.1 and hence the LiquidCrystal library instead, which is when the following strange behaviour happens.

The following program gives a completely blank display on powerup, and with every subsequent Reset button push a growing garbage screen (pictures below). Oddly, a “hard reset” (USB cable out then in) resets it back to a blank display before repeating the exact same behaviour with the Reset button (so the garbage isn’t random). See next three attachments and next post with more attachments.

#include <LiquidCrystal.h>

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// these have been checked with http://www.robotshop.com/content/PDF/dfrobot-lcd-keypad-shield-schematic.pdf and the working example above

// pin 10 for PWM control of backlight (needs diode fix from http://arduino.cc/forum/index.php/topic,96747.0.html)
// Free pins: D0, 1, 2, 3, 11, 12, 13
// Free pins: A1, 2, 3, 4, 5

void setup()
{
  lcd.begin(16, 2); // start the library
  lcd.setCursor(0,0);
  lcd.print("hello world"); // print a simple message

}
void loop()
{
  lcd.setCursor(0,1); // move cursor to second line "1" and 0 spaces over
  lcd.print("hello world"); // same message as above
  delay(1000); // wait 1 sec
}

The eBay seller has refused to refund me, as from his/her point of view the hardware works, albeit with outdated software.

I have had a look through the working software (zip above) and the newer LiquidCrystal library and can’t figure out what is going wrong. All the pins are the same, so why would the older software work and the newer LiquidCrystal library not?

Many thanks,

Amadeus

Here is the continuation of the garbage message, which grows with each additional reset button push (and only resets with a hard reset).

Have you tried to search this forum to see if anyone else has had the same problem and found a solution?

Don

Hi Don,

Yes I have.

It seems that garbage in many cases is due to wiring errors, which I know is not the case as the hardware works.

The other consensus seems to be that these "fake" shields use cheaper components, and I might have an IC which works with the LCD4bit library but not the LiquidCrystal library.

I am trying to desolder the thing to find out, but it is messy.

I haven't found anyone with the exact same issue as myself though (growing garbage on repeat).

Thanks for your time,

Amadeus

The most similar post (one you were involved in) is:

http://arduino.cc/forum/index.php/topic,59382.0.html

I have grounded RW, and still the same problem.

I am also beginning to wonder if LiquidCrystal covers all these LCD keypad shields. Posting here in the hope someone can point me in the right direction re: figuring out what isn’t working.

Amadeus

When you are testing your LCD you really should use a static message. This means that things should only be done once, in setup(), and loop() should be empty.

#include <LiquidCrystal.h>

// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// these have been checked with http://www.robotshop.com/content/PDF/dfrobot-lcd-keypad-shield-schematic.pdf and the working example above

void setup()
{
  lcd.begin(16, 2); // start the library
  // lcd.setCursor(0,0);    // this is already done as part of the initialization
  lcd.print("hello world"); // print a simple message

  lcd.setCursor(0,1); // move cursor to second line "1" and 0 spaces over
  lcd.print("it works"); // a different message than above
}

void loop()
  {
  }

Don

Hi Don,

Thanks for your reply and pointers.

The code above now displays a single full character block at 2,0 and nothing else.

Amadeus

I'll just add here that the following fix to get LCD4bit compiled under Arduino 1.0.0+ is working on this device:

http://arduino.cc/forum/index.php/topic,83838.0.html

Would still be good to understand what LiquidCrystal is doing differently to LCD4bit.

The code above now displays a single full character block at 2,0 and nothing else.

Why don't you try this, it has worked for others recently. Start here http://code.google.com/p/liquidcrystal440/ and then follow the links to LiquidCrystal1.0 and try that. It was written specifically for 40x4 displays but also works for all the others, with improved timing.

Would still be good to understand what LiquidCrystal is doing differently to LCD4bit.

The person who rewrote the LiquidCrystal library understood the HD44780 datasheet and wrote code that follows the datasheet very closely.

The person who wrote the LCD4bit had little or no understanding of the HD44780 datasheet. If you don't believe me then just read the comments in the LCD4bit code.

Don

Start here http://code.google.com/p/liquidcrystal440/ and then follow the links to LiquidCrystal1.0 and try that.

Works a treat.

Thank you very much for your help. Perhaps this library will make it in as the default from 1.0.2?