Keypads are a great way to let users interact with your project. You can use them to navigate menus, enter passwords, and control games and robots. In this tutorial, we will show you how to setup a keypad on the Arduino. First we will explain how the Arduino detects key presses, and then we will show how to find the pinout of any keypad. As a simple example, we will show you how to print out the key presses on the serial monitor and an LCD. Finally, we will show how to activate a 5V relay when a password is entered correctly.
We will be using a 4X4 matrix membrane keypad in this article, but there are also wiring diagrams and code for 3X4 matrix keypads as well. We prefer membrane style keypads because they’re thin and also have adhesive backing making them easy to stick to most flat surfaces. You can also get telephone style keypads that have thicker buttons if you like that style better. Even salvaged keypads from old telephones will work with the Arduino.
How do Keypads work?
The buttons on a keypad are arranged in rows and columns. A 3X4 keypad has 4 rows and 3 columns and a 4X4 keypad has 4 rows and 4 columns:
Beneath each key is a membrane switch. Each switch in a row is connected to the other switches in the row by a conductive trace underneath the pad. Each switch in a column is connected the same way – one side of the switch is connected to all of the other switches in that column by a conductive trace. Each row and column is brought out to a single pin, for a total of 8 pins on a 4X4 keypad:
Pressing a button closes the switch between a column and a row trace, allowing current to flow between a column pin and a row pin.
The schematic for a 4X4 keypad shows how the rows and columns are connected:
The Arduino detects which button is pressed by detecting the row and column pin that’s connected to the button.
This happens in four steps:
- First, when no buttons are pressed, all of the column pins are held HIGH, and all of the row pins are held LOW:
- When a button is pressed, the column pin is pulled LOW since the current from the HIGH column flows to the LOW row pin:
- The Arduino now knows which column the button is in, so now it just needs to find the row the button is in. It does this by switching each one of the row pins HIGH, and at the same time reading all of the column pins to detect which column pin returns to HIGH:
- When the column pin goes HIGH again, the Arduino has found the row pin that is connected to the button:
From the diagram above, you can see that the combination of row 2 and column 2 could only mean that the number 5 button was pressed.
Parts List:
- Arduino Uno
- 4X4 Membrane Keypads
- 3X4 Membrane Keypads
- Resistors (optional)
- LED Bulbs (optional)
Connecting the keypad to Arduino: The pin layout for most membrane keypads will look like this:
Follow the diagrams below to connect the keypad to an Arduino Uno, depending on whether you have a 3X4 or 4X4 keypad:
How to find Keypad Pinout:
If your keypad’s pin layout doesn’t match the ones above, you can probe the pins to figure it out. You’ll need to build a test circuit by connecting an LED and a current limiting resistor to the Arduino (or any 5V power source) like this:
First, find out which keypad pins are connected to the button rows. Insert the ground (black) wire into the first pin on the left. Press any button in row 1 and hold it down. Now insert the positive (red) wire into each one of the other pins. If the LED lights up at one of the pins, press and hold another button in row 1, then insert the positive wire into each one of the other pins again. If the LED lights up on a different pin, it means the ground wire is inserted into the row 1 pin. If none of the buttons in row 1 make the LED light up, the ground wire is not connected to row 1. Now move the ground wire over to the next pin, press a button in a different row, and repeat the process above until you’ve found the pin for each row.
To figure out which pins the columns are connected to, insert the ground wire into the pin you know is row 1. Now press and hold any one of the buttons in that row. Now insert the positive wire into each one of the remaining pins. The pin that makes the LED light up is the pin that’s connected to that button’s column. Now press down another button in the same row, and insert the positive wire into each one of the other pins. Repeat this process for each one of the other columns until you have each one mapped out.
PROGRAMMING THE KEYPAD
For a basic demonstration of how to setup the keypad, I’ll show you how to print each key press to the serial monitor.
THE CODE
Once the Keypad library is installed, you can upload this code to the Arduino if you’re using a 4X4 keypad.
Lines 3 and 4 in the code above set the number of rows and columns on the keypad.Lines 6-11 define which characters are printed when a particular button is pressed on the keypad. The characters are laid out just as they appear on the keypad. If your keypad has a different layout, you can define which characters are printed when you press a button. For example, say your keypad has a column of letters on the left instead of the right. You would just changechar hexaKeys[ROWS][COLS] = {… } accordingly.
After you upload the code, open the serial monitor. When you press a key, the value will be printed out: