风筝
发表于: 2017-8-14 23:46:56 | 显示全部楼层

fingerprint-attendance-syst.jpg


考勤系统通常用来记录办公室和学校人员的考勤情况。从手动登记出勤情况,到使用高科技应用和生物识别系统,这些系统已经得到显着改善。在这个项目中,我们使用指纹模块和Arduino开发板来保存考勤数据和记录。使用指纹传感器,系统将让用户变得更加安全。以下部分介绍了使用Arduino制作基于指纹的生物识别考勤系统的技术细节。


所需组件

■    Arduino开发板 -1

■    指纹模块-1

■    按钮 - 4

■    LED -1

■    1K电阻-2

■    2.2K电阻-1

■    电源

■    连接导线

■    蜂鸣器-1

■    16x2 LCD -1

■    面包板-1

■    RTC模块-1


项目简介

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

fingerprint-attedance-block.jpg


指纹传感器模块

finger-print-sensor-module.jpg

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

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


指纹考勤系统的工作过程

这种指纹考勤系统项目的工作相当简单。首先,用户需要在按钮的帮助下登录用户的指纹。为此,用户需要按ENROLL键,然后LCD将要求输入指纹的ID,并通过ID名称将其保存在内存中。所以现在用户需要使用UP / DOWN键输入ID。选择ID后,用户需要按OK键(DEL键)。现在LCD将要求将手指放在指纹模块上。现在用户需要将手指放在手指打印模块上,然后模块拿手指图像。现在液晶显示屏将会从指纹模块中删除手指,再次要求再次放置手指。现在用户需要重新放置手指,模块会将图像转换为模板并将其通过选定的ID存储到指纹模块的内存中。现在用户将被注册,他/她可以通过将手指放在指纹模块上进行出席。通过相同的方法,所有用户将被注册到系统中。


现在如果用户要删除或删除任何存储的ID或指纹,那么他/她需要按DEL键。一旦删除键被按下LCD将要求选择需要删除的ID。现在用户需要选择ID,然后按OK键(相同的DEL键)。现在LCD将让您知道指纹已成功删除。

finger-print-based-attendance-system-using-arduino.jpg


指纹考勤系统项目中的出勤情况如何工作的:

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

与指纹模块一起,我们还使用RTC模块进行时间和日期。时间和日期在系统中不断运行。所以Arduino每当一个真实的用户将手指放在指纹上时都需要时间和日期,并将它们保存在内存分配的槽中的EEPROM中。

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


内存管理:

我们在Arduino UNO中有1023字节的内存,我们有1018个字节存储数据,我们已经收到了5天的用户考勤数据30天。并且每次出席将记录时间和日期,这样就成为7字节的数据。

所以需要的总内存是

5 * 30 * 7 = 1050,所以这里我们需要更多的32个字节

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

4 * 30 * 7 = 840

这里我们用5个用户的内存完成了这个项目的演示。这样,我们将无法存储第5位用户的32位或5位考勤记录。

您可以通过更改代码中的一些行来尝试4位用户。我在代码中提出了需要进行更改的意见。


指纹考勤系统工程电路图及描述

如上述的框图所示,该指纹考勤系统项目的电路非常简单。它有用于控制项目所有过程的Arduino开发板,用于注册、删除、选择ID和出席的按钮,用于警报的蜂鸣器,用于指示的LED和指示用户并显示所得到的消息的LCD。

finger-print-based-attendance-system-using-arduino-circuit_0.png

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

跳转到指定楼层
风筝
发表于: 2017-8-15 00:05:18 | 显示全部楼层

代码说明:

以下各节给出了arduino的指纹考勤系统代码。虽然注释可以很好地解释代码,但我们在这里讨论代码的几个重要部分。我们使用指纹库将指纹模块与Arduino开发板进行接口。

首先,我们包含了头文件,并定义输入和输出引脚,然后定义宏和声明的变量。此后,在设置函数中,我们定义了引脚方向,并初始化启动LCD和指纹模块。

之后,我们需要编写下载考勤数据的代码。

  1. void setup()
  2. {
  3.     delay(1000);
  4.     lcd.begin(16,2);
  5.     Serial.begin(9600);
  6.     pinMode(enroll, INPUT_PULLUP);
  7.     pinMode(up, INPUT_PULLUP);
  8.     pinMode(down, INPUT_PULLUP);
  9.     pinMode(del, INPUT_PULLUP);
  10.     pinMode(match, INPUT_PULLUP);
  11.     pinMode(buzzer, OUTPUT);
  12.     pinMode(indFinger, OUTPUT);
  13.     digitalWrite(buzzer, LOW);
  14.     if(digitalRead(enroll) == 0)
  15.     {
  16.       digitalWrite(buzzer, HIGH);
  17.       delay(500);
  18.       digitalWrite(buzzer, LOW);
  19.       lcd.clear();
  20.       lcd.print("Please wait");
  21.       lcd.setCursor(0,1);
  22.       lcd.print("Downloding Data");
复制代码

之后,我们需要编写代码清除EEPROM中的考勤数据。

  1. if(digitalRead(del) == 0)
  2.     {
  3.       lcd.clear();
  4.       lcd.print("Please Wait");
  5.       lcd.setCursor(0,1);
  6.       lcd.print("Reseting.....");
  7.       for(int i=1000;i<1005;i++)
  8.       EEPROM.write(i,0);
  9.       for(int i=0;i<841;i++)
  10.       EEPROM.write(i, 0xff);
  11.       lcd.clear();
  12.       lcd.print("System Reset");
  13.       delay(1000);
  14.     }
复制代码

之后,我们启动指纹模块,通过LCD显示欢迎信息,还引用了RTC模块。


之后,在loop函数中,我们读取了RTC时间并显示在LCD上

  1. void loop()
  2. {
  3.     now = rtc.now();
  4.     lcd.setCursor(0,0);
  5.     lcd.print("Time->");
  6.     lcd.print(now.hour(), DEC);
  7.     lcd.print(':');
  8.     lcd.print(now.minute(), DEC);
  9.     lcd.print(':');
  10.     lcd.print(now.second(), DEC);
  11.     lcd.print("    ");
  12.     lcd.setCursor(0,1);
  13.     lcd.print("Date->");
  14.     lcd.print(now.day(), DEC);
  15.     lcd.print('/');
  16.     lcd.print(now.month(), DEC);
  17.     lcd.print('/');
  18.     lcd.print(now.year(), DEC);
复制代码

之后,等待手指打印输入,并将捕获的图像ID与存储的ID进行比较。如果发生一次匹配,请继续下一步。并且同时检查注册del键

  1.   int result=getFingerprintIDez();
  2.     if(result>0)
  3.     {
  4.               digitalWrite(indFinger, LOW);
  5.               digitalWrite(buzzer, HIGH);
  6.               delay(100);
  7.               digitalWrite(buzzer, LOW);
  8.               lcd.clear();
  9.               lcd.print("ID:");
  10.               lcd.print(result);
  11.               lcd.setCursor(0,1);
  12.               lcd.print("Please Wait....");
  13.               delay(1000);
  14.               attendance(result);
  15.               lcd.clear();
  16.               lcd.print("Attendance ");
  17.               lcd.setCursor(0,1);
  18.               lcd.print("Registed");
  19.               delay(1000);
  20.         digitalWrite(indFinger, HIGH);
  21.         return;
  22. }
复制代码

void checkKeys() 函数用于检查Enroll或DEL键是否被按下,如果按下,需要做什么。如果ENROLL键按下,则调用Enroll() 函数,如果DEL键按,则调用delete()函数。

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


下面的函数用于拍摄指纹图像并将其转换为模板,并将所选ID保存到指纹模块存储器中。

  1. uint8_t getFingerprintEnroll()
  2. {
  3.   int p = -1;
  4.   lcd.clear();
  5.   lcd.print("finger ID:");
  6.   lcd.print(id);
  7.   lcd.setCursor(0,1);
  8.   lcd.print("Place Finger");
  9.   delay(2000);
  10.   while (p != FINGERPRINT_OK)
  11.   {
  12.     p = finger.getImage();
  13. ..... .....
  14. ....... ....
复制代码

下面的函数用于在EEPROM的分配时隙中存储考勤时间和日期

  1. void attendance(int id)
  2. {
  3.   int user=0,eepLoc=0;
  4.   if(id == 1)
  5.   {
  6.     eepLoc=0;
  7.     user=user1++;
  8.   }
  9.   else if(id == 2)
  10.   {
  11.     eepLoc=210;
  12.     user=user2++;
  13.   }
  14.   else if(id == 3)
  15.   .... ....
  16.   .....
复制代码

下面的函数用于从EEPROM中读取数据并发送到串行监视器

  1. void download(int eepIndex)
  2. {
  3.             
  4.             if(EEPROM.read(eepIndex) != 0xff)
  5.             {
  6.               Serial.print("T->");
  7.               if(EEPROM.read(eepIndex)<10)
  8.               Serial.print('0');
  9.               Serial.print(EEPROM.read(eepIndex++));
  10.               Serial.print(':');  
  11.               if(EEPROM.read(eepIndex)<10)
  12.               Serial.print('0');
  13.               Serial.print(EEPROM.read(eepIndex++));
  14.   .... ....
  15.   .....
复制代码

代码

附件是整个项目的代码: Fingerprint Based Biometric Attendance System using Arduino.rar (2.94 KB, 下载次数: 209)


译者注:本文翻译自https://circuitdigest.com/microc ... m-using-arduino-uno,感谢Saddam做出的贡献。如有错漏,敬请指正。

回复

使用道具 举报

dg38569274
发表于: 2018-6-24 17:00:35 | 显示全部楼层

楼主可以发下两个传感器的库吗
回复

使用道具 举报

风筝
发表于: 2021-4-7 21:12:21 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 10:43 , Processed in 0.052261 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表