cfulford
Created April 2, 2019

Fingerprint Attendance Project

Utilize the fingerprint module and store the information on an SD card with the date,time, and temp.

IntermediateWork in progress16
Fingerprint Attendance Project

Things used in this project

Story

Read more

Code

code for attendance project

C/C++
Description in the header
 Final Project - Fingerprint Attendance 
 RTC on SCL/SDA Lines
 SD Card on SPI Interface
 LCD Screen Nominal Pinout - except chip select(en) is 10 for SPI Interface
 Fingerprint on DI 2 and 3
 
  
 */

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <DS3231_Simple.h>

#include <SPI.h>
#include <SD.h>

//Declare a file object for the SD card 

File myFile;



DS3231_Simple Clock;
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);


const int rs = 9, en = 10, d4 = 8, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

//Int values for the RTC module 

 int hr ;
 int mn ;
 int sc ;
 int yr ;
 int mnt ;
 int dy ;
 byte rtcTemp;


//Standard issued finger print function 

int getFingerprintIDez();  // Function declaraton. This calls the get.finger object from the Adafruit library 

int fingerPrintID ;   // Set this to 0 for a place holder
boolean mainUser;  // This is a true / false for showing the main user 

String userID = " ";
int confidence;


void dispDateAndTime()
{
  DateTime MyDateAndTime;
  
  lcd.clear();
  MyDateAndTime = Clock.read();

 hr = MyDateAndTime.Hour;
 mn = MyDateAndTime.Minute;
 sc = MyDateAndTime.Second;
 yr = MyDateAndTime.Year;
 mnt = MyDateAndTime.Month;
 dy = MyDateAndTime.Day;
 rtcTemp = Clock.getTemperature();

    
    lcd.setCursor(0,0);
    lcd.print("TIME - HH:MM:SS");
    lcd.setCursor(0,1);
    lcd.print("DATE - DDMMYY");
    delay(1000);
    lcd.clear();

    lcd.setCursor(0,0);
    if (hr < 10) lcd.print("0");
    lcd.print(hr);
    lcd.setCursor(2,0);
    lcd.print(":");
    lcd.setCursor(3,0);
    if (mn < 10) lcd.print("0");
    lcd.print(mn);
    lcd.setCursor(5,0);
    lcd.print(":");
    lcd.setCursor(6,0);
    if (sc < 10) lcd.print("0");
    lcd.print(sc);
    
    lcd.setCursor(0,1);
    if (dy < 10) lcd.print("0");
    lcd.print(dy);
    lcd.setCursor(2,1);
    lcd.print("/");
    lcd.setCursor(3,1);
    if (mnt < 10) lcd.print("0");
    lcd.print(mnt);
    lcd.setCursor(5,1);
    lcd.print("/");
    lcd.setCursor(6,1);
    lcd.print(yr);
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("CURRENT TEMP");
    lcd.setCursor(0,1);
    lcd.print(rtcTemp);
    lcd.setCursor(5,1);
    lcd.print("C*");
    delay(2000);
    lcd.clear();
   
}

void fetchDate()
{
  DateTime MyDateAndTime;
  
  
  MyDateAndTime = Clock.read();

 hr = MyDateAndTime.Hour;
  mn = MyDateAndTime.Minute;
  sc = MyDateAndTime.Second;
 yr = MyDateAndTime.Year;
 mnt = MyDateAndTime.Month;
dy = MyDateAndTime.Day;
rtcTemp = Clock.getTemperature();

}


void setup()  
{


Serial.begin(9600);
 Clock.begin();
 finger.begin(57600);

 lcd.begin(16, 2);

 lcd.setCursor(0,1);
 lcd.clear();



 dispDateAndTime();
 delay(2000); 
 lcd.clear();
 lcd.print("Init SD card...");
 delay(500);
  if (!SD.begin(4)) {
    lcd.clear();
    lcd.print("SD Init failed!");
    delay(1000);
    return;
  }
  lcd.clear();
  lcd.print("SD Ready.");
  delay(1000);
  

  lcd.clear();


// Declare a file and write a header 
  myFile = SD.open("attend.csv", FILE_WRITE | O_APPEND);
 if (myFile)
    {
    myFile.println("TLI-31300 Attendance Project"); 
    myFile.println("Student,Time,Date,Temp,Confidence");   
    myFile.close();
    }
    else
    {
    Serial.println("Couldn't open log file");
    return;
    }  
  
  

}


void loop() 
  
{   

    fingerPrintID = getFingerprintIDez();
  delay(50);

  if (!mainUser )  //Waiting for a valid user 
  {
    lcd.setCursor(0, 0);
    lcd.print("Waiting on");
    lcd.setCursor(0, 1);
    lcd.print("A Valid Finger");
    delay(500);

  }

  if (mainUser)  // found a valid user 
  {
    lcd.clear();
    fetchDate();
    delay(150);

    /*Several if statements on the finger.fingerID to assign an actual name.  To Save space this may be removed, and a .txt file could be created on the SD card with the information.  Then a matching
     Algoritihim to sort through the interger values and assign an actual name .  For now this was easier 
    */
    if (finger.fingerID == 1) {
      userID = "Casey 1";
    }

    if (finger.fingerID == 4) {
      userID = "Casey 4";
    }
  
  myFile.close();  // This proves to be critical. If the file is already open for whatever reason, you couldn't write to it again. 
  myFile = SD.open("attend.csv", FILE_WRITE | O_APPEND);

 if (myFile) {
  Serial.println("Writing to SD Card"); 
  myFile.println("");
  myFile.print(String(userID));
  myFile.print(",");
  myFile.print(String(hr)+":"+(mn)+":"+(sc));
  myFile.print(",");
  myFile.print(String(yr)+"/"+(mnt)+"/"+(dy));
   myFile.print(",");
  myFile.print(String(rtcTemp));
  myFile.print(",");
  myFile.print(String(confidence));

myFile.close();
delay(1000);
lcd.setCursor(0, 0);
    lcd.print("Recorded");
    lcd.setCursor(0, 1);
    lcd.print(userID);
    delay(1000);

 }
 else
 {
  Serial.println("Issue Opening SD Card");
 }
lcd.clear();
} 

}// end of main 

int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK) return mainUser = false;
  //
  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return mainUser = false;


  // OK converted!

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK) return mainUser = false;

  // found a match!  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence); Serial.println(finger.fingerID);


  confidence = finger.confidence;
  mainUser = true;
   
  return finger.fingerID;

}

TLI-31300 - FIngerprint Attendance

C/C++
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <DS3231_Simple.h>

#include <SPI.h>
#include <SD.h>

File myFile;



DS3231_Simple Clock;
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);




// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
//const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
const int rs = 9, en = 10, d4 = 8, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


 int hr ;
 int mn ;
 int sc ;
 int yr ;
 int mnt ;
 int dy ;
 byte rtcTemp;
String myTimeStr = "";


int getFingerprintIDez();  // Function declaraton. This calls the get.finger object from the Adafruit library 

int fingerPrintID ;   // Set this to 0 for a place holder
boolean mainUser;  // This is a true / false for showing the main user 

String userID = " ";
int confidence;


void dispDateAndTime()
{
  DateTime MyDateAndTime;
  
  lcd.clear();
  MyDateAndTime = Clock.read();

 hr = MyDateAndTime.Hour;
 mn = MyDateAndTime.Minute;
 sc = MyDateAndTime.Second;
 yr = MyDateAndTime.Year;
 mnt = MyDateAndTime.Month;
 dy = MyDateAndTime.Day;
 rtcTemp = Clock.getTemperature();

    
    lcd.setCursor(0,0);
    lcd.print("TIME - HH:MM:SS");
    lcd.setCursor(0,1);
    lcd.print("DATE - DDMMYY");
    delay(1000);
    lcd.clear();

    lcd.setCursor(0,0);
    if (hr < 10) lcd.print("0");
    lcd.print(hr);
    lcd.setCursor(2,0);
    lcd.print(":");
    lcd.setCursor(3,0);
    if (mn < 10) lcd.print("0");
    lcd.print(mn);
    lcd.setCursor(5,0);
    lcd.print(":");
    lcd.setCursor(6,0);
    if (sc < 10) lcd.print("0");
    lcd.print(sc);
    
    lcd.setCursor(0,1);
    if (dy < 10) lcd.print("0");
    lcd.print(dy);
    lcd.setCursor(2,1);
    lcd.print("/");
    lcd.setCursor(3,1);
    if (mnt < 10) lcd.print("0");
    lcd.print(mnt);
    lcd.setCursor(5,1);
    lcd.print("/");
    lcd.setCursor(6,1);
    lcd.print(yr);
    delay(2000);
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("CURRENT TEMP");
    lcd.setCursor(0,1);
    lcd.print(rtcTemp);
    lcd.setCursor(5,1);
    lcd.print("C*");
    delay(2000);
    lcd.clear();
   
}

void fetchDate()
{
  DateTime MyDateAndTime;
  
  
  MyDateAndTime = Clock.read();

 hr = MyDateAndTime.Hour;
  mn = MyDateAndTime.Minute;
  sc = MyDateAndTime.Second;
 yr = MyDateAndTime.Year;
 mnt = MyDateAndTime.Month;
dy = MyDateAndTime.Day;
rtcTemp = Clock.getTemperature();

}


void setup()  
{


Serial.begin(9600);
 Clock.begin();
 finger.begin(57600);

 lcd.begin(16, 2);

 lcd.setCursor(0,1);
 lcd.clear();



 dispDateAndTime();
 delay(2000); 
 lcd.clear();
 lcd.print("Init SD card...");
 delay(500);
  if (!SD.begin(4)) {
    lcd.clear();
    lcd.print("SD Init failed!");
    delay(1000);
    return;
  }
  lcd.clear();
  lcd.print("SD Ready.");
  delay(1000);
  

  lcd.clear();



  myFile = SD.open("attend.csv", FILE_WRITE | O_APPEND);
 if (myFile)
    {
    myFile.println("TLI-31300 Attendance Project"); //Just a leading blank line, incase there was previous data
    myFile.println("Student,Time,Temp,Confidence");   
    myFile.close();
    }
    else
    {
    Serial.println("Couldn't open log file");
    return;
    }  
  
  

}


void loop() 
  
{
 

    
    
     

    

    fingerPrintID = getFingerprintIDez();
  delay(50);

  if (!mainUser )
  {
    lcd.setCursor(0, 0);
    lcd.print("Waiting on");
    lcd.setCursor(0, 1);
    lcd.print("A Valid Finger");
    delay(500);

  }

  if (mainUser)
  {
    lcd.clear();
    fetchDate();
    delay(150);
    Serial.println(finger.fingerID);


    if (finger.fingerID == 1) {
      userID = "Casey 1";
    }

    if (finger.fingerID == 4) {
      userID = "Casey 4";
    }
  
  myFile.close();
  myFile = SD.open("attend.csv", FILE_WRITE | O_APPEND);

 if (myFile) {
  Serial.println("Writing to SD Card"); 
  myFile.println("");
  myFile.print(String(userID));
  myFile.print(",");
  char tm[8];
  sprintf(tm,"%d:%d:%d", hr,mn,sc);
 // myFile.print(String(hr)+":"+(mn)+":"+(sc));
  myFile.print(tm);
  myFile.print(",");
  myFile.print(rtcTemp);
  myFile.print(",");
  myFile.print(String(confidence));

myFile.close();
delay(1000);
lcd.setCursor(0, 0);
    lcd.print("Recorded");
    lcd.setCursor(0, 1);
    lcd.print(userID);
    delay(1000);

 }
 else
 {
  Serial.println("Issue Opening SD Card");
 }
lcd.clear();
} 

}// end of main 

int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK) return mainUser = false;
  //
  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return mainUser = false;


  // OK converted!

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK) return mainUser = false;

  // found a match!  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence); Serial.println(finger.fingerID);


  confidence = finger.confidence;
  mainUser = true;
   
  return finger.fingerID;

}

Credits

cfulford
16 projects • 4 followers
Contact

Comments

Please log in or sign up to comment.