Download Fingerprint and Keypad Libraries
- Download the Adafruit Fingerprint Sensor Library and install it according to the instructions in readme.txt.
- Download the Keypad Library and install according to the instructions here.
Enroll Fingers
- Load the "enroll" example into the Arduino IDE.
- Change the mySerial pin definitions to: "SoftwareSerial mySerial(13, 12);"
- Follow the tutorial for enrolling fingerprints.
Load code
- Load the Biometric Box sketch at the bottom of this page.
- Edit the "secretCode" string to define your passcode.
- Compile and upload the sketch.
Test the Latch Operation
- Power on the box - the led on the power switch should flash a few times, then start to 'breathe'.
- Enter your passcode - the fingerprint sensor should turn on and glow red.
- Place your finger on the sensor and you should hear the solenoid click.
/***************************************************
Biometric Box Sketch for the optical Fingerprint sensor
This sketch implements a two-level security scheme requiring the
user to enter a passcode via the keypad before scanning a fingerprint
for access.
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Bill Earl for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
#include <Keypad.h>
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
// Define the states for the lock state machine
#define LOCKED 2
#define PASSWORD_OK 1
#define UNLOCKED 0
// State Variables: Initialize to the locked state
int LockState = LOCKED;
long StartTime = 0;
int position = 0;
// Define your password key sequence here
char* secretCode = "1423";
// Keypad key matrix:
const byte rows = 4;
const byte cols = 3;
char keys[rows][cols] =
{
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
// Keypad pin definitions
byte rowPins[rows] = {2, 3, 4, 5};
byte colPins[cols] = {6, 7, 8};
// Instantiate the keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// More pin definitions:
int LedPin = 10;
int SolenoidPin = 11;
// Define a Fingerprint sensor on pins 12 & 13
int getFingerprintIDez();
SoftwareSerial mySerial(13, 12);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
pinMode(LedPin, OUTPUT);
pinMode(SolenoidPin, OUTPUT);
// Flash hello
for (int i = 0; i < 3; i++)
{
digitalWrite(LedPin, HIGH);
delay(100);
digitalWrite(LedPin, LOW);
delay(100);
}
// Initialize state and communicatins
setLockState(LOCKED);
Serial.begin(9600);
finger.begin(57600);
// Connect to the sensor
if (finger.verifyPassword())
{
Serial.println("Found fingerprint sensor!");
}
else
{
Serial.println("Did not find fingerprint sensor :(");
while (1);
}
}
void loop()
{
// Run the state machine:
// Locked State - Monitor keypad for valid Password code entry
if (LockState == LOCKED)
{
char key = keypad.getKey();
if (key == '*' || key == '#')
{
position = 0;
setLockState(LOCKED);
}
if (key != 0)
{
if (key == secretCode[position]) // Valid key in Password sequence
{
Serial.print("Matched ");
Serial.print(key);
Serial.print("-at-");
Serial.println(position);
position ++;
}
else // Invalid key - start all over again
{
Serial.println("Invalid Code!");
position = 0;
}
}
// Let the LED 'breathe' while we wait
analogWrite(LedPin, sin((millis() % 3142) / 1000.0) * 255);
if (position == 4) // Password successfully entered - advance state
{
setLockState(PASSWORD_OK);
position = 0;
}
delay(100);
}
// PASSWORD_OK state - Now wait for a valid fingerprint reading
else if (LockState == PASSWORD_OK)
{
if (getFingerprintIDez() != -1)
{
setLockState(UNLOCKED); // Valid fingerprint - advance state to UNLOCKED
}
if (millis () - StartTime > 5000)
{
setLockState (LOCKED); // Time-out - go back to the LOCKED state
}
}
// UNLOCKED state - hold the solenoid open for a limited time
else if (LockState == UNLOCKED)
{
for (int i = 0; i < 30; i++)
{
// Flash the led to indicate the lock is open
digitalWrite(LedPin, LOW);
delay(50);
digitalWrite(LedPin, HIGH);
delay(50);
}
setLockState (LOCKED); // Time-out - go back to the locked state.
}
}
// 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);
return finger.fingerID;
}
// Set the state and the time of the state change
void setLockState(int state)
{
LockState = state;
StartTime = millis ();
if (state == LOCKED)
{
Serial.println("Locked!");
digitalWrite(LedPin, HIGH);
digitalWrite(SolenoidPin, LOW);
}
else if (state == PASSWORD_OK)
{
Serial.println("PASSWORD_OK!");
digitalWrite(LedPin, LOW);
}
else if (state == UNLOCKED)
{
Serial.println("Unlocked!");
digitalWrite(LedPin, LOW);
digitalWrite(SolenoidPin, HIGH);
}
}
Page last edited August 14, 2012
Text editor powered by tinymce.