Created
March 26, 2025 00:53
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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