Nr.01 – Keypad Shield

Keypadshield mit dem Arduino betreiben

Ein Keypadshield hat den Vorteil, dass man das LCD Display nicht in komplizierter Weise verkabeln muss und dass man zusätzlich sechs Taster hat, die man verwenden kann. Das besondere liegt bei den Tasten darin, dass sie im Programmcode alle über einen analogen Pin ausgelesen werden können. Denn die Taster sind über unterschiedliche Widerstände alle mit einem analogen Pin (A0) verbunden. Der Pin A0 kann daher nur eingeschränkt für andere Dinge verwendet werden. Aus dem Grund befindet sich auf dem Shield auch kein Steckplatz für den A0-Pin.

Die freien digitalen Pins sind 13, 12, 11, 3, 2, 1 und 0. Diese können auf dem Shield oben rechts  in der Ecke angeschlossen werden. Dazu sollte eine Buchsenleiste aufgelötet werden. Die freien analogen Pins befinden sich unterhalb des LCD und sind einzeln beschriftet.

Das Keypadshield kann u.a. auf das UNO das MEGA Board aufgesteckt werden. Es wird so platziert, dass die Pins für die Spannungsversorgung genau in die Pins der Spannungsversorgung auf dem Arduino Board passt (auf dem Bild unten in der Mitte sieht man die Pins für die Spannungsversorgung. Ein Anhaltspunkt kann der Pin mit der Aufschrift „VIN“ sein). Die oberen Steckplätze des Arduinoboards werden ebenfalls durch das Shield verdeckt (Pin 0-13). Einige können eh nicht mehr verwendet werden, da das LCD Display sie verwendet. Die nicht mehr benötigten Pins wurden in einer Reihe von Steckplätzen zusammengefasst (Siehe Foto oben rechts).

Wenn man diese Steckplätze verwenden möchte, sollte man dort Kabelbuchsen auflöten.

Als Beispielcode kann der folgende verwendet werden:

 

//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("NACHRICHT"); // 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;
 
}
}
}