← All Projects

Biometrics Attendance System

30 viewsApril 3, 2026
fingerprintattendancebiometrics

Install Adafruit_Fingerprint library

Circuit Connections

ComponentPinPinComponent
Fingerprint Sensor3.33.3VArduino UNO
Fingerprint SensorGNDGNDArduino UNO
Fingerprint SensorRX3Arduino UNO
Fingerprint SensorTX2Arduino UNO
arduinosetup.ino
#include <Adafruit_Fingerprint.h>

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(2, 3);
#else
#define mySerial Serial1
#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  delay(100);
  
  // Rebranded initialization
  Serial.println("\n\n@itzbandhan Fingerprint System");

  finger.begin(57600);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  finger.getParameters();
}

uint8_t readnumber(void) {
  uint8_t num = 0;
  while (num == 0) {
    while (!Serial.available());
    num = Serial.parseInt();
  }
  return num;
}

void loop() 
{
  Serial.println("Ready to enroll! (@itzbandhan)");
  Serial.println("Type the ID # (1 to 127) to save this finger...");
  id = readnumber();
  if (id == 0) return;
  
  Serial.print("Enrolling ID #");
  Serial.println(id);

  while (!getFingerprintEnroll());
}

uint8_t getFingerprintEnroll() {
  int p = -1;
  Serial.print("Waiting for valid finger for #");
  Serial.println(id);
  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;
    }
  }

  p = finger.image2Tz(1);
  if (p != FINGERPRINT_OK) return p;

  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) { p = finger.getImage(); }
  
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    if (p == FINGERPRINT_OK) Serial.println("Image taken");
    else if (p == FINGERPRINT_NOFINGER) Serial.print(".");
  }

  p = finger.image2Tz(2);
  if (p != FINGERPRINT_OK) return p;

  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else return p;

  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored by @itzbandhan!");
  } else return p;

  return true;
}
Now, compile and run the below code after setting up fingerprints.
arduinocode.ino
#include <Adafruit_Fingerprint.h>

// Software Serial setup for Uno/Nano/ESP8266
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
SoftwareSerial mySerial(2, 3);
#else
#define mySerial Serial1
#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// ANSI Escape Codes for Colors (Works in IDE 2.0+)
#define CLR_RESET  "\e[0m"
#define CLR_GREEN  "\e[32m"
#define CLR_RED    "\e[31m"
#define CLR_CYAN   "\e[36m"
#define CLR_YELLOW "\e[33m"

void setup() {
  Serial.begin(9600);
  while (!Serial); 
  delay(100);
  
  Serial.println(F("------------------------------------"));
  Serial.println(F("@itzbandhan"));
  Serial.println(F("------------------------------------"));

  finger.begin(57600);
  if (finger.verifyPassword()) {
    Serial.println(F("Found fingerprint sensor!"));
  } else {
    Serial.println(CLR_RED "Did not find fingerprint sensor :(" CLR_RESET);
    while (1) { delay(1); }
  }

  finger.getTemplateCount();
  if (finger.templateCount == 0) {
    Serial.println(CLR_YELLOW "Sensor is empty. Please enroll a finger first." CLR_RESET);
  } else {
    Serial.print(F("Sensor contains "));
    Serial.print(finger.templateCount);
    Serial.println(F(" templates."));
    Serial.println(F("Waiting for valid finger..."));
  }
}

void loop() {
  getFingerprintID();
  delay(50); // Small delay to prevent CPU hogging
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  
  // We return immediately if no finger is on the sensor 
  // This prevents the "No finger detected" spam.
  if (p == FINGERPRINT_NOFINGER) return p; 

  if (p != FINGERPRINT_OK) {
    Serial.println(CLR_RED "Imaging Error" CLR_RESET);
    return p;
  }

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK) {
    Serial.println(CLR_RED "Messy Image - Try Again" CLR_RESET);
    return p;
  }

  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK) {
    // SUCCESS BLOCK
    Serial.println(F("------------------------------------"));
    Serial.print(CLR_GREEN "MATCH FOUND! ID #" );
    Serial.print(finger.fingerID);
    Serial.print(" Confidence: ");
    Serial.print(finger.confidence);
    Serial.println(CLR_RESET);
    
    Serial.println(CLR_GREEN ">>> ATTENDANCE RECORDED <<<" CLR_RESET);
    Serial.println(F("------------------------------------"));
    
    // Simple lock-out delay so one touch doesn't record attendance 10 times
    delay(2000); 
  } else if (p == FINGERPRINT_NOTFOUND) {
    // WRONG ID BLOCK
    Serial.println(CLR_RED "ACCESS DENIED: Fingerprint Not Recognized" CLR_RESET);
    delay(1000);
  } else {
    Serial.println(CLR_RED "Communication Error" CLR_RESET);
  }

  return p;
}