Skip to content

Instantly share code, notes, and snippets.

@cyrusmeh
Created March 26, 2025 00:53
Show Gist options
  • Select an option

  • Save cyrusmeh/512553352e5cdc93f4b667b125411b13 to your computer and use it in GitHub Desktop.

Select an option

Save cyrusmeh/512553352e5cdc93f4b667b125411b13 to your computer and use it in GitHub Desktop.
In this exciting project, I will guide you through the process of creating a fingerprint-activated device that controls multiple LEDs using an Arduino Nano. This device can identify fingerprints and turn on or off one or several LEDs based on the recognized fingerprint.
#include <Adafruit_Fingerprint.h>
#define FINGERPRINT_TX 2
#define FINGERPRINT_RX 3
#define ROCKER_SWITCH_ENROLL 8
#define ROCKER_SWITCH_CLEAR 11
#define LED_RED 9
#define LED_GREEN 10
// Additional LEDs for fingerprint ID indication
#define LED_1 4
#define LED_2 5
#define LED_3 6
#define LED_4 7
#define LED_5 12
SoftwareSerial mySerial(FINGERPRINT_TX, FINGERPRINT_RX);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
const int MAX_FINGERPRINTS = 130;
void setup() {
Serial.begin(115200);
pinMode(ROCKER_SWITCH_ENROLL, INPUT_PULLUP);
pinMode(ROCKER_SWITCH_CLEAR, INPUT_PULLUP);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
// Initialize additional LEDs
pinMode(LED_1, OUTPUT);
pinMode(LED_2, OUTPUT);
pinMode(LED_3, OUTPUT);
pinMode(LED_4, OUTPUT);
pinMode(LED_5, OUTPUT);
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Fingerprint sensor found!");
} else {
Serial.println("Fingerprint sensor not detected!");
while (1);
}
}
void loop() {
if (digitalRead(ROCKER_SWITCH_CLEAR) == HIGH) {
clearAllFingerprints();
} else if (digitalRead(ROCKER_SWITCH_ENROLL) == HIGH) {
enrollFingerprint();
} else {
verifyFingerprint();
}
}
// Function to find the next available fingerprint ID
int getNextAvailableID() {
for (int id = 1; id <= MAX_FINGERPRINTS; id++) {
if (finger.loadModel(id) != FINGERPRINT_OK) {
return id;
}
}
return -1;
}
void enrollFingerprint() {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.println("Enrollment mode ON");
int id = getNextAvailableID();
if (id == -1) {
Serial.println("Memory full! Cannot store more fingerprints.");
return;
}
Serial.print("Enrolling Fingerprint ID: ");
Serial.println(id);
Serial.println("Place finger...");
while (finger.getImage() != FINGERPRINT_OK) {
if (digitalRead(ROCKER_SWITCH_ENROLL) == LOW) return;
if (digitalRead(ROCKER_SWITCH_CLEAR) == HIGH) return;
}
Serial.println("Image taken");
if (finger.image2Tz(1) != FINGERPRINT_OK) {
Serial.println("Failed to process first image.");
return;
}
Serial.println("Remove finger...");
delay(2000);
if (digitalRead(ROCKER_SWITCH_ENROLL) == LOW) return;
if (digitalRead(ROCKER_SWITCH_CLEAR) == HIGH) return;
Serial.println("Place the same finger again...");
while (finger.getImage() != FINGERPRINT_OK) {
if (digitalRead(ROCKER_SWITCH_ENROLL) == LOW) return;
if (digitalRead(ROCKER_SWITCH_CLEAR) == HIGH) return;
}
Serial.println("Image taken again");
if (finger.image2Tz(2) != FINGERPRINT_OK) {
Serial.println("Failed to process second image.");
return;
}
if (finger.createModel() != FINGERPRINT_OK) {
Serial.println("Error creating fingerprint model.");
return;
}
if (finger.storeModel(id) != FINGERPRINT_OK) {
Serial.println("Error storing fingerprint.");
return;
}
Serial.print("Fingerprint stored at ID: ");
Serial.println(id);
delay(2000);
}
void verifyFingerprint() {
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
Serial.println("Verification mode ON");
// Turn OFF all ID indicator LEDs
digitalWrite(LED_1, LOW);
digitalWrite(LED_2, LOW);
digitalWrite(LED_3, LOW);
digitalWrite(LED_4, LOW);
digitalWrite(LED_5, LOW);
if (finger.getImage() == FINGERPRINT_OK) {
Serial.println("Finger detected!");
if (finger.image2Tz(1) == FINGERPRINT_OK) {
if (finger.fingerFastSearch() == FINGERPRINT_OK) {
Serial.print("Fingerprint found! ID: ");
Serial.println(finger.fingerID);
// Turn ON the corresponding LED for identified ID
if (finger.fingerID == 1) {
digitalWrite(LED_1, HIGH);
delay(5000);
digitalWrite(LED_1, LOW);
} else if (finger.fingerID == 2) {
digitalWrite(LED_2, HIGH);
delay(5000);
digitalWrite(LED_2, LOW);
} else if (finger.fingerID == 3) {
digitalWrite(LED_3, HIGH);
delay(5000);
digitalWrite(LED_3, LOW);
} else if (finger.fingerID == 4) {
digitalWrite(LED_4, HIGH);
delay(5000);
digitalWrite(LED_4, LOW);
} else if (finger.fingerID == 5) {
digitalWrite(LED_5, HIGH);
delay(5000);
digitalWrite(LED_5, LOW);
}
return;
} else {
Serial.println("Fingerprint not found!");
}
}
}
}
// Function to clear all stored fingerprints
void clearAllFingerprints() {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
Serial.println("Clearing all fingerprints...");
if (finger.emptyDatabase() == FINGERPRINT_OK) {
Serial.println("All fingerprints cleared successfully!");
} else {
Serial.println("Failed to clear fingerprints!");
}
delay(2000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment