0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino和指纹模块制作生物识别考勤系统

科技观察员 来源:circuitdigest 作者:萨达姆 2023-01-25 15:54 次阅读

考勤系统是用于标记办公室和学校存在的常用系统。从在考勤登记册中手动标记考勤到使用高科技应用程序和生物识别系统,这些系统都得到了显着改进。在我们以前的项目中,我们已经涵盖了使用RFID和AVR微控制器,8051和树莓派的其他电子考勤系统项目。在这个项目中,我们使用指纹模块和Arduino来获取和保存考勤数据和记录。通过使用指纹传感器,系统对用户来说将变得更加安全。以下部分介绍了使用 Arduino 制作基于指纹的生物识别考勤系统的技术细节。

必需组件

  1. 阿杜伊诺 -1
  2. 指纹模块 -1
  3. 按钮 - 4
  4. 指示灯 -1
  5. 1K 电阻器 -2
  6. 2.2K 电阻 -1
  7. 权力
  8. 连接线
  9. 蜂鸣器 -1
  10. 16x2 液晶显示器 -1
  11. 面包板 -1
  12. RTC 模块 -1

项目描述:

在这个指纹考勤系统电路中,我们使用指纹传感器模块通过在系统中输入手指来验证真实的人或员工。在这里,我们使用4个按钮来注册,删除,向上/向下。注册和 DEL 密钥具有三重功能。ENROLL 密钥用于将新人员注册到系统中。因此,当用户想要注册新手指时,他/她需要按注册键,然后LCD要求输入ID,用户想要在其中存储指纹图像。现在,如果此时用户不想继续,那么他/她可以再次按REGISTER键返回。这次 ENROLL 键表现为后退键,即 ENROLL 键同时具有注册和返回功能。此外,注册密钥还用于通过串行监视器下载考勤数据。同样,DEL/OK 键也具有相同的双重功能,就像用户注册新手指时一样,然后他/她需要使用另外两个键(即 UP 和 DOWN)来选择手指 ID。现在用户需要按 DEL/OK 键(这次此键的行为类似于确定)以继续使用选定的 ID。Del键用于重置或删除Arduino的EEPROM中的数据。

使用arduino的生物识别系统项目框图

指纹模块:

指纹传感器模块

指纹传感器模块捕获手指的打印图像,然后将其转换为等效模板,并根据Arduino选择的ID将它们保存到其内存中。所有过程都由Arduino命令,例如拍摄指纹的图像,将其转换为模板并存储为ID等。

在这里,我们添加了一个黄色LED,表示指纹模块已准备好拍摄手指的图像。蜂鸣器也用于各种指示。Arduino是该系统的主要组件,它负责控制整个系统。

基于指纹的考勤系统工作原理

这个指纹考勤系统项目的工作相当简单。首先,用户需要在按钮的帮助下注册用户的指纹。为此,用户需要按REGISTER键,然后LCD要求输入指纹的ID,以按ID名称将其保存在内存中。所以现在用户需要使用向上/向下键输入ID。选择ID后,用户需要按确定键(DEL键)。现在LCD将要求将手指放在指纹模块上。现在用户需要将手指放在指纹模块上,然后模块获取手指图像。现在LCD会说从指纹模块中取出手指,然后再次要求再次放置手指。现在用户需要再次放置手指,模块获取图像并将其转换为模板,并通过选定的ID将其存储到指纹模块的内存中。现在,用户将被注册,他/她可以通过将手指放在指纹模块上来提供出勤。通过相同的方法,所有用户都将注册到系统中。

现在,如果用户想要删除或删除任何存储的ID或指纹,那么他/她需要按DEL键。按下删除键后,液晶屏将要求选择需要删除的ID。现在用户需要选择ID并按确定键(相同的DEL键)。现在LCD会让您知道指纹已成功删除。

使用Arduino的基于指纹的考勤系统

考勤如何在此指纹考勤系统项目中工作:

每当用户将手指放在指纹模块上时,指纹模块就会捕获手指图像,并搜索系统中是否有任何ID与此指纹相关联。如果检测到指纹ID,则LCD将显示已注册出勤,同时蜂鸣器将发出一次哔哔声,LED将熄灭,直到系统准备好再次输入。

除了指纹模块,我们还使用了时间和日期的RTC模块。时间和日期在系统中连续运行。因此,每当真正的用户将手指放在指纹上并将它们保存在EEPROM中分配的内存插槽时,Arduino都会花费时间和日期。

在这里,我们在此系统中创建了5个用户空间,为期30天。通过按下Arduino中的RESET按钮,然后立即注册键将负责从Arduino EEPROM存储器通过串行监视器下载考勤数据。

内存管理:

我们在 Arduino UNO 中有 1023 字节的内存,其中我们有 1018 字节来存储数据,我们已经在 30 天内获取了 5 个用户出勤数据。每次出席都会记录时间和日期,因此这将成为 7 字节的数据。

所以所需的总内存是

5307=1050,所以这里我们需要更多的32字节

但是如果我们要使用 4 个用户,那么我们需要

4307=840

在这里,我们通过占用 5 个用户内存完成了这个项目演示。这样,我们将无法存储 32 字节或 5 个出席记录的 5^千^用户。

您可以通过更改代码中的某些行来尝试 4 个用户。我已经在需要更改的代码中做了注释。

指纹考勤系统项目电路图及说明

这个基于指纹的考勤系统项目的电路,如上图所示,非常简单。它具有用于控制项目所有过程的Arduino,用于注册,删除,选择ID和考勤的按钮,用于警报的蜂鸣器,用于指示的LED和用于指示用户并显示结果消息的LCD。

1.png

如电路图所示,一个按钮直接连接到Arduino的引脚A0(ENREGISTRATION),A1(DEL),A2(UP),A3(DOWN)相对于地面,黄色LED通过1k电阻连接到Arduino的数字引脚D7相对于接地。指纹模块的 Rx 和 Tx 直接连接到 Arduino 的串行引脚 D2 和 D3(软件串行)。5v 电源用于为取自 Arduino 板的指纹模块供电。蜂鸣器也连接在引脚 A5 上。16x2 LCD 配置为 4 位模式,其 RS、EN、D4、D5、D6 和 D7 直接连接到 Arduino 的数字引脚 D13、D12、D11、D10、D9 和 D8。

代码说明:

arduino的指纹考勤系统代码将在后续部分中给出。尽管代码通过注释很好地解释了,但我们在这里讨论的是代码的几个重要部分。我们使用指纹库将 指纹模块与Arduino板连接

首先,我们包含头文件并定义输入和输出引脚,并定义宏和声明的变量。之后,在设置功能中,我们指示定义的引脚并启动LCD和指纹模块

之后,我们必须编写用于下载考勤数据的代码。

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");

之后,我们必须编写代码来清除EEPROM中的出勤数据。

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显示欢迎消息,并启动RTC模块。

之后,在循环功能中,我们读取了RTC时间并将其显示在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 与存储的 ID 进行比较。如果发生匹配,则继续下一步。并检查注册德尔键

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() 函数用于检查是否按下注册或 DEL 键以及按下时该怎么做。如果按下 ENROL 键,则调用 Enroll( ) 函数并按下 DEL 键,则调用 delete() 函数。

void delet( ) 函数用于输入要删除的 ID 并调用uint8_t *deleteFingerprint(uint8_t id) *函数,该函数将从记录中删除手指。

给定功能用于获取指纹图像并将其转换为模板,并通过选定的ID保存到指纹模块存储器中。

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的分配插槽中存储考勤时间和日期

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获取数据并发送到串行监视器

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(" ");
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生物识别
    +关注

    关注

    3

    文章

    1203

    浏览量

    52322
  • 考勤系统
    +关注

    关注

    0

    文章

    39

    浏览量

    11087
  • Arduino
    +关注

    关注

    184

    文章

    6427

    浏览量

    184834
  • 指纹模块
    +关注

    关注

    0

    文章

    25

    浏览量

    3748
收藏 人收藏

    评论

    相关推荐

    如何使用Arduino构建基于指纹生物识别投票机

    ,一个人可以根据他的指纹获得授权。这也将阻止虚假投票。所以今天我们正在 **使用Arduino构建基于指纹生物识别投票机** 。
    的头像 发表于 01-06 16:13 2558次阅读
    如何使用<b class='flag-5'>Arduino</b>构建基于<b class='flag-5'>指纹</b>的<b class='flag-5'>生物</b><b class='flag-5'>识别</b>投票机

    指纹识别在新型学籍管理系统中的应用

    动态信息的有效性和真实性识别能力,目前还是采用传统的书面签字方法.为此,结合厦门大学新型教务管理系统的开发,采用指纹识别技术,构建了针对学籍信息管理系统
    发表于 04-24 09:47

    基于DSP平台的指纹识别考勤

    谁知道《基于DSP平台的指纹识别考勤机》等方面的内容吗,最好是word文档类型的论文。
    发表于 11-24 21:49

    新唐指纹识别

    指纹识别技术是一种生物识别技术。指纹识别系统是一套包括指纹图像获取、处理、特征提取和比对等模块的模式识别
    发表于 01-27 15:06

    基于Cortex-m3的指纹识别考勤系统硬件设计

    基于Cortex-m3的指纹识别考勤系统硬件设计怎么做
    发表于 11-10 09:20

    基于Cortex-m3的指纹识别考勤系统硬件设计,

    基于Cortex-m3的指纹识别考勤系统硬件设计,这个题目需要买个指纹采集模块,然后与cortex-m3开发板连接起,需要做硬件,并编写st
    发表于 11-10 09:49

    【华强芯城指纹模块试用申请】考勤系统

    项目名称:考勤系统试用计划:应用于特殊场合基于指纹识别考勤系统,寻找合适指纹器件,加快项目开发
    发表于 09-04 15:05

    基于指纹模板的考勤系统设计

    的功能,并对通信的数据格式及通信的流程进行了详细的描述。本指纹考勤系统生物识别、机电一体化、软件、光学等技术于一身,是专门针对人力资源管理
    发表于 11-13 16:14

    AS608指纹考勤系统上位机工作统计

    )判断有无手指按下。 3、应用AS608设计制作指纹考勤系统1、通过单片机采集指纹,并识别
    发表于 03-06 12:21

    智能考勤管理系统资料分享(原理图+源码+文档)

    现今指纹识别技术在考勤和门禁安全等方面有很大应用,该智能管理系统的硬件主要由微处理器、指纹识别模块、液晶显示
    发表于 09-29 13:51

    绝对实用的ARM指纹识别系统方案

    最为实用、应用最为广泛的生物识别技术,尤其在民用生物识别技术中。    传统的指纹识别系统都是基于PC机的,这种系统具有识别速度快、样本存储
    发表于 11-09 06:02

    在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统

    一、设计目标:旨在PC端上搭建一款具有指纹识别与人脸识别功能的门禁兼考勤系统。该系统同时具备普通用户模式、管理员模式与超级管理员模式,下面具
    发表于 01-18 09:37

    ATK-AS608指纹识别模块的相关资料推荐

    、USB 通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、
    发表于 01-26 06:50

    利用STM32单片机来实现指纹识别或RFID刷卡的门禁或考勤系统

    本项目将利用STM32单片机来实现指纹识别或RFID刷卡的门禁或考勤系统。功能可选组合:1、指纹识别;2、RDIF刷卡识别;3、
    发表于 02-18 07:53

    指纹考勤机无法识别的原因有哪些

    指纹考勤机无法识别是什么原因?指纹考勤机无法识别怎么解决?下面就给大家分析下并带来相应解决方法,
    发表于 06-16 11:44 3770次阅读