Security is a major concern in our day to day life, and digital locks have became an important part of these security systems. One such digital code lock is imitated in this project using arduino board and a matrix keypad.
Components
- Arduino
- Keypad Module
- Buzzer
- 16x2 LCD
- BC547 Transistor
- Resistor (1k)
- Bread board
- Power
- Connecting wires
In this circuit we have used multiplexing technique to interface keypad for input the password in the system. Here we are using 4x4 keypad which contains 16 key. If we want to use 16 keys then we need 16 pin for connection to arduino but in multiplexing technique we need to use only 8 pin for interfacing 16 keys. So that it is a smart way to interface a keypad module.
Multiplexing Technique: Multiplexing technique is a very efficient way to reduce number of pins used with the microcontroller for providing input or password or numbers. Basically this technique is used in two ways - one is row scanning and other one is colon scanning. But in this arduino based project we have used keypad library so we do not need to make any multiplexing code for this system. We only need to use keypad library for providing input.
Circuit Description
Circuit of this project is very simple which contains Arduino, keypad module, buzzer and LCD. Arduino controls the complete processes like taking password form keypad module, comparing passwords, driving buzzer and sending status to LCD display. Keypad is used for taking password. Buzzer is used for indications and LCD is used for displaying status or messages on it. Buzzer is driven by using a NPN transistor.
Keypad module’s Column pins are directly connected to pin 4, 5, 6, 7 and Row pins are connected to 3, 2, 1, 0 of arduino uno. A 16x2 LCD is connected with arduino in 4-bit mode. Control pin RS, RW and En are directly connected to arduino pin 13, GND and 12. And data pin D4-D7 is connected to pins 11, 10, 9 and 8 of arduino. And one buzzer is connected at pin 14(A1) of arduino through a BC547 NPN transistor.
Working
We have used inbuilt arduino’s EEPROM to save password, so when we run this circuit first time program read a garbage data from inbuilt arduino’s EEPROM and compare it with input password and give a message on LCD that is Access Denied because password does not match. For solving this problem we need to set a default password for the first time by using programming given below:
for(int j=0;j<4;j++)
EEPROM.write(j, j+49);
lcd.print("Enter Ur Passkey:");
lcd.setCursor(0,1);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
This will set password “1234” to EEPROM of Arduino.
After running it first time we need to remove this from program and again write the code in to the arduino and run. Now your system will run fine. And for your second time used password is now “1234”. Now you can change it by pressing # button and then enter your current password and then enter your new password.
When you will enter your password, system will compare your entered password with that password that is stored in EEPROM of arduino. If match is occurred then LCD will show “access granted” and if password is wrong then LCD will “Access Denied” and buzzer continuously beep for some time. And buzzer is also beep a single time whenever user will press any button from keypad.
Programming Description
In code we have used keypad library for interfacing keypad with arduino.
#include <Keypad.h> #include<LiquidCrystal.h> #include<EEPROM.h>
const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char hexaKeys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad //initialize an instance of class NewKeypad Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
We have included LCD library for LCD interfacing and for interfacing EEPROM we have included library EEPROM.h., and then initialized variable and defined pins for components.
#define buzzer 15 LiquidCrystal lcd(13,12,11,10,9,8); char password[4]; char pass[4],pass1[4]; int i=0; char customKey=0;
And then we initialized LCD and give direction to pins in setup function
void setup() { lcd.begin(16,2); pinMode(led, OUTPUT); pinMode(buzzer, OUTPUT); pinMode(m11, OUTPUT); pinMode(m12, OUTPUT); lcd.print(" Electronic "); lcd.setCursor(0,1); lcd.print(" Keypad Lock "); delay(2000); lcd.clear(); lcd.print("Enter Ur Passkey:"); lcd.setCursor(0,1);
After this we read keypad in loop function
customKey = customKeypad.getKey(); if(customKey=='#') change(); if (customKey) { password[i++]=customKey; lcd.print(customKey); beep(); }
And then compare password with save password using string compare method.
if(i==4) { delay(200); for(int j=0;j<4;j++) pass[j]=EEPROM.read(j); if(!(strncmp(password, pass,4))) { digitalWrite(led, HIGH); beep(); lcd.clear(); lcd.print("Passkey Accepted"); delay(2000); lcd.setCursor(0,1); lcd.print("#.Change Passkey"); delay(2000); lcd.clear(); lcd.print("Enter Passkey:"); lcd.setCursor(0,1); i=0; digitalWrite(led, LOW); }
This is password change function and buzzer beep function
void change() { int j=0; lcd.clear(); lcd.print("UR Current Passk"); lcd.setCursor(0,1); while(j<4) { char key=customKeypad.getKey(); if(key) { pass1[j++]=key; lcd.print(key); void beep() { digitalWrite(buzzer, HIGH); delay(20); digitalWrite(buzzer, LOW); }
#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>
#define buzzer 15
LiquidCrystal lcd(13,12,11,10,9,8);
char password[4];
char pass[4],pass1[4];
int i=0;
char customKey=0;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6, 7}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void setup()
{
lcd.begin(16,2);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(m11, OUTPUT);
pinMode(m12, OUTPUT);
lcd.print(" Electronic ");
lcd.setCursor(0,1);
lcd.print(" Keypad Lock ");
delay(2000);
lcd.clear();
lcd.print("Enter Ur Passkey:");
lcd.setCursor(0,1);
for(int j=0;j<4;j++)
EEPROM.write(j, j+49);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
}
void loop()
{
customKey = customKeypad.getKey();
if(customKey=='#')
change();
if (customKey)
{
password[i++]=customKey;
lcd.print(customKey);
beep();
}
if(i==4)
{
delay(200);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
if(!(strncmp(password, pass,4)))
{
digitalWrite(led, HIGH);
beep();
lcd.clear();
lcd.print("Passkey Accepted");
delay(2000);
lcd.setCursor(0,1);
lcd.print("#.Change Passkey");
delay(2000);
lcd.clear();
lcd.print("Enter Passkey:");
lcd.setCursor(0,1);
i=0;
digitalWrite(led, LOW);
}
else
{
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Access Denied...");
lcd.setCursor(0,1);
lcd.print("#.Change Passkey");
delay(2000);
lcd.clear();
lcd.print("Enter Passkey:");
lcd.setCursor(0,1);
i=0;
digitalWrite(buzzer, LOW);
}
}
}
void change()
{
int j=0;
lcd.clear();
lcd.print("UR Current Passk");
lcd.setCursor(0,1);
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass1[j++]=key;
lcd.print(key);
beep();
}
key=0;
}
delay(500);
if((strncmp(pass1, pass, 4)))
{
lcd.clear();
lcd.print("Wrong Passkey...");
lcd.setCursor(0,1);
lcd.print("Better Luck Again");
delay(1000);
}
else
{
j=0;
lcd.clear();
lcd.print("Enter New Passk:");
lcd.setCursor(0,1);
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass[j]=key;
lcd.print(key);
EEPROM.write(j,key);
j++;
beep();
}
}
lcd.print(" Done......");
delay(1000);
}
lcd.clear();
lcd.print("Enter Ur Passk:");
lcd.setCursor(0,1);
customKey=0;
}
void beep()
{
digitalWrite(buzzer, HIGH);
delay(20);
digitalWrite(buzzer, LOW);
}