Hardware components | ||||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
TLI-31300 Attendance Project
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;
}
#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;
}
Comments
Please log in or sign up to comment.