Hi all,
I have a tricky software problem with the following LCD Keypad Shield:
(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