In this project, we are going to build a fingerprint door lock security system using Arduino. This system can be used in our homes, offices, etc. to provide security. We can also use this to open the door by just placing our finger on the door lock.
Security is a top priority for many homeowners. fingerprint door locks security system is a great way to add an extra layer of security to your home. this door lock system uses a fingerprint reader to unlock the door. the fingerprint reader is connected to an Arduino microcontroller board.
Required Material
- Arduino board
- R307 fingerprint sensor module
- I2C 16×2 LCD Module
- Solenoid Lock
- Jumper wires
- Breadboard
- 9V battery (optional)
- USB cable
R307 fingerprint sensor module
The R307 fingerprint sensor module is a low-cost biometric fingerprint reader module that can be easily interfaced with microcontrollers like Arduino/Raspberry Pi.
With its built-in fingerprint recognition algorithm, it can also be easily programmed with only a few lines of code to match, verify, search, or store fingerprint prints. Check out our last post – Interfacing R307 Fingerprint Sensor With Arduino
R307 fingerprint sensor module Pinout
R307 fingerprint sensor module Specs
Here are some specifications of the R307 fingerprint sensor
- Interface: UART(TTL)
- Operating voltage: 3.6V – 6.0V DC
- Fingerprint image resolution: 500dpi
- False acceptance rate (FAR): <0.001% (security level 3)
- False rejection rate (FRR): <1.0% (security level 3)
- Identification speed: <0.5s
- Template storage capacity: up to 1000 templates
- Operating temperature: -20°C to +50°C
- Operating humidity: 40% RH – 85% RH
- Dimensions: 54mm x 20mm x 22mm
Schematic Diagram –Â Fingerprint Door Lock Security Systems Using Arduino & LCD
Connect the fingerprint sensor to the Arduino board as follows:
- VCC pin to 5V pin on the Arduino
- GND pin to GND pin on the Arduino
- TX pin to digital pin D2 on the Arduino
- RX pin to digital pin D3 on the Arduino
- Relay Pin D4
- LCD SDA -> Arduino Analog Pin 4
- LCD SCL -> Arduino Analog Pin 5
- LCD VCC -> Arduino 5V
- LCD GND -> Arduino GND
Code & library
First, download the Adafruit Fingerprint library from the Arduino IDE Library Manager. check out this tutorial Fingerprint Sensor With Arduino
Open the Arduino IDE, go to File > Examples > Adafruit Fingerprint > enroll. and Upload the code to your Arduino.
Enroll Code – R307 Fingerprint Sensor
Here’s the sample code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
#include <Adafruit_Fingerprint.h> #if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__) // For UNO and others without hardware serial, we must use software serial... // pin #2 is IN from sensor (GREEN wire) // pin #3 is OUT from arduino (WHITE wire) // Set up the serial port to use softwareserial.. SoftwareSerial mySerial(2, 3); #else // On Leonardo/M0/etc, others with hardware serial, use hardware serial! // #0 is green wire, #1 is white #define mySerial Serial1 #endif Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); uint8_t id; void setup() { Serial.begin(9600); while (!Serial); // For Yun/Leo/Micro/Zero/... delay(100); Serial.println("\n\nAdafruit Fingerprint sensor enrollment"); // set the data rate for the sensor serial port finger.begin(57600); if (finger.verifyPassword()) { Serial.println("Found fingerprint sensor!"); } else { Serial.println("Did not find fingerprint sensor :("); while (1) { delay(1); } } Serial.println(F("Reading sensor parameters")); finger.getParameters(); Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX); Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX); Serial.print(F("Capacity: ")); Serial.println(finger.capacity); Serial.print(F("Security level: ")); Serial.println(finger.security_level); Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX); Serial.print(F("Packet len: ")); Serial.println(finger.packet_len); Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate); } uint8_t readnumber(void) { uint8_t num = 0; while (num == 0) { while (! Serial.available()); num = Serial.parseInt(); } return num; } void loop() // run over and over again { Serial.println("Ready to enroll a fingerprint!"); Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as..."); id = readnumber(); if (id == 0) {// ID #0 not allowed, try again! return; } Serial.print("Enrolling ID #"); Serial.println(id); while (! getFingerprintEnroll() ); } uint8_t getFingerprintEnroll() { int p = -1; Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id); while (p != FINGERPRINT_OK) { p = finger.getImage(); switch (p) { case FINGERPRINT_OK: Serial.println("Image taken"); break; case FINGERPRINT_NOFINGER: Serial.println("."); break; case FINGERPRINT_PACKETRECIEVEERR: Serial.println("Communication error"); break; case FINGERPRINT_IMAGEFAIL: Serial.println("Imaging error"); break; default: Serial.println("Unknown error"); break; } } // OK success! p = finger.image2Tz(1); 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; } Serial.println("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"); 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"); break; } } // 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; } Serial.print("ID "); Serial.println(id); p = finger.storeModel(id); if (p == FINGERPRINT_OK) { Serial.println("Stored!"); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { Serial.println("Communication error"); return p; } else if (p == FINGERPRINT_BADLOCATION) { Serial.println("Could not store in that location"); return p; } else if (p == FINGERPRINT_FLASHERR) { Serial.println("Error writing to flash"); return p; } else { Serial.println("Unknown error"); return p; } return true; } |
Open the Serial Monitor to see messages.
Source code for Fingerprint door lock system
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
#include <Adafruit_Fingerprint.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> SoftwareSerial mySerial(2, 3); //Serial Communications LiquidCrystal_I2C lcd(0x27, 16, 2); Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); #define Relay 4 void setup() { lcd.init(); lcd.backlight(); finger.begin(57600); pinMode(Relay, OUTPUT); digitalWrite(Relay, LOW); delay(5); if (finger.verifyPassword()) { lcd.setCursor(0,0); lcd.print(" Finger Print "); lcd.setCursor(0, 1); lcd.print("Sensor Connected"); delay (3000); } else { lcd.setCursor(0,0); lcd.print("Unable to found "); lcd.setCursor(0,1); lcd.print("Sensor"); delay(2000); lcd.setCursor(0, 0); lcd.print("Please Check "); lcd.setCursor(0,1); lcd.print(" Sensor Wiring "); while (1) { delay(1); } } } void loop() { lcd.setCursor(0,0); lcd.print("Place finger..."); lcd.setCursor(0,1); lcd.print(" start scan "); getFingerprintID(); delay(50); //don't ned to run this at full speed. } uint8_t getFingerprintID() { uint8_t p = finger.getImage(); if(p == FINGERPRINT_NOFINGER){ return p; } else if(p != FINGERPRINT_OK){ lcd.setCursor(0,0); lcd.print("Scan Error "); lcd.setCursor(0,1); delay(2000); return p; } p = finger.image2Tz(); if(p != FINGERPRINT_OK){ lcd.setCursor(0,0); lcd.print("Processing Error"); lcd.setCursor(0,1); lcd.print(" Try Again "); return p; } p = finger.fingerSearch(); if (p == FINGERPRINT_OK) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Door Unlocked"); lcd.setCursor(0, 1); lcd.print(" Welcome"); digitalWrite(Relay,HIGH); delay(5000); } else if (p == FINGERPRINT_PACKETRECIEVEERR) { lcd.setCursor(0,0); lcd.print("Comm Error "); lcd.setCursor(0,1); lcd.print(" "); delay(2000); return p; } else if (p == FINGERPRINT_NOTFOUND) { lcd.setCursor(0,0); lcd.print("Access Denied "); lcd.setCursor(0,1); lcd.print(" "); delay(2000); return p; } else { lcd.setCursor(0,0); lcd.print("Error in matching"); lcd.setCursor(0,1); lcd.print("Not Valid Finger"); delay(2000); return p; } digitalWrite(Relay,LOW); return finger.fingerID; } |
Conclusion