Friday, November 11, 2011

Tutorial: Arduino and Numeric Keypads – Part Two

This is an addendum to chapter forty-two of a series originally titled “Getting Started/Moving Forward with Arduino!” by John Boxall – a series of articles on the Arduino universe. The first chapter is here, the complete series is detailed here. Any files from tutorials will be found here.

Welcome back fellow arduidans!

This is the second part of our numeric keypad tutorial – in which we use the larger keypads with four rows of four buttons. For example:

Again, the keypad looks like a refugee from the 1980s – however it serves a purpose. Notice that there are eight connections at the bottom instead of seven – the extra connection is for the extra column of buttons – A~D. This example again came from Futurlec. For this tutorial you will need the data sheet for the pinouts, so download it from here (.pdf).

To use this keypad is very easy, if you haven’t already done so, download the numeric keypad Arduino library from here, copy the “Keypad” folder into your ../arduino-002x/libraries folder, then restart the Arduino IDE.

Now for our first example – just to check all is well. From a hardware perspective you will need:

Connect the keypad to the Arduino in the following manner:
  • Keypad row 1 (pin eight) to Arduino digital 5
  • Keypad row 2 (pin 1) to Arduino digital 4
  • Keypad row 3 (pin 2) to Arduino digital 3
  • Keypad row 4 (pin 4) to Arduino digital 2
  • Keypad column 1 (pin 3) to Arduino digital 9
  • Keypad column 2 (pin 5) to Arduino digital 8
  • Keypad column 3 (pin 6) to Arduino digital 7
  • Keypad column 4 (pin 7) to Arduino digital 6
Now for the sketch – take note how we have accommodated for the larger numeric keypad:
  • the extra column in the array char keys[]
  • the extra pin in the array colPins[]
  • and the byte COLS = 4.
You can download the sketch from here.

Example 42.3

/* Example 42.3 - Numeric keypad and I2C LCD http://tronixstuff.wordpress.com/tutorials > chapter 42a Uses Keypad library for Arduino  http://www.arduino.cc/playground/Code/Keypad  by Mark Stanley, Alexander Brevig */  #include "Keypad.h" #include "Wire.h" // for I2C LCD #include "LiquidCrystal_I2C.h" // for I2C bus LCD module http://bit.ly/eNf7jM LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display  const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = {{'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'}}; byte rowPins[ROWS] = { 5, 4, 3, 2}; //connect to the row pinouts of the keypad byte colPins[COLS] = { 9, 8, 7, 6}; //connect to the column pinouts of the keypad int count=0;  Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  void setup() { Serial.begin(9600); lcd.init();          // initialize the lcd lcd.backlight(); // turn on LCD backlight }  void loop() { char key = keypad.getKey(); if (key != NO_KEY) { lcd.print(key); Serial.print(key); count++; if (count==17) { lcd.clear(); count=0; } } }

And our action video:


Now for another example – we will repeat the keypad switch from chapter 42 – but allow the letters into the PIN, and use the LCD instead of LEDs for the status. In the following example, the PIN is 12AD56. Please remember that the functions correctPIN() and incorrectPIN() are example functions for resulting PIN entry – you would replace these with your own requirements, such as turning something on or off.  You can download the sketch from here.

Example 42.4

// Example 42.4 - Six-character keypad switch // http://tronixstuff.wordpress.com/tutorials > chapter 42a  #include "Keypad.h" #include "Wire.h" // for I2C LCD #include "LiquidCrystal_I2C.h" // for I2C bus LCD module http://bit.ly/eNf7jM LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display  const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keys[ROWS][COLS] = {{'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'}}; byte rowPins[ROWS] = { 5, 4, 3, 2}; //connect to the row pinouts of the keypad byte colPins[COLS] = { 9, 8, 7, 6}; //connect to the column pinouts of the keypad  Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  char PIN[6]={'1','2','A','D','5','6'}; // our secret (!) number char attempt[6]={ 0,0,0,0,0,0}; // used for comparison int z=0;  void setup() { lcd.init();          // initialize the lcd lcd.backlight(); // turn on LCD backlight lcd.print("  Enter PIN..."); }  void correctPIN() // do this if correct PIN entered { lcd.print("* Correct PIN *"); delay(1000); lcd.clear(); lcd.print("  Enter PIN..."); }  void incorrectPIN() // do this if incorrect PIN entered { lcd.print(" * Try again *"); delay(1000); lcd.clear(); lcd.print("  Enter PIN..."); }  void checkPIN() { int correct=0; for (int q=0; q<6; q++) { if (attempt[q]==PIN[q]) { correct++; } } if (correct==6) { correctPIN(); } else { incorrectPIN(); } for (int zz=0; zz<6; zz++) // wipe attempt { attempt[zz]=0; } }  void readKeypad() { char key = keypad.getKey(); if (key != NO_KEY) { switch(key) { case '*': z=0; break; case '#': delay(100); // for extra debounce lcd.clear(); checkPIN(); break; default: attempt[z]=key; z++; } } }  void loop() { readKeypad(); }

Now let’s see it in action:

So now you have the ability to use twelve and sixteen-button keypads with your Arduino systems.

Have fun and keep checking into tronixstuff.com. Why not follow things on twitterGoogle+, subscribe  for email updates or RSS using the links on the right-hand column, or join our Google Group – dedicated to the projects and related items on this website. Sign up – it’s free, helpful to each other –  and we can all learn something.

 

No comments:

Post a Comment