0

$USD

$USD
PROJECTS Arduino

How to make a Fingerprint Guarded Box

DFRobot Apr 22 2019 1116

Use DFRobot's UART fingerprint scanner to store fingerprints and only allow authorized people to access the box.


Things used in this project
Hardware components
DFRobot Fingerprint Sensor
DFRobot Particle Photon
5mm LED
Software apps and online services
Particle Build Web IDE

Story

Idea
Whether it’s some nosey siblings or a roommate who just won’t stay out of your stuff, being able to store items securely and then using biometrics to unlock them is a great idea.


For this project, DFRobot reached out to me and gave me their UART Fingerprint Reader.


Wiring
The wiring for this project is quite simple. First, the fingerprint sensor needs to be connected to the Photon via its UART pins. The white wire goes to Tx and the green one goes to Rx. Next, the two LEDs get connected to pins 2 and 3, along with their grounds.


Enrolling
For the fingerprint to be recognized, it must first get enrolled. This stores the image in the sensor’s onboard storage. To do that, I loaded up the enroll.ino sketch on the Particle Cloud IDE and uploaded it to the Photon.


Next, I opened the serial monitor and reset the Photon, where I placed and removed my finger several times on the sensor, and where I was then prompted to save it with an ID.


Usage
Now that my fingerprint had been stored, I uploaded the attached sketch and ran it. It constantly checks if a finger has been placed, and if it has, read it.


Next, it tries to recognize the print and ID it. If it matches the correct ID, the light changes to green and the box unlocks.


Schematics


Code

#include "Adafruit_Fingerprint.h"

int getFingerprintIDez();

const int red_led_pin = 2, green_led_pin = 3;

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);

void setup()  
{
  Serial.begin(9600);

  // 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);
  }
  Serial.println("Waiting for valid finger...");
  pinMode(red_led_pin, OUTPUT);
  pinMode(green_led_pin, OUTPUT);
  digitalWrite(red_led_pin, 1);
  digitalWrite(green_led_pin, 0);
}

void loop()                     // run over and over again
{
  getFingerprintIDez();
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  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!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence); 
}

// returns -1 if failed, otherwise returns ID #
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)  return -1;
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  digitalWrite(green_led_pin, 1);
  digitalWrite(red_led_pin, 0);
  delay(6000);
  digitalWrite(green_led_pin, 0);
  digitalWrite(red_led_pin, 1);
  return finger.fingerID; 
}