在这篇文章中,我们将构建一个基于rfid的考勤系统,该系统可以记录给定时间窗口内 12 名学生/教职员工的出勤情况,该系统最多可以记录每人 255
名考勤。
什么是rfid考勤系统
我们不需要任何关于基于rfid的考勤系统的介绍,它被用于大学,办公室,图书馆,以了解一个人在什么时间进出多少次或多少人。
在这个项目中,我们将构建一个最简单的基于rfid的考勤系统,该系统不会使项目过于复杂。
在这个项目中,我们将使用rtc模块,该模块用于在给定的时间段内启用和禁用考勤系统,以便我们可以阻止迟到者。
rfid模块“rfid-rc522”可以在基于恩智浦的rfid标签上进行读写操作。恩智浦是全球rfid标签的领先生产商,我们可以轻松地在线和离线商店购买它们。
使用16 x 2 lcd显示屏,用于显示时间,日期,出席人数等信息。
最后使用arduino板,这是项目的大脑。您可以选择任何版本的主板。
现在让我们继续看原理图:
arduino 到 lcd 显示屏连接:
只需按照下图连接接线,并使用 10 千欧姆电位计调整对比度。
arduino 到 rfid 模块连接:
rfid 模块必须由 3.3v 供电,5v 可能会损坏板载组件。rfid-rc522模块在与arduino通信时采用spi通信协议工作。
电路的其余部分:
arduino可以由9v墙上适配器供电。有一个蜂鸣器和 led 指示检测到卡。提供了 4
个按钮,用于查看考勤、清除内存以及“是”和“否”按钮。
硬件部分到此结束。
现在我们必须为 rtc 模块设置正确的时间才能执行此操作,按照以下步骤完成硬件设置。
打开 arduino ide。
导航到文件》示例》ds1307rtc》设置时间。
上传代码。
将代码上传到arduino后,打开串行监视器。现在,rtc与计算机的时间同步。
现在,您必须找到所有12个rfid卡/标签的uid或唯一标识号。要查找 uid,请上传以下代码并打开串行监视器。
//-------------------------program developed by
r.girish------------------//
#include 《spi.h》
#include 《mfrc522.h》
#define ss_pin 10
#define rst_pin 9
mfrc522 rfid(ss_pin, rst_pin);
mfrc522::mifare_key key;
void setup()
{
serial.begin(9600);
spi.begin();
rfid.pcd_init();
}
void loop() {
if ( ! rfid.picc_isnewcardpresent())
return;
if ( ! rfid.picc_readcardserial())
return;
mfrc522::picc_type picctype = rfid.picc_gettype(rfid.uid.sak);
if (picctype != mfrc522::picc_type_mifare_mini &&
picctype != mfrc522::picc_type_mifare_1k &&
picctype != mfrc522::picc_type_mifare_4k)
{
serial.println(f(“your tag is not of type mifare classic, your card/tag
can‘t be read :(”));
return;
}
string strid = “” ;
for (byte i = 0; i 《 4; i ++)
{
strid +=
(rfid.uid.uidbyte[i] 《 0x10 ? “0” : “”) +
string(rfid.uid.uidbyte[i], hex) +
(i != 3 ? “:” : “” );
}
strid.touppercase();
serial.print(“your card’s uid: ”);
serial.println(strid);
rfid.picc_halta ();
rfid.pcd_stopcrypto1 ();
}
//-------------------------program developed by
r.girish------------------//
打开串行监视器。
扫描rfid模块上的卡/标签。
现在,您将看到每张卡的一些十六进制代码。
写下来,我们将在下一个程序中输入这些数据。
主程序:
//-------------------------program developed by
r.girish------------------//
#include 《liquidcrystal.h》
#include 《eeprom.h》
#include 《spi.h》
#include 《mfrc522.h》
#include 《wire.h》
#include 《timelib.h》
#include 《ds1307rtc.h》
#define ss_pin 10
#define rst_pin 9
mfrc522 rfid(ss_pin, rst_pin);
mfrc522::mifare_key key;
const int rs = 7;
const int en = 6;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
const int led = 8;
boolean ok = false;
liquidcrystal lcd(rs, en, d4, d5, d6, d7);
const int list = a0;
const int clm = a1;
const int yes = a2;
const int no = a3;
int h = 0;
int m = 0;
int s = 0;
int i = 0;
int id1 = 0;
int id2 = 0;
int id3 = 0;
int id4 = 0;
int id5 = 0;
int id6 = 0;
int id7 = 0;
int id8 = 0;
int id9 = 0;
int id10 = 0;
int id11 = 0;
int id12 = 0;
char uid[] = “”;
// **************************** settings ************************ //
// ------ from -------- // (set the time range for attendance in hours 0 to
23)
int h = 21; // hrs
int m = 00; // min
// ------- to ------- //
int h1 = 21; // hrs
int m1 = 50; //min
// ---------------- set uids ----------------- //
char uid1[] = “f6:97:ed:70”;
char uid2[] = “45:b8:af:c0”;
char uid3[] = “15:9f:a5:c0”;
char uid4[] = “c5:e4:ad:c0”;
char uid5[] = “65:1d:af:c0”;
char uid6[] = “45:8a:af:c0”;
char uid7[] = “15:9f:a4:c0”;
char uid8[] = “55:cb:af:c0”;
char uid9[] = “65:7d:af:c0”;
char uid10[] = “05:2c:aa:04”;
char uid11[] = “55:7d:aa:04”;
char uid12[] = “bd:8a:16:0b”;
// -------------- names -----------------------//
char name1[] = “student1”;
char name2[] = “student2”;
char name3[] = “student3”;
char name4[] = “student4”;
char name5[] = “student5”;
char name6[] = “student6”;
char name7[] = “student7”;
char name8[] = “student8”;
char name9[] = “student9”;
char name10[] = “student10”;
char name11[] = “student11”;
char name12[] = “student12”;
// ********************************************************** //
void setup()
{
serial.begin(9600);
lcd.begin(16, 2);
spi.begin();
rfid.pcd_init();
pinmode(yes, input);
pinmode(no, input);
pinmode(list, input);
pinmode(led, output);
pinmode(clm, input);
digitalwrite(clm, high);
digitalwrite(led, low);
digitalwrite(yes, high);
digitalwrite(no, high);
digitalwrite(list, high);
}
void loop()
{
if (digitalread(list) == low)
{
read_data();
}
if (digitalread(clm) == low)
{
clear_memory();
}
tmelements_t tm;
if (rtc.read(tm))
{
lcd.clear();
h = tm.hour;
m = tm.minute;
s = tm.second;
lcd.setcursor(0, 0);
lcd.print(“time:”);
lcd.print(tm.hour);
lcd.print(“:”);
lcd.print(tm.minute);
lcd.print(“:”);
lcd.print(tm.second);
lcd.setcursor(0, 1);
lcd.print(“date:”);
lcd.print(tm.day);
lcd.print(“/”);
lcd.print(tm.month);
lcd.print(“/”);
lcd.print(tmyeartocalendar(tm.year));
delay(1000);
} else {
if (rtc.chippresent())
{
lcd.setcursor(0, 0);
lcd.print(“rtc stopped!!!”);
lcd.setcursor(0, 1);
lcd.print(“run settime code”);
} else {
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“read error!”);
lcd.setcursor(0, 1);
lcd.print(“check circuitry!”);
}
}
if (h == h)
{
if (m == m)
{
ok = true;
}
}
if (h == h1)
{
if (m == m1)
{
ok = false;
}
}
if ( ! rfid.picc_isnewcardpresent())
return;
if ( ! rfid.picc_readcardserial())
return;
mfrc522::picc_type picctype = rfid.picc_gettype(rfid.uid.sak);
if (picctype != mfrc522::picc_type_mifare_mini &&
picctype != mfrc522::picc_type_mifare_1k &&
picctype != mfrc522::picc_type_mifare_4k)
{
serial.println(f(“your tag is not of type mifare classic, your card/tag
can‘t be read :(”));
}
string strid = “” ;
for (byte i = 0; i 《 4; i ++)
{
strid +=
(rfid.uid.uidbyte[i] 《 0x10 ? “0” : “”) +
string(rfid.uid.uidbyte[i], hex) +
(i != 3 ? “:” : “” );
}
strid.touppercase();
if (ok == false)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“attendance is”);
lcd.setcursor(0, 1);
lcd.print(“closed.”);
delay(1000);
}
if (ok)
{
//-----------------------------------//
if (strid == uid1)
{
id1 = eeprom.read(1);
id1 = id1 + 1;
if (id1 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id1 != 256)
{
eeprom.write(1, id1);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid2)
{
id2 = eeprom.read(2);
id2 = id2 + 1;
if (id2 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id2 != 256)
{
eeprom.write(2, id2);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid3)
{
id3 = eeprom.read(3);
id3 = id3 + 1;
if (id3 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id3 != 256)
{
eeprom.write(3, id3);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid4)
{
id4 = eeprom.read(4);
id4 = id4 + 1;
if (id4 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id4 != 256)
{
eeprom.write(4, id4);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid5)
{
id5 = eeprom.read(5);
id5 = id5 + 1;
if (id5 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id5 != 256)
{
eeprom.write(5, id5);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid6)
{
id6 = eeprom.read(6);
id6 = id6 + 1;
if (id6 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id6 != 256)
{
eeprom.write(6, id6);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid7)
{
id7 = eeprom.read(7);
id7 = id7 + 1;
if (id7 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id7 != 256)
{
eeprom.write(7, id7);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid8)
{
id8 = eeprom.read(8);
id8 = id1 + 1;
if (id8 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id8 != 256)
{
eeprom.write(8, id8);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid9)
{
id9 = eeprom.read(9);
id9 = id9 + 1;
if (id9 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id9 != 256)
{
eeprom.write(9, id9);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid10)
{
id10 = eeprom.read(10);
id10 = id10 + 1;
if (id10 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id10 != 256)
{
eeprom.write(10, id10);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid11)
{
id11 = eeprom.read(11);
id11 = id11 + 1;
if (id11 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id11 != 256)
{
eeprom.write(11, id11);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
//-----------------------------------//
if (strid == uid12)
{
id12 = eeprom.read(12);
id12 = id12 + 1;
if (id12 == 256)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“memory is full”);
lcd.setcursor(0, 1);
lcd.print(“please clear all.”);
for (i = 0; i 《 20; i++)
{
digitalwrite(led, high);
delay(100);
digitalwrite(led, low);
delay(100);
}
i = 0;
return;
}
if (id12 != 256)
{
eeprom.write(12, id12);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“your attendance”);
lcd.setcursor(0, 1);
lcd.print(“registered !!!”);
digitalwrite(led, high);
delay(1000);
digitalwrite(led, low);
return;
}
}
if (strid != uid1 || strid != uid2 || strid != uid3 || strid != uid4
|| strid != uid5 || strid != uid6 || strid != uid7 || strid != uid8
|| strid != uid9 || strid != uid10 || strid != uid11 || strid != uid12)
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(“unknown rfid”);
lcd.setcursor(0, 1);
lcd.print(“card !!!”);
for (i = 0; i 《 3; i++)
{
digitalwrite(led, high);
delay(200);
digitalwrite(led, low);
delay(200);
}
}
rfid.picc_halta ();
rfid.pcd_stopcrypto1();
}
}
void read_data()
{
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name1);
lcd.print(“:”);
lcd.print(eeprom.read(1));
lcd.setcursor(0, 1);
lcd.print(name2);
lcd.print(“:”);
lcd.print(eeprom.read(2));
delay(2000);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name3);
lcd.print(“:”);
lcd.print(eeprom.read(3));
lcd.setcursor(0, 1);
lcd.print(name4);
lcd.print(“:”);
lcd.print(eeprom.read(4));
delay(2000);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name5);
lcd.print(“:”);
lcd.print(eeprom.read(5));
lcd.setcursor(0, 1);
lcd.print(name6);
lcd.print(“:”);
lcd.print(eeprom.read(6));
delay(2000);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name7);
lcd.print(“:”);
lcd.print(eeprom.read(7));
lcd.setcursor(0, 1);
lcd.print(name8);
lcd.print(“:”);
lcd.print(eeprom.read(8));
delay(2000);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name9);
lcd.print(“:”);
lcd.print(eeprom.read(9));
lcd.setcursor(0, 1);
lcd.print(name10);
lcd.print(“:”);
lcd.print(eeprom.read(10));
delay(2000);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(name11);
lcd.print(“:”);
lcd.print(eeprom.read(11));
lcd.setcursor(0, 1);
lcd.print(name12);
lcd.print(“:”);
lcd.print(eeprom.read(12));
delay(2000);
}
void clear_memory()
{
lcd.clear();
lcd.print(0, 0);
lcd.print(f(“clear all data?”));
lcd.setcursor(0, 1);
lcd.print(f(“long press: y/n”));
delay(2500);
serial.print(“yes”);
if (digitalread(yes) == low)
{
eeprom.write(1, 0);
eeprom.write(2, 0);
eeprom.write(3, 0);
eeprom.write(4, 0);
eeprom.write(5, 0);
eeprom.write(6, 0);
eeprom.write(7, 0);
eeprom.write(8, 0);
eeprom.write(9, 0);
eeprom.write(10, 0);
eeprom.write(11, 0);
eeprom.write(12, 0);
lcd.clear();
lcd.setcursor(0, 0);
lcd.print(f(“all data cleared”));
lcd.setcursor(0, 1);
lcd.print(f(“****************”));
delay(1500);
}
if (digitalread(no) == low);
{
return;
}
}
//-------------------------program developed by
r.girish------------------//
---------------- 设置用户界面----------------- //
字符 uid1[] = “f6:97:ed:70”;
字符 uid2[] = “45:b8:af:c0”;
字符 uid3[] = “15:9f:a5:c0”;
char uid4[] = “c5:e4:ad:c0”;
字符 uid5[] = “65:1d:af:c0”;
char uid6[] = “45:8a:af:c0”;
字符 uid7[] = “15:9f:a4:c0”;
char uid8[] = “55:cb:af:c0”;
字符 uid9[] = “65:7d:af:c0”;
字符 uid10[] = “05:2c:aa:04”;
字符 uid11[] = “55:7d:aa:04”;
字符 uid12[] = “bd:8a:16:0b”;
//----------------------------------------------//
您这里有地名:
--------------名字-----------------------//
字符名称 1[] = “学生 1”;
字符名称 2[] = “学生 2”;
字符名称 3[] = “学生 3”;
字符名称 4[] = “学生 4”;
字符名称 5[] = “学生 5”;
字符名称 6[] = “学生 6”;
字符名称 7[] = “学生 7”;
字符名称 8[] = “学生 8”;
字符名称 9[] = “学生 9”;
字符名称 10[] = “学生 10”;
字符名称 11[] = “学生 11”;
字符名称 12[] = “学生 12”;
//--------------------------------------------//
将学生 1、学生 2 替换为您想要的任何名称或保持原样。
您必须设置从何时到考勤系统应该处于活动状态的时间,其余时间当我们扫描rfid标签/卡时,系统不会注册考勤:
------从--------//
整数 h = 21;小时
int m = 00;最小值
-------自-------//
整数 h1 = 21;小时
int m1 = 50;最小值
//-------------------------//
上半部分是开始时间,下半部分是结束时间。您必须输入从 0 到 23 的小时和从 00 到 59 的分钟。
电流互感器的选择与配置 电流互感器型号有哪些
电子组装ESD标准的意义
多尼卡创新的无线AVOD系统获得CAAC STC
汽车线束搭铁设计对电磁兼容的影响
诺基亚将向该缅甸运营商Ooredoo提供托管安全服务组合
如何构建一个基于RFID的考勤系统?
一款黑科技产品问世了,健身房智能镜子震撼来袭
破除“夏”厨痛点,爱TA,就用科恩6520大吸力体感触控烟机
大疆DJI Care服务新增飞丢保障权益
如何从LED灯泡上卸下AC / DC转换器以节省能源
移动医疗影像应用激增,远程诊断数据安全是关键
拉绳位移传感器原理及应用
膝关节护理仪的设计特点是什么
刘庆峰两会探讨“增效减负”,讯飞智能学习机实力助力青少年
高低温冲击试验箱的技术参数及测试标准
NVIDIA Triton 系列文章(8):用户端其他特性
小米9SE全息幻彩蓝高清图赏
整流桥电阻有哪些作用 整流桥电阻装反了会怎么样
腾讯广告启动“新国货数字加速计划”,形成了全链路数字化营销体系
微型传动系统在服务器机器人中的应用分析