Task: Use a keypad shield with Arduino.
Required equipment: Arduino / Keypad shield
The keypad shield has some advantages over the simple LCD module. It doesn’t has to be
wired that complicated and has six push button, which can be used. These six buttons can be read out trough the analog pins of the microcontroller. The buttons are all connected, trough different resistors, with a analog pin (A0). That’s why the analog pin A0 can only be used limited for different purposes. The shield doesn’t even has the A0 pin.
The keypad shield can be plugged on the UNO board or the MEGA board for example. The power supply pins of the keypad shield should be plugged into the power supply pins of the microcontroller board (on the middle bottom you can find the power supply pins of the keypad shield. The label VIN or 5V can also help you to find them). The pins on the top of the Arduino are also used by the keypad shield (pin 0-13). Some of them are used for the LCD on the keypad shield. The other free pins are combined in a row of slots (see on the top of the image).
If you want to use these slots, we recommend to solder a connector strip onto them.
One example of a sketch can be the following:
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>
/*******************************************************
This program will test the LCD panel and the buttons
Mark Bramwell, July 2010
********************************************************/
// select the pins used on the LCD panel
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define some values used by the panel and buttons
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
// read the buttons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read the value from the sensor my buttons when read are centered at these //valies: 0, 144, 329, 504, 741 we add approx 50 to those values and check to see if we are close
if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be //the most likely result
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 195) return btnUP;
if (adc_key_in < 380) return btnDOWN;
if (adc_key_in < 555) return btnLEFT;
if (adc_key_in < 790) return btnSELECT;
return btnNONE; // when all others fail, return this…
}
void setup()
{
lcd.begin(16, 2); // start the library
lcd.setCursor(0,0);
lcd.print(„Message„); // print a simple message
pinMode (2, OUTPUT);
}
void loop()
{
digitalWrite (2, HIGH);
lcd.setCursor(9,1); // move cursor to second line „1“ and 9 spaces over
lcd.print(millis()/1000); // display seconds elapsed since power-up
lcd.setCursor(0,1); // move to the begining of the second line
lcd_key = read_LCD_buttons(); // read the buttons
switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnRIGHT:
{
lcd.print(„RIGHT „);
digitalWrite (2, LOW);
break;
}
case btnLEFT:
{
lcd.print(„LEFT „);
break;
}
case btnUP:
{
lcd.print(„UP „);
break;
}
case btnDOWN:
{
lcd.print(„DOWN „);
break;
}
case btnSELECT:
{
lcd.print(„SELECT“);
break;
}
case btnNONE:
{
lcd.print(„NONE „);
break;
}
}
}