0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Arduino和指紋模塊制作生物識(shí)別考勤系統(tǒng)

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:薩達(dá)姆 ? 2023-01-25 15:54 ? 次閱讀

考勤系統(tǒng)是用于標(biāo)記辦公室和學(xué)校存在的常用系統(tǒng)。從在考勤登記冊(cè)中手動(dòng)標(biāo)記考勤到使用高科技應(yīng)用程序和生物識(shí)別系統(tǒng),這些系統(tǒng)都得到了顯著改進(jìn)。在我們以前的項(xiàng)目中,我們已經(jīng)涵蓋了使用RFID和AVR微控制器,8051和樹(shù)莓派的其他電子考勤系統(tǒng)項(xiàng)目。在這個(gè)項(xiàng)目中,我們使用指紋模塊和Arduino來(lái)獲取和保存考勤數(shù)據(jù)和記錄。通過(guò)使用指紋傳感器,系統(tǒng)對(duì)用戶來(lái)說(shuō)將變得更加安全。以下部分介紹了使用 Arduino 制作基于指紋的生物識(shí)別考勤系統(tǒng)的技術(shù)細(xì)節(jié)。

必需組件

  1. 阿杜伊諾 -1
  2. 指紋模塊 -1
  3. 按鈕 - 4
  4. 指示燈 -1
  5. 1K 電阻器 -2
  6. 2.2K 電阻 -1
  7. 權(quán)力
  8. 連接線
  9. 蜂鳴器 -1
  10. 16x2 液晶顯示器 -1
  11. 面包板 -1
  12. RTC 模塊 -1

項(xiàng)目描述:

在這個(gè)指紋考勤系統(tǒng)電路中,我們使用指紋傳感器模塊通過(guò)在系統(tǒng)中輸入手指來(lái)驗(yàn)證真實(shí)的人或員工。在這里,我們使用4個(gè)按鈕來(lái)注冊(cè),刪除,向上/向下。注冊(cè)和 DEL 密鑰具有三重功能。ENROLL 密鑰用于將新人員注冊(cè)到系統(tǒng)中。因此,當(dāng)用戶想要注冊(cè)新手指時(shí),他/她需要按注冊(cè)鍵,然后LCD要求輸入ID,用戶想要在其中存儲(chǔ)指紋圖像?,F(xiàn)在,如果此時(shí)用戶不想繼續(xù),那么他/她可以再次按REGISTER鍵返回。這次 ENROLL 鍵表現(xiàn)為后退鍵,即 ENROLL 鍵同時(shí)具有注冊(cè)和返回功能。此外,注冊(cè)密鑰還用于通過(guò)串行監(jiān)視器下載考勤數(shù)據(jù)。同樣,DEL/OK 鍵也具有相同的雙重功能,就像用戶注冊(cè)新手指時(shí)一樣,然后他/她需要使用另外兩個(gè)鍵(即 UP 和 DOWN)來(lái)選擇手指 ID?,F(xiàn)在用戶需要按 DEL/OK 鍵(這次此鍵的行為類似于確定)以繼續(xù)使用選定的 ID。Del鍵用于重置或刪除Arduino的EEPROM中的數(shù)據(jù)。

使用arduino的生物識(shí)別系統(tǒng)項(xiàng)目框圖

指紋模塊:

指紋傳感器模塊

指紋傳感器模塊捕獲手指的打印圖像,然后將其轉(zhuǎn)換為等效模板,并根據(jù)Arduino選擇的ID將它們保存到其內(nèi)存中。所有過(guò)程都由Arduino命令,例如拍攝指紋的圖像,將其轉(zhuǎn)換為模板并存儲(chǔ)為ID等。

在這里,我們添加了一個(gè)黃色LED,表示指紋模塊已準(zhǔn)備好拍攝手指的圖像。蜂鳴器也用于各種指示。Arduino是該系統(tǒng)的主要組件,它負(fù)責(zé)控制整個(gè)系統(tǒng)。

基于指紋的考勤系統(tǒng)工作原理

這個(gè)指紋考勤系統(tǒng)項(xiàng)目的工作相當(dāng)簡(jiǎn)單。首先,用戶需要在按鈕的幫助下注冊(cè)用戶的指紋。為此,用戶需要按REGISTER鍵,然后LCD要求輸入指紋的ID,以按ID名稱將其保存在內(nèi)存中。所以現(xiàn)在用戶需要使用向上/向下鍵輸入ID。選擇ID后,用戶需要按確定鍵(DEL鍵)?,F(xiàn)在LCD將要求將手指放在指紋模塊上。現(xiàn)在用戶需要將手指放在指紋模塊上,然后模塊獲取手指圖像?,F(xiàn)在LCD會(huì)說(shuō)從指紋模塊中取出手指,然后再次要求再次放置手指?,F(xiàn)在用戶需要再次放置手指,模塊獲取圖像并將其轉(zhuǎn)換為模板,并通過(guò)選定的ID將其存儲(chǔ)到指紋模塊的內(nèi)存中?,F(xiàn)在,用戶將被注冊(cè),他/她可以通過(guò)將手指放在指紋模塊上來(lái)提供出勤。通過(guò)相同的方法,所有用戶都將注冊(cè)到系統(tǒng)中。

現(xiàn)在,如果用戶想要?jiǎng)h除或刪除任何存儲(chǔ)的ID或指紋,那么他/她需要按DEL鍵。按下刪除鍵后,液晶屏將要求選擇需要?jiǎng)h除的ID?,F(xiàn)在用戶需要選擇ID并按確定鍵(相同的DEL鍵)。現(xiàn)在LCD會(huì)讓您知道指紋已成功刪除。

使用Arduino的基于指紋的考勤系統(tǒng)

考勤如何在此指紋考勤系統(tǒng)項(xiàng)目中工作:

每當(dāng)用戶將手指放在指紋模塊上時(shí),指紋模塊就會(huì)捕獲手指圖像,并搜索系統(tǒng)中是否有任何ID與此指紋相關(guān)聯(lián)。如果檢測(cè)到指紋ID,則LCD將顯示已注冊(cè)出勤,同時(shí)蜂鳴器將發(fā)出一次嗶嗶聲,LED將熄滅,直到系統(tǒng)準(zhǔn)備好再次輸入。

除了指紋模塊,我們還使用了時(shí)間和日期的RTC模塊。時(shí)間和日期在系統(tǒng)中連續(xù)運(yùn)行。因此,每當(dāng)真正的用戶將手指放在指紋上并將它們保存在EEPROM中分配的內(nèi)存插槽時(shí),Arduino都會(huì)花費(fèi)時(shí)間和日期。

在這里,我們?cè)诖讼到y(tǒng)中創(chuàng)建了5個(gè)用戶空間,為期30天。通過(guò)按下Arduino中的RESET按鈕,然后立即注冊(cè)鍵將負(fù)責(zé)從Arduino EEPROM存儲(chǔ)器通過(guò)串行監(jiān)視器下載考勤數(shù)據(jù)。

內(nèi)存管理:

我們?cè)?Arduino UNO 中有 1023 字節(jié)的內(nèi)存,其中我們有 1018 字節(jié)來(lái)存儲(chǔ)數(shù)據(jù),我們已經(jīng)在 30 天內(nèi)獲取了 5 個(gè)用戶出勤數(shù)據(jù)。每次出席都會(huì)記錄時(shí)間和日期,因此這將成為 7 字節(jié)的數(shù)據(jù)。

所以所需的總內(nèi)存是

5307=1050,所以這里我們需要更多的32字節(jié)

但是如果我們要使用 4 個(gè)用戶,那么我們需要

4307=840

在這里,我們通過(guò)占用 5 個(gè)用戶內(nèi)存完成了這個(gè)項(xiàng)目演示。這樣,我們將無(wú)法存儲(chǔ) 32 字節(jié)或 5 個(gè)出席記錄的 5^千^用戶。

您可以通過(guò)更改代碼中的某些行來(lái)嘗試 4 個(gè)用戶。我已經(jīng)在需要更改的代碼中做了注釋。

指紋考勤系統(tǒng)項(xiàng)目電路圖及說(shuō)明

這個(gè)基于指紋的考勤系統(tǒng)項(xiàng)目的電路,如上圖所示,非常簡(jiǎn)單。它具有用于控制項(xiàng)目所有過(guò)程的Arduino,用于注冊(cè),刪除,選擇ID和考勤的按鈕,用于警報(bào)的蜂鳴器,用于指示的LED和用于指示用戶并顯示結(jié)果消息的LCD。

1.png

如電路圖所示,一個(gè)按鈕直接連接到Arduino的引腳A0(ENREGISTRATION),A1(DEL),A2(UP),A3(DOWN)相對(duì)于地面,黃色LED通過(guò)1k電阻連接到Arduino的數(shù)字引腳D7相對(duì)于接地。指紋模塊的 Rx 和 Tx 直接連接到 Arduino 的串行引腳 D2 和 D3(軟件串行)。5v 電源用于為取自 Arduino 板的指紋模塊供電。蜂鳴器也連接在引腳 A5 上。16x2 LCD 配置為 4 位模式,其 RS、EN、D4、D5、D6 和 D7 直接連接到 Arduino 的數(shù)字引腳 D13、D12、D11、D10、D9 和 D8。

代碼說(shuō)明:

arduino的指紋考勤系統(tǒng)代碼將在后續(xù)部分中給出。盡管代碼通過(guò)注釋很好地解釋了,但我們?cè)谶@里討論的是代碼的幾個(gè)重要部分。我們使用指紋庫(kù)將 指紋模塊與Arduino板連接

首先,我們包含頭文件并定義輸入和輸出引腳,并定義宏和聲明的變量。之后,在設(shè)置功能中,我們指示定義的引腳并啟動(dòng)LCD和指紋模塊

之后,我們必須編寫(xiě)用于下載考勤數(shù)據(jù)的代碼。

void setup()
{
    delay(1000);
    lcd.begin(16,2);
    Serial.begin(9600);
    pinMode(enroll, INPUT_PULLUP);
    pinMode(up, INPUT_PULLUP);
    pinMode(down, INPUT_PULLUP);
    pinMode(del, INPUT_PULLUP);
    pinMode(match, INPUT_PULLUP);
    pinMode(buzzer, OUTPUT);
    pinMode(indFinger, OUTPUT);
    digitalWrite(buzzer, LOW);
    if(digitalRead(enroll) == 0)
    {
      digitalWrite(buzzer, HIGH);
      delay(500);
      digitalWrite(buzzer, LOW);
      lcd.clear();
      lcd.print("Please wait");
      lcd.setCursor(0,1);
      lcd.print("Downloding Data");

之后,我們必須編寫(xiě)代碼來(lái)清除EEPROM中的出勤數(shù)據(jù)。

if(digitalRead(del) == 0)
    {
      lcd.clear();
      lcd.print("Please Wait");
      lcd.setCursor(0,1);
      lcd.print("Reseting.....");
      for(int i=1000;i<1005;i++)
      EEPROM.write(i,0);
      for(int i=0;i<841;i++)
      EEPROM.write(i, 0xff);
      lcd.clear();
      lcd.print("System Reset");
      delay(1000);
    }

之后,我們啟動(dòng)指紋模塊,通過(guò)LCD顯示歡迎消息,并啟動(dòng)RTC模塊。

之后,在循環(huán)功能中,我們讀取了RTC時(shí)間并將其顯示在LCD上

void loop()
{
    now = rtc.now();
    lcd.setCursor(0,0);
    lcd.print("Time->");
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    lcd.print("    ");
    lcd.setCursor(0,1);
    lcd.print("Date->");
    lcd.print(now.day(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);

之后,等待指紋接受輸入并將捕獲的圖像 ID 與存儲(chǔ)的 ID 進(jìn)行比較。如果發(fā)生匹配,則繼續(xù)下一步。并檢查注冊(cè)德?tīng)栨I

int result=getFingerprintIDez();
    if(result>0)
    {
              digitalWrite(indFinger, LOW);
              digitalWrite(buzzer, HIGH);
              delay(100);
              digitalWrite(buzzer, LOW);
              lcd.clear();
              lcd.print("ID:");
              lcd.print(result);
              lcd.setCursor(0,1);
              lcd.print("Please Wait....");
              delay(1000);
              attendance(result);
              lcd.clear();
              lcd.print("Attendance ");
              lcd.setCursor(0,1);
              lcd.print("Registed");
              delay(1000);
        digitalWrite(indFinger, HIGH);
        return;
 }

給定 void checkKeys() 函數(shù)用于檢查是否按下注冊(cè)或 DEL 鍵以及按下時(shí)該怎么做。如果按下 ENROL 鍵,則調(diào)用 Enroll( ) 函數(shù)并按下 DEL 鍵,則調(diào)用 delete() 函數(shù)。

void delet( ) 函數(shù)用于輸入要?jiǎng)h除的 ID 并調(diào)用uint8_t *deleteFingerprint(uint8_t id) *函數(shù),該函數(shù)將從記錄中刪除手指。

給定功能用于獲取指紋圖像并將其轉(zhuǎn)換為模板,并通過(guò)選定的ID保存到指紋模塊存儲(chǔ)器中。

uint8_t getFingerprintEnroll() 
{
  int p = -1;
  lcd.clear();
  lcd.print("finger ID:");
  lcd.print(id);
  lcd.setCursor(0,1);
  lcd.print("Place Finger");
  delay(2000);
  while (p != FINGERPRINT_OK)
  {
    p = finger.getImage();
..... .....
....... ....

給定功能用于在EEPROM的分配插槽中存儲(chǔ)考勤時(shí)間和日期

void attendance(int id)
{
  int user=0,eepLoc=0;
  if(id == 1)
  {
    eepLoc=0;
    user=user1++;
  }
  else if(id == 2)
  {
    eepLoc=210;
    user=user2++;
  }
  else if(id == 3)
  .... ....
  .....

給定功能用于從EEPROM獲取數(shù)據(jù)并發(fā)送到串行監(jiān)視器

void download(int eepIndex)
{
            
            if(EEPROM.read(eepIndex) != 0xff)
            {
              Serial.print("T->");
              if(EEPROM.read(eepIndex)<10)
              Serial.print('0');
              Serial.print(EEPROM.read(eepIndex++));
              Serial.print(':');  
              if(EEPROM.read(eepIndex)<10)
              Serial.print('0');
              Serial.print(EEPROM.read(eepIndex++));

#include
#include
LiquidCrystal lcd(13,12,11,10,9,8);
#include
SoftwareSerial fingerPrint(2, 3);

#include
#include "RTClib.h"
RTC_DS1307 rtc;

#include "Adafruit_Fingerprint.h"
uint8_t id;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);

#define enroll 14
#define del 15
#define up 16
#define down 17
#define match 5
#define indFinger 7
#define buzzer 5

#define records 4 // 5 for 5 user

int user1,user2,user3,user4,user5;

DateTime now;

void setup()
{
delay(1000);
lcd.begin(16,2);
Serial.begin(9600);
pinMode(enroll, INPUT_PULLUP);
pinMode(up, INPUT_PULLUP);
pinMode(down, INPUT_PULLUP);
pinMode(del, INPUT_PULLUP);
pinMode(match, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
pinMode(indFinger, OUTPUT);
digitalWrite(buzzer, LOW);
if(digitalRead(enroll) == 0)
{
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
lcd.clear();
lcd.print("Please wait");
lcd.setCursor(0,1);
lcd.print("Downloding Data");

Serial.println("Please wait");
Serial.println("Downloding Data..");
Serial.println();

Serial.print("S.No. ");
for(int i=0;i {
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
Serial.print(" User ID");
Serial.print(i+1);
Serial.print(" ");
}
Serial.println();
int eepIndex=0;
for(int i=0;i<30;i++)
{
if(i+1<10)
Serial.print('0');
Serial.print(i+1);
Serial.print(" ");
eepIndex=(i*7);
download(eepIndex);
eepIndex=(i*7)+210;
download(eepIndex);
eepIndex=(i*7)+420;
download(eepIndex);
eepIndex=(i*7)+630;
download(eepIndex);
// eepIndex=(i*7)+840; // 5th user
// download(eepIndex);
Serial.println();
}
}
if(digitalRead(del) == 0)
{
lcd.clear();
lcd.print("Please Wait");
lcd.setCursor(0,1);
lcd.print("Reseting.....");
for(int i=1000;i<1005;i++)
EEPROM.write(i,0);
for(int i=0;i<841;i++)
EEPROM.write(i, 0xff);
lcd.clear();
lcd.print("System Reset");
delay(1000);
}


lcd.clear();
lcd.print(" Attendance ");
lcd.setCursor(0,1);
lcd.print(" System ");
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("Saddam Khan");
delay(2000);
digitalWrite(buzzer, HIGH);
delay(500);
digitalWrite(buzzer, LOW);
for(int i=1000;i<1000+records;i++)
{
if(EEPROM.read(i) == 0xff)
EEPROM.write(i,0);
}

finger.begin(57600);
Serial.begin(9600);
lcd.clear();
lcd.print("Finding Module");
lcd.setCursor(0,1);
delay(1000);
if (finger.verifyPassword())
{
Serial.println("Found fingerprint sensor!");
lcd.clear();
lcd.print("Found Module ");
delay(1000);
}
else
{
Serial.println("Did not find fingerprint sensor :(");
lcd.clear();
lcd.print("module not Found");
lcd.setCursor(0,1);
lcd.print("Check Connections");
while (1);
}

if (! rtc.begin())
Serial.println("Couldn't find RTC");

// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

if (! rtc.isrunning())
{
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
lcd.setCursor(0,0);
lcd.print("Press Match to ");
lcd.setCursor(0,1);
lcd.print("Start System");
delay(2000);

user1=EEPROM.read(1000);
user2=EEPROM.read(1001);
user3=EEPROM.read(1002);
user4=EEPROM.read(1003);
user5=EEPROM.read(1004);
lcd.clear();
digitalWrite(indFinger, HIGH);

}

void loop()
{
now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Time->");
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Date->");
lcd.print(now.day(), DEC);
lcd.print('/');
lcd.print(now.month(), DEC);
lcd.print('/');
lcd.print(now.year(), DEC);
lcd.print(" ");
delay(500);
int result=getFingerprintIDez();
if(result>0)
{
digitalWrite(indFinger, LOW);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
lcd.clear();
lcd.print("ID:");
lcd.print(result);
lcd.setCursor(0,1);
lcd.print("Please Wait....");
delay(1000);
attendance(result);
lcd.clear();
lcd.print("Attendance ");
lcd.setCursor(0,1);
lcd.print("Registed");
delay(1000);
digitalWrite(indFinger, HIGH);
return;
}
checkKeys();
delay(300);
}

// dmyyhms - 7 bytes
void attendance(int id)
{
int user=0,eepLoc=0;
if(id == 1)
{
eepLoc=0;
user=user1++;
}
else if(id == 2)
{
eepLoc=210;
user=user2++;
}
else if(id == 3)
{
eepLoc=420;
user=user3++;
}
else if(id == 4)
{
eepLoc=630;
user=user4++;
}
/*else if(id == 5) // fifth user
{
eepLoc=840;
user=user5++;
}*/
else
return;

int eepIndex=(user*7)+eepLoc;
EEPROM.write(eepIndex++, now.hour());
EEPROM.write(eepIndex++, now.minute());
EEPROM.write(eepIndex++, now.second());
EEPROM.write(eepIndex++, now.day());
EEPROM.write(eepIndex++, now.month());
EEPROM.write(eepIndex++, now.year()>>8 );
EEPROM.write(eepIndex++, now.year());

EEPROM.write(1000,user1);
EEPROM.write(1001,user2);
EEPROM.write(1002,user3);
EEPROM.write(1003,user4);
// EEPROM.write(4,user5); // figth user
}

void checkKeys()
{
if(digitalRead(enroll) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
while(digitalRead(enroll) == 0);
Enroll();
}

else if(digitalRead(del) == 0)
{
lcd.clear();
lcd.print("Please Wait");
delay(1000);
delet();
}
}

void Enroll()
{
int count=1;
lcd.clear();
lcd.print("Enter Finger ID:");

while(1)
{
lcd.setCursor(0,1);
lcd.print(count);
if(digitalRead(up) == 0)
{
count++;
if(count>records)
count=1;
delay(500);
}

else if(digitalRead(down) == 0)
{
count--;
if(count<1)
count=records;
delay(500);
}
else if(digitalRead(del) == 0)
{
id=count;
getFingerprintEnroll();
for(int i=0;i {
if(EEPROM.read(i) != 0xff)
{
EEPROM.write(i, id);
break;
}
}
return;
}

else if(digitalRead(enroll) == 0)
{
return;
}
}
}

void delet()
{
int count=1;
lcd.clear();
lcd.print("Enter Finger ID");

while(1)
{
lcd.setCursor(0,1);
lcd.print(count);
if(digitalRead(up) == 0)
{
count++;
if(count>records)
count=1;
delay(500);
}

else if(digitalRead(down) == 0)
{
count--;
if(count<1)
count=records;
delay(500);
}
else if(digitalRead(del) == 0)
{
id=count;
deleteFingerprint(id);
for(int i=0;i {
if(EEPROM.read(i) == id)
{
EEPROM.write(i, 0xff);
break;
}
}
return;
}

else if(digitalRead(enroll) == 0)
{
return;
}
}
}

uint8_t getFingerprintEnroll()
{
int p = -1;
lcd.clear();
lcd.print("finger ID:");
lcd.print(id);
lcd.setCursor(0,1);
lcd.print("Place Finger");
delay(2000);
while (p != FINGERPRINT_OK)
{
p = finger.getImage();
switch (p)
{
case FINGERPRINT_OK:
Serial.println("Image taken");
lcd.clear();
lcd.print("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No Finger");
lcd.clear();
lcd.print("No Finger");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
lcd.clear();
lcd.print("Comm Error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
lcd.clear();
lcd.print("Imaging Error");
break;
default:
Serial.println("Unknown error");
lcd.clear();
lcd.print("Unknown Error");
break;
}
}

// OK success!

p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
lcd.clear();
lcd.print("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
lcd.clear();
lcd.print("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
lcd.clear();
lcd.print("Comm Error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
lcd.clear();
lcd.print("Feature Not Found");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
lcd.clear();
lcd.print("Feature Not Found");
return p;
default:
Serial.println("Unknown error");
lcd.clear();
lcd.print("Unknown Error");
return p;
}

Serial.println("Remove finger");
lcd.clear();
lcd.print("Remove Finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
lcd.clear();
lcd.print("Place Finger");
lcd.setCursor(0,1);
lcd.print(" Again");
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");
return;
}
}

// OK success!

p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}

// OK converted!
Serial.print("Creating model for #"); Serial.println(id);

p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("Fingerprints did not match");
return p;
} else {
Serial.println("Unknown error");
return p;
}

Serial.print("ID "); Serial.println(id);
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("Stored!");
lcd.clear();
lcd.print("Stored!");
delay(2000);
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not store in that location");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
return p;
}
else {
Serial.println("Unknown error");
return p;
}
}

int getFingerprintIDez()
{
uint8_t p = finger.getImage();

if (p != FINGERPRINT_OK)
return -1;

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

p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK)
{
lcd.clear();
lcd.print("Finger Not Found");
lcd.setCursor(0,1);
lcd.print("Try Later");
delay(2000);
return -1;
}
// found a match!
Serial.print("Found ID #");
Serial.print(finger.fingerID);
return finger.fingerID;
}

uint8_t deleteFingerprint(uint8_t id)
{
uint8_t p = -1;
lcd.clear();
lcd.print("Please wait");
p = finger.deleteModel(id);
if (p == FINGERPRINT_OK)
{
Serial.println("Deleted!");
lcd.clear();
lcd.print("Figer Deleted");
lcd.setCursor(0,1);
lcd.print("Successfully");
delay(1000);
}

else
{
Serial.print("Something Wrong");
lcd.clear();
lcd.print("Something Wrong");
lcd.setCursor(0,1);
lcd.print("Try Again Later");
delay(2000);
return p;
}
}

void download(int eepIndex)
{

if(EEPROM.read(eepIndex) != 0xff)
{
Serial.print("T->");
if(EEPROM.read(eepIndex)<10)
Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(':');
if(EEPROM.read(eepIndex)<10)
Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(':');
if(EEPROM.read(eepIndex)<10)
Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print(" D->");
if(EEPROM.read(eepIndex)<10)
Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print('/');
if(EEPROM.read(eepIndex)<10)
Serial.print('0');
Serial.print(EEPROM.read(eepIndex++));
Serial.print('/');
Serial.print(EEPROM.read(eepIndex++)<<8 | EEPROM.read(eepIndex++));
}
else
{
Serial.print("---------------------------");
}

Serial.print(" ");
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 生物識(shí)別
    +關(guān)注

    關(guān)注

    3

    文章

    1210

    瀏覽量

    52493
  • 考勤系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    11196
  • Arduino
    +關(guān)注

    關(guān)注

    187

    文章

    6457

    瀏覽量

    186501
  • 指紋模塊
    +關(guān)注

    關(guān)注

    0

    文章

    25

    瀏覽量

    3876
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    生物識(shí)別的主力軍 指紋識(shí)別“大顯身手”

    在信息安全需求、公共安全需求、生物特征識(shí)別標(biāo)準(zhǔn)化推動(dòng)等多重因素的推動(dòng)下,生物識(shí)別潛在市場(chǎng)空間正在加速打開(kāi)。指紋識(shí)別產(chǎn)品是目前最方便、可靠和價(jià)
    發(fā)表于 02-24 09:02 ?1423次閱讀

    基于Arduino控制指紋傳感器模塊指紋識(shí)別使用方案

    使指紋識(shí)別更易于實(shí)現(xiàn),并且易于添加到您的項(xiàng)目中。這意味著指紋采集、注冊(cè)、比較和搜索是非常容易實(shí)現(xiàn)的。 這些模塊帶有FLASH存儲(chǔ)器,用于存儲(chǔ)指紋,并可與TTL串行接口的任何微控制器或
    的頭像 發(fā)表于 10-28 14:19 ?7796次閱讀

    如何使用Arduino構(gòu)建基于指紋生物識(shí)別投票機(jī)

    ,一個(gè)人可以根據(jù)他的指紋獲得授權(quán)。這也將阻止虛假投票。所以今天我們正在 **使用Arduino構(gòu)建基于指紋生物識(shí)別投票機(jī)** 。
    的頭像 發(fā)表于 01-06 16:13 ?2942次閱讀
    如何使用<b class='flag-5'>Arduino</b>構(gòu)建基于<b class='flag-5'>指紋</b>的<b class='flag-5'>生物</b><b class='flag-5'>識(shí)別</b>投票機(jī)

    指紋識(shí)別在新型學(xué)籍管理系統(tǒng)中的應(yīng)用

    動(dòng)態(tài)信息的有效性和真實(shí)性識(shí)別能力,目前還是采用傳統(tǒng)的書(shū)面簽字方法.為此,結(jié)合廈門(mén)大學(xué)新型教務(wù)管理系統(tǒng)的開(kāi)發(fā),采用指紋識(shí)別技術(shù),構(gòu)建了針對(duì)學(xué)籍信息管理系統(tǒng)
    發(fā)表于 04-24 09:47

    基于DSP平臺(tái)的指紋識(shí)別考勤機(jī)

    誰(shuí)知道《基于DSP平臺(tái)的指紋識(shí)別考勤機(jī)》等方面的內(nèi)容嗎,最好是word文檔類型的論文。
    發(fā)表于 11-24 21:49

    新唐指紋識(shí)別

    指紋識(shí)別技術(shù)是一種生物識(shí)別技術(shù)。指紋識(shí)別系統(tǒng)是一套包括指紋圖像獲取、處理、特征提取和比對(duì)等模塊的模式識(shí)別
    發(fā)表于 01-27 15:06

    基于Cortex-m3的指紋識(shí)別考勤系統(tǒng)硬件設(shè)計(jì)

    基于Cortex-m3的指紋識(shí)別考勤系統(tǒng)硬件設(shè)計(jì)怎么做
    發(fā)表于 11-10 09:20

    基于Cortex-m3的指紋識(shí)別考勤系統(tǒng)硬件設(shè)計(jì),

    基于Cortex-m3的指紋識(shí)別考勤系統(tǒng)硬件設(shè)計(jì),這個(gè)題目需要買個(gè)指紋采集模塊,然后與cortex-m3開(kāi)發(fā)板連接起,需要做硬件,并編寫(xiě)st
    發(fā)表于 11-10 09:49

    【華強(qiáng)芯城指紋模塊試用申請(qǐng)】考勤系統(tǒng)

    項(xiàng)目名稱:考勤系統(tǒng)試用計(jì)劃:應(yīng)用于特殊場(chǎng)合基于指紋識(shí)別考勤系統(tǒng),尋找合適指紋器件,加快項(xiàng)目開(kāi)發(fā)
    發(fā)表于 09-04 15:05

    基于指紋模板的考勤系統(tǒng)設(shè)計(jì)

    的功能,并對(duì)通信的數(shù)據(jù)格式及通信的流程進(jìn)行了詳細(xì)的描述。本指紋考勤系統(tǒng)生物識(shí)別、機(jī)電一體化、軟件、光學(xué)等技術(shù)于一身,是專門(mén)針對(duì)人力資源管理
    發(fā)表于 11-13 16:14

    AS608指紋考勤系統(tǒng)上位機(jī)工作統(tǒng)計(jì)

    )判斷有無(wú)手指按下。 3、應(yīng)用AS608設(shè)計(jì)制作指紋考勤系統(tǒng)1、通過(guò)單片機(jī)采集指紋,并識(shí)別
    發(fā)表于 03-06 12:21

    智能考勤管理系統(tǒng)資料分享(原理圖+源碼+文檔)

    現(xiàn)今指紋識(shí)別技術(shù)在考勤和門(mén)禁安全等方面有很大應(yīng)用,該智能管理系統(tǒng)的硬件主要由微處理器、指紋識(shí)別模塊、液晶顯示
    發(fā)表于 09-29 13:51

    在PC端上搭建一款具有指紋識(shí)別與人臉識(shí)別功能的門(mén)禁兼考勤系統(tǒng)

    一、設(shè)計(jì)目標(biāo):旨在PC端上搭建一款具有指紋識(shí)別與人臉識(shí)別功能的門(mén)禁兼考勤系統(tǒng)。該系統(tǒng)同時(shí)具備普通用戶模式、管理員模式與超級(jí)管理員模式,下面具
    發(fā)表于 01-18 09:37

    利用STM32單片機(jī)來(lái)實(shí)現(xiàn)指紋識(shí)別或RFID刷卡的門(mén)禁或考勤系統(tǒng)

    本項(xiàng)目將利用STM32單片機(jī)來(lái)實(shí)現(xiàn)指紋識(shí)別或RFID刷卡的門(mén)禁或考勤系統(tǒng)。功能可選組合:1、指紋識(shí)別;2、RDIF刷卡識(shí)別;3、
    發(fā)表于 02-18 07:53

    人臉識(shí)別技術(shù)迅速占領(lǐng)門(mén)禁考勤市場(chǎng)

    隨著人工智能識(shí)別技術(shù)應(yīng)用爆炸性增長(zhǎng),人臉識(shí)別技術(shù)迅速占領(lǐng)門(mén)禁考勤市常目前市面上的門(mén)禁考勤系統(tǒng)可分為刷卡
    的頭像 發(fā)表于 12-18 13:46 ?3196次閱讀