Assistance on 4x3 keypad issue

I am new to the world of Arduino and decided to attempt to duplicate a project off of Instructibles.com. I have the entire project connected properly (I believe) after reading the schematic. The only problem that I seem to be having is that my keypad (https://www.sparkfun.com/products/8653) is not registering the 2, 5, 8, 0, 4, 5, and 6 upon pressing the buttons. I attempted to do some research into this 4x3 keypad and noticed that pin out 1 (associated to the column containing keys 2, 5, and 8) and pin out 7 (associated with the row containing keys 4, 5, 6) are related to the keys that are not operational. I have pin out 1 connected to analog pin A0 and pin out 7 connected to analog pin A5. The following is the code that I am using:

const byte ROWS = 4; //four rows

const byte COLS = 3; //three columns

char keys[ROWS][COLS] = {

{‘1’,‘2’,‘3’},

{‘4’,‘5’,‘6’},

{‘7’,‘8’,‘9’},

{‘*’,‘0’,‘#’}

};

byte rowPins[ROWS] = {5, A5, A4, A2}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A1, A0, A3}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

I am new to Arduino so bear with me. If any further code is needed to understand my problem, please advise. Any assistance is appreciated in advance!

Why use the analog pins ? Why not use something like the example code ?

http://playground.arduino.cc//Main/KeypadTutorial

/*  Keypadtest.pde
 *
 *  Demonstrate the simplest use of the  keypad library.
 *
 *  The first step is to connect your keypad to the
 *  Arduino  using the pin numbers listed below in
 *  rowPins[] and colPins[]. If you want to use different
 *  pins then  you  can  change  the  numbers below to
 *  match your setup.
 *
 */
#include <Keypad.h>

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
// Define the Keymap
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'#','0','*'}
};
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = { 9, 8, 7, 6 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[COLS] = { 12, 11, 10 }; 

// Create the Keypad
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

#define ledpin 13

void setup()
{
  pinMode(ledpin,OUTPUT);
  digitalWrite(ledpin, HIGH);
  Serial.begin(9600);
}

void loop()
{
  char key = kpd.getKey();
  if(key)  // Check for a valid key.
  {
    switch (key)
    {
      case '*':
        digitalWrite(ledpin, LOW);
        break;
      case '#':
        digitalWrite(ledpin, HIGH);
        break;
      default:
        Serial.println(key);
    }
  }
}

Thanks for the quick response! Unfortunately, all of my digital pins, with the exception of digital pin 6 are in use for an LCD screen, 3 LED’s, a potentiometer, and buzzer. I understand that doing things this way makes things more complicated.

Well I think most, maybe all, of the “analog” pins can be used as GPIO. So let’s assume it’s all … where’s the rest of your code, akin to the example I posted. What you posted was incomplete.

This is the entire code as I have utilized it. Credit to the creator, Malthe Falkenstjerne, for the time to write the code. The keypad library was retrieved from Sparkfun.com and is associated with this keypad.

/////////////////////////////

// Airsoft Bomb //

// by Malthe Falkenstjerne //

/////////////////////////////

#include <Keypad.h>

#include <LiquidCrystal.h>

#include <Tone.h>

#define pound 14

Tone tone1;

int Scount = 12; // count seconds

int Mcount = 10; // count minutes

int Hcount = 0; // count hours

int DefuseTimer = 0; // set timer to 0

long secMillis = 0; // store last time for second add

long interval = 1000; // interval for seconds

char password[4]; // number of characters in our password

int currentLength = 0; //defines which number we are currently writing

int i = 0;

char entered[4];

int ledPin = 4; //red led

int ledPin2 = 3; //yellow led

int ledPin3 = 2; //green led

LiquidCrystal lcd(7,8,10,11,12,13); // the pins we use on the LCD

const byte ROWS = 4; //four rows

const byte COLS = 3; //three columns

char keys[ROWS][COLS] = {

{‘1’,‘2’,‘3’},

{‘4’,‘5’,‘6’},

{‘7’,‘8’,‘9’},

{‘*’,‘0’,‘#’}

};

byte rowPins[ROWS] = {5, A5, A4, A2}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {A1, A0, A3}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){

pinMode(ledPin, OUTPUT); // sets the digital pin as output

pinMode(ledPin2, OUTPUT); // sets the digital pin as output

pinMode(ledPin3, OUTPUT); // sets the digital pin as output

tone1.begin(9);

lcd.begin(16, 2);

Serial.begin(9600);

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Enter Code: ");

while (currentLength < 4)

{

lcd.setCursor(currentLength + 6, 1);

lcd.cursor();

char key = keypad.getKey();

key == NO_KEY;

if (key != NO_KEY)

{

if ((key != ‘*’)&&(key != ‘#’))

{

lcd.print(key);

password[currentLength] = key;

currentLength++;

tone1.play(NOTE_C6, 200);

}

}

}

if (currentLength == 4)

{

delay(500);

lcd.noCursor();

lcd.clear();

lcd.home();

lcd.print("You’ve Entered: ");

lcd.setCursor(6,1);

lcd.print(password[0]);

lcd.print(password[1]);

lcd.print(password[2]);

lcd.print(password[3]);

tone1.play(NOTE_E6, 200);

delay(3000);

lcd.clear();

currentLength = 0;

}

}

void loop()

{

timer();

char key2 = keypad.getKey(); // get the key

if (key2 == ‘*’)

{

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Code: ");

while (currentLength < 4)

{

timer();

char key2 = keypad.getKey();

if (key2 == ‘#’)

{

currentLength = 0;

lcd.clear();

lcd.setCursor(0,0);

lcd.print("Code: ");

}

else

if (key2 != NO_KEY)

{

lcd.setCursor(currentLength + 7, 0);

lcd.cursor();

lcd.print(key2);

entered[currentLength] = key2;

currentLength++;

tone1.play(NOTE_C6, 200);

delay(100);

lcd.noCursor();

lcd.setCursor(currentLength + 6, 0);

lcd.print(“*”);

lcd.setCursor(currentLength + 7, 0);

lcd.cursor();

}

}

if (currentLength == 4)

{

if (entered[0] == password[0] && entered[1] == password[1] && entered[2] == password[2] && entered[3] == password[3])

{

lcd.noCursor();

lcd.clear();

lcd.home();

lcd.print(“Bomb Defused”);

currentLength = 0;

digitalWrite(ledPin3, HIGH);

delay(2500);

lcd.setCursor(0,1);

lcd.print(“Reset the Bomb”);

delay(1000000);

}

else

{

lcd.noCursor();

lcd.clear();

lcd.home();

lcd.print(“Wrong Password!”);

if (Hcount > 0)

{

Hcount = Hcount - 1;

}

if (Mcount > 0)

{

Mcount = Mcount - 59;

}

if (Scount > 0)

{

Scount = Scount - 59;

}

delay(1500);

currentLength = 0;

}

}

}

}

void timer()

{

Serial.print(Scount);

Serial.println();

if (Hcount <= 0)

{

if ( Mcount < 0 )

{

lcd.noCursor();

lcd.clear();

lcd.home();

lcd.print("The Bomb Has ");

lcd.setCursor (0,1);

lcd.print(“Exploded!”);

while (Mcount < 0)

{

digitalWrite(ledPin, HIGH); // sets the LED on

tone1.play(NOTE_A2, 90);

delay(100);

digitalWrite(ledPin, LOW); // sets the LED off

tone1.play(NOTE_A2, 90);

delay(100);

digitalWrite(ledPin2, HIGH); // sets the LED on

tone1.play(NOTE_A2, 90);

delay(100);

digitalWrite(ledPin2, LOW); // sets the LED off

tone1.play(NOTE_A2, 90);

delay(100);

digitalWrite(ledPin3, HIGH); // sets the LED on

tone1.play(NOTE_A2, 90);

delay(100);

digitalWrite(ledPin3, LOW); // sets the LED off

tone1.play(NOTE_A2, 90);

delay(100);

}

}

}

lcd.setCursor (0,1); // sets cursor to 2nd line

lcd.print (“Timer:”);

if (Hcount >= 10)

{

lcd.setCursor (7,1);

lcd.print (Hcount);

}

if (Hcount < 10)

{

lcd.setCursor (7,1);

lcd.write (“0”);

lcd.setCursor (8,1);

lcd.print (Hcount);

}

lcd.print (“:”);

if (Mcount >= 10)

{

lcd.setCursor (10,1);

lcd.print (Mcount);

}

if (Mcount < 10)

{

lcd.setCursor (10,1);

lcd.write (“0”);

lcd.setCursor (11,1);

lcd.print (Mcount);

}

lcd.print (“:”);

if (Scount >= 10)

{

lcd.setCursor (13,1);

lcd.print (Scount);

}

if (Scount < 10)

{

lcd.setCursor (13,1);

lcd.write (“0”);

lcd.setCursor (14,1);

lcd.print (Scount);

}

if (Hcount <0)

{

Hcount = 0;

}

if (Mcount <0)

{

Hcount --;

Mcount = 59;

}

if (Scount <1) // if 60 do this operation

{

Mcount --; // add 1 to Mcount

Scount = 59; // reset Scount

}

if (Scount > 0) // do this oper. 59 times

{

unsigned long currentMillis = millis();

if(currentMillis - secMillis > interval)

{

tone1.play(NOTE_G5, 200);

secMillis = currentMillis;

Scount --; // add 1 to Scount

digitalWrite(ledPin2, HIGH); // sets the LED on

delay(10); // waits for a second

digitalWrite(ledPin2, LOW); // sets the LED off

delay(10); // waits for a second

//lcd.clear();

}

}

}

I’d use a DVM and confirm, at the Arduino pins, that the missing pins (1, 7) make the shorts they’re supposed to. If the keypad is working and the wires OK, then I’d minimize the code to something like the example code. Have it print to the serial monitor the key pressed.

So far as I can tell your connections should be …

Key ↔ Arduino

. 2 ↔ 5

. 7 ↔ A5

. 6 ↔ A4

. 4 ↔ A2

. 3 ↔ A1

. 1 ↔ A0

. 5 ↔ A3

FWIW using the code tags/button makes it easier to read the code.

(click on to open)

I’m sorry, I’m new to this… can you explain what the dvm is?

DVM = digital voltmeter, usually part of a …

DMM = digital multimeter, which can measure voltage, current and resistance (at a minimum)

https://www.sparkfun.com/products/9141

https://www.sparkfun.com/products/10892

You might use the ohmmeter to check for low low resistance btw the “missing” pins to see if the keypad is working as it should. Then you’ll want to check the wires from the keypad to the Arduino.