Biometric Security System Using Arduino and Fingerprint Sensor
Biometric Security System Using Arduino and Fingerprint Sensor
Security is a major concern in our day to day life, and digital locks have become an important
part of these security systems. There are many types of security systems available to secure our
place. Some examples are PIR based Security System, RFID based Security System, Digital
Lock System, bio-matrix systems, Electronics Code lock. In this post, we will Interface a
Fingerprint Sensor Module with Arduino and will build a Fingerprint based Biometric
Security System with door locking. Finger Print is considered one of the safest key to lock or
unlock any system as it can recognize any person uniquely and can’t be copied easily.
Components Required:
1. Arduino Uno
2. Finger Print Module
3. Push Button -4
4. LEDs -2
5. 1K Resistor -3
6. 2.2K resistor -1`
7. Power Supply
8. Connecting wires
9. Cardboard Box
10. Servo Motor -1
11. 16x2 LCD -1
12. Bread Board -1
Finger Print Sensor Module or Finger Print Scanner is a module which captures finger’s
print image and then converts it into the equivalent template and saves them into its memory on
selected ID (location) by Arduino. Here all the process is commanded by Arduino like taking an
image of finger print, convert it into templates and storing location etc.
In this Arduino Fingerprint Sensor Project, we have used Fingerprint Sensor Module to take
finger or thumb impression as input in the system. Here we are using 4 push buttons to
Enroll/back, Delete/OK, UP and Down. Every key has double features. Enroll key is used for
enrolling new finger impression into the system and back function as well. Means when the user
wants to enroll new finger then he/she needs to press enroll key then LCD asks for the ID or
Location where user wants to store the finger print output. Now if at this time user do not want to
proceed further then he/she can press enroll key again to go back (this time enroll key behave as
Back key). Means enroll key has both enrollment and back function. DEL/OK key also has
same double function like when user enrolls new finger then he/she need to select finger ID or
Location by using another two key namely UP/MATCH AND DOWN/MATCH (which also has
double function) now user needs to press DEL/OK key (this time this key behaves like OK) to
proceed with selected ID or Location. UP/DOWN keys also support Finger print match function.
Check the Video at the end for full demonstration.
Here we have also attached a cardboard box with a Servo Motor to act as a security gate, which
will only open when the system will read correct Finger Print. Yellow LED indicates gate is
closed and Green LED indicates gate is opened.
Working Explanation:
Working of this Fingerprint Sensor Door Lock is easy. In this project, we have used a gate that
will be open when we place stored finger at the finger print module. First of all, the user needs to
enroll finger with the help of push button/keys. To do this user need to press ENROLL key and
then LCD asks for entering location/ID where finger will be a store. So now user needs to enter
ID (Location) by using UP/DOWN keys. After selecting Location/ID user needs to press an OK
key (DEL key). Now LCD will ask for placing finger over the finger print module. Now user
needs to put his finger over finger print module. Then LCD will ask to remove the finger from
finger print module and again ask for placing the finger. Now user needs to put his finger again
over finger print module. Now finger print module takes an image and converts it into templates
and stores it by selected ID in to the finger print module’s memory. Now user can open the gate
by placing the same finger that he/she have added or enrolled into the system and then press
MATCH key (UP/Down key). By the same method, the user can add more fingers. Check the
Video below for full demonstration.
Now if the user wants to remove or delete any of stored ID then he/she need to press DEL key,
after pressing DEL key, LCD will ask for select location means select ID that to be deleted. Now
user needs to select ID and press OK key (same DEL key). Now LCD will let you know that
finger has been deleted successfully. Now the user may check it was deleted or not by placing
the same finger over the finger print module and pressing MATCH key (UP/Down key).
When placed finger will be valid Green LED will glow for five second and gate also opens at the
same time. After 5-seconds gate will be closed automatically. The user may customize gate/door
opening and closing according to their requirement. Servo motor is responsible for open and
closing of the gate.
Circuit Explanation:
The circuit of this Arduino Fingerprint Security System is very simple which contains
Arduino which controls whole the process of the project, push button, buzzer, and LCD. Arduino
controls the complete processes.
Note: here D14, D15, D16, D17 are A0, A1, A2, A3 respectively.
Program Explanation:
In a program, we have used Adafruit Fingerprint Sensor Library for interfacing fingerprint
module with Arduino board. You can check the complete Code below, it can be easily
understood. Here we are explaining main functions of the Arduino Program.
Below piece of code is used to take Finger Print as input and take action according to validation
of finger. If finger will be validated gate will be open otherwise remain closed.
for(int i=0;i<5;i++)
{
lcd.clear();
lcd.print("Place Finger");
delay(2000);
int result=getFingerprintIDez();
if(result>=0)
{
digitalWrite(openLight, HIGH);
digitalWrite(closeLight, LOW);
lcd.clear();
lcd.print("Allowed");
lcd.setCursor(0,1);
lcd.print("Gete Opened ");
myServo.write(0);
delay(5000);
myServo.write(180);
digitalWrite(closeLight, HIGH);
digitalWrite(openLight, LOW);
lcd.setCursor(0,1);
lcd.print("Gate Closed ");
Given void checkKeys() function is used for checking Enroll or DEL key is pressed or not and
what to do if pressed. If the ENROL key pressed the Enroll() function is called and DEL key
press then delete() function is called.
void checkKeys()
{
if(digitalRead(enroll) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
while(digitalRead(enroll) == 0);
Enroll();
}
else if(digitalRead(del) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
delet();
}
}
Given function is used for entering ID to be deleted and calling uint8_t deleteFingerprint(uint8_t
id) function that will delete finger from records.
void delet()
{
int count=0;
lcd.clear();
lcd.print("Delete Finger ");
lcd.setCursor(0,1);
lcd.print("Location:");
while(1)
{
lcd.setCursor(9,1);
lcd.print(count);
if(digitalRead(up) == 0)
{
count++;
if(count>25)
count=0;
delay(500);
}
.... .....
..... .....
Given function is used for delete finger print from the record of selected ID.
else
{
Serial.print("Something Wrong");
lcd.clear();
lcd.print("Something Wrong");
lcd.setCursor(0,1);
lcd.print("Try Again Later");
delay(2000);
return p;
}
}
Given Function is used to taking finger print image and convert them into the template and save
it by selected ID into the finger print module memory.
uint8_t getFingerprintEnroll()
{
int p = -1;
lcd.clear();
lcd.print("finger ID:");
lcd.print(id);
lcd.setCursor(0,1);
lcd.print("Place Finger");
delay(2000);
while (p != FINGERPRINT_OK)
{
p = finger.getImage();
..... .....
....... ....
So that is how we can use Arduino with Finger Print Reader Module for Security System.
Code
#include<LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);
#include <SoftwareSerial.h>
SoftwareSerial fingerPrint(2, 3);
#include<Servo.h>
Servo myServo;
#include <Adafruit_Fingerprint.h>
uint8_t id;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);
#define enroll 14
#define del 15
#define up 16
#define down 17
#define openLight 6
#define closeLight 7
#define servoPin 5
void setup()
{
delay(1000);
myServo.attach(servoPin);
myServo.write(180);
pinMode(enroll, INPUT_PULLUP);
pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
pinMode(del, INPUT_PULLUP);
pinMode(openLight, OUTPUT);
pinMode(closeLight, OUTPUT);
lcd.begin(16,2);
lcd.print("Security System");
lcd.setCursor(0,1);
lcd.print("by Finger Print");
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("Saddam Khan");
delay(2000);
finger.begin(57600);
Serial.begin(9600);
lcd.clear();
lcd.print("Finding Module");
lcd.setCursor(0,1);
delay(1000);
if (finger.verifyPassword())
{
Serial.println("Found fingerprint sensor!");
lcd.clear();
lcd.print("Found Module ");
delay(1000);
}
else
{
Serial.println("Did not find fingerprint sensor :(");
lcd.clear();
lcd.print("module not Found");
lcd.setCursor(0,1);
lcd.print("Check Connections");
while (1);
}
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("Press UP/Down ");
lcd.setCursor(0,1);
lcd.print("to start System");
digitalWrite(closeLight, HIGH);
if(digitalRead(up)==0 || digitalRead(down)==0)
{
for(int i=0;i<5;i++)
{
lcd.clear();
lcd.print("Place Finger");
delay(2000);
int result=getFingerprintIDez();
if(result>=0)
{
digitalWrite(openLight, HIGH);
digitalWrite(closeLight, LOW);
lcd.clear();
lcd.print("Allowed");
lcd.setCursor(0,1);
lcd.print("Gete Opened ");
myServo.write(0);
delay(5000);
myServo.write(180);
digitalWrite(closeLight, HIGH);
digitalWrite(openLight, LOW);
lcd.setCursor(0,1);
lcd.print("Gate Closed ");
return;
}
}
}
checkKeys();
delay(1000);
}
void checkKeys()
{
if(digitalRead(enroll) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
while(digitalRead(enroll) == 0);
Enroll();
}
else if(digitalRead(del) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
delet();
}
}
void Enroll()
{
int count=0;
lcd.clear();
lcd.print("Enroll Finger ");
lcd.setCursor(0,1);
lcd.print("Location:");
while(1)
{
lcd.setCursor(9,1);
lcd.print(count);
if(digitalRead(up) == 0)
{
count++;
if(count>25)
count=0;
delay(500);
}
else if(digitalRead(down) == 0)
{
count--;
if(count<0)
count=25;
delay(500);
}
else if(digitalRead(del) == 0)
{
id=count;
getFingerprintEnroll();
return;
}
else if(digitalRead(enroll) == 0)
{
return;
}
}
}
void delet()
{
int count=0;
lcd.clear();
lcd.print("Delete Finger ");
lcd.setCursor(0,1);
lcd.print("Location:");
while(1)
{
lcd.setCursor(9,1);
lcd.print(count);
if(digitalRead(up) == 0)
{
count++;
if(count>25)
count=0;
delay(500);
}
else if(digitalRead(down) == 0)
{
count--;
if(count<0)
count=25;
delay(500);
}
else if(digitalRead(del) == 0)
{
id=count;
deleteFingerprint(id);
return;
}
else if(digitalRead(enroll) == 0)
{
return;
}
}
}
uint8_t getFingerprintEnroll()
{
int p = -1;
lcd.clear();
lcd.print("finger ID:");
lcd.print(id);
lcd.setCursor(0,1);
lcd.print("Place Finger");
delay(2000);
while (p != FINGERPRINT_OK)
{
p = finger.getImage();
switch (p)
{
case FINGERPRINT_OK:
Serial.println("Image taken");
lcd.clear();
lcd.print("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No Finger");
lcd.clear();
lcd.print("No Finger");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
lcd.clear();
lcd.print("Comm Error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
lcd.clear();
lcd.print("Imaging Error");
break;
default:
Serial.println("Unknown error");
lcd.clear();
lcd.print("Unknown Error");
break;
}
}
// OK success!
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
lcd.clear();
lcd.print("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
lcd.clear();
lcd.print("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
lcd.clear();
lcd.print("Comm Error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
lcd.clear();
lcd.print("Feature Not Found");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
lcd.clear();
lcd.print("Feature Not Found");
return p;
default:
Serial.println("Unknown error");
lcd.clear();
lcd.print("Unknown Error");
return p;
}
Serial.println("Remove finger");
lcd.clear();
lcd.print("Remove Finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
lcd.clear();
lcd.print("Place Finger");
lcd.setCursor(0,1);
lcd.print(" Again");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
return;
}
}
// OK success!
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
Serial.print("Creating model for #"); Serial.println(id);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("Fingerprints did not match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
int getFingerprintIDez()
{
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK)
return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK)
return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK)
{
lcd.clear();
lcd.print("Finger Not Found");
lcd.setCursor(0,1);
lcd.print("Try Later");
delay(2000);
return -1;
}
// found a match!
Serial.print("Found ID #");
Serial.print(finger.fingerID);
return finger.fingerID;
}
else
{
Serial.print("Something Wrong");
lcd.clear();
lcd.print("Something Wrong");
lcd.setCursor(0,1);
lcd.print("Try Again Later");
delay(2000);
return p;
}
}
+++++