来源:PiMyLifeUp
编译:Panda
在这个项目中,将向您展示如何设置和编程您自己的考勤系统,该系统使用RC522 RFID reader。
整个项目中,将展示如何组合使用RFID RC522阅读器和16×2 LCD的电路。
首先展示将这些电路连接到Raspberry Pi的GPIO引脚所需的所有步骤。还将向您展示如何测试每个电路,使其正常工作。这有助于确保所有内容都可以在我们的RFID考勤系统中使用。
第二部分中,将引导您完成设置数据库的所有步骤。还将编写Python脚本,与数据库通信以标记单个RFID卡的出席情况。
最后,设置一个简单的PHP脚本,可以直观地查看RFID考勤系统生成的数据。
您需要以下设备才能完成此项目。
可选的
1.首先在Raspberry Pi上运行以下两个命令来确保Raspbian安装的所有内容都是最新的。
sudo apt-get update
sudo apt-get upgrade
2.现在安装接下来几节中依赖的所有软件包。
让我们首先运行build-essential,git,python3-dev,python3-pip和python3-smbus,然后运行以下命令。
sudo apt-get install build-essential git python3-dev python3-pip python3-smbus
1.要开始我们的教程,首先要开始设置16×2 LCD。我们将快速完成设置这一切的过程。如果您想了解更多信息,可以查看16×2 LCD显示屏上的教程。
对于本教程的这一部分,请确保准备好以下内容。
8个公对公面包板线
8个公对母面包板线
16×2 LCD显示屏
10k欧姆电位器
面包板
2.准备好所需的所有部件,就可以通过观察下面的图表和步骤开始组装电路。
如果您按照我们的指南,将LCD连接到Raspberry Pi是一个非常简单的过程。我们已经包含了您需要进行的每个连接的物理引脚编号。
首先,让我们将各种组件与面包板连接起来。
5V(物理引脚2)到试验板正轨
接地(物理引脚6)到面包板接地导轨
放置16×2液晶显示器到右侧的的试验板
将电位计放在LCD显示屏旁边的面包板左侧。
在连接离开销的的电位器的地线
在连接右销的的电位器的正轨道
3.现在开始将LCD显示器连接到Raspberry Pi。
Pin 1的LCD(接地)到试验板接地轨
Pin 2的LCD(VCC / 5V)到试验板正轨
Pin 3的LCD(V0)到中间线的的电位器
Pin 4的LCD(RS)到GPIO4(物理引脚7)
Pin 5的LCD(RW)到试验板接地轨
Pin 6的LCD(EN)到GPIO24(物理引脚18)
Pin 11的LCD(D4)到GPIO23(物理引脚16)
Pin 12的LCD(D5)到GPIO17(物理引脚11)
Pin 13的LCD(D6)到GPIO18(物理引脚12)
Pin 14的LCD(D7)到GPIO22(物理引脚15)
Pin 15的LCD(LED +)到试验板正轨
Pin 16的LCD(LED - )到试验板接地轨
RFID考勤系统LCD接线图
1.现在已经设置好了电路,让我们继续进行测试,确保一切连接都正确。
首先,复制将用于此项目的Adafruit CharLCD库。如果您的显示板使用HD44780控制器,那么它将毫无问题地工作。
要将库复制到Raspberry Pi,请在其上运行以下命令。
git clone https://github.com/pimylifeup/Adafruit_Python_CharLCD.git
2.现在将库复制到我们的Raspberry Pi中,我们需要运行安装脚本。此脚本将安装库,以便任何Python脚本都可以使用它。
运行以下两个命令以进入新克隆的目录并运行setup.py脚本。
cd ./Adafruit_Python_CharLCD
sudo python3 setup.py install
3.将库安装到Raspberry Pi后,需要继续编辑示例文件来测试电路,因为我们使用不同的引脚来实现示例。
通过运行以下命令开始编辑文件。
nano ~/Adafruit_Python_CharLCD/examples/char_lcd.py
4. 在此文件中,找到“ #Raspberry Pi pin配置:”部分并进行更改,以使值与我们下面的值相匹配。
# Raspberry Pi pin configuration:
lcd_rs = 4
lcd_en = 24
lcd_d4 = 23
lcd_d5 = 17
lcd_d6 = 18
lcd_d7 = 22
完成更改后,按CTRL + X然后按Y然后按ENTER保存文件。
5.在开始运行新的修改示例之前,我们需要安装Raspberry Pi的GPIO Python库。
要安装所需的库,请运行以下命令。
sudo pip3 install RPi.GPIO
6. 要测试一切正常,现在运行下面的命令运行该python脚本。如果一切正常,您现在应该看到LCD上显示的文字。
python3 ~/Adafruit_Python_CharLCD/examples/char_lcd.py
1.现在已经设置了16×2 LCD显示器,接下来将RFID阅读器添加到该电路中。
有关将RFID RC522连接到电路的此部分,您需要准备好以下设备。
1个母对母面包板线
6个公对母面包板线
RFID RC522读/写器
面包板
2.一旦你掌握了RFID电路所需的一切,我们就可以继续为所有设备接线,由于LCD电路已经安装,这会稍微复杂一些。
请注意,此电路图假设您已按照上一节中LCD显示屏的步骤进行操作。如果您不使用LCD,请确保将Raspberry Pi上的Physical Pin 6连接到面包板上的地面导轨。
按照下面的图表和步骤将RFID电路连接到Raspberry Pi。
SDA连接到GPIO8(物理引脚24)
SCK连接到GPIO11(物理引脚23)
MOSI连接到GPIO10(物理引脚19)
MISO连接到GPIO9(物理引脚21)
GND连接到面包板接地导轨。
RST连接到GPIO25(物理引脚22)
3.3v连接到3v3(物理引脚1)
RC522 RFID考勤系统接线图
1.现在RFID连接到Raspberry Pi,我们需要进入raspi-config工具来启用SPI接口。此接口是必需的,以便我们可以与RC522模块通信。
要执行此操作,需要首先通过运行以下命令启动raspi-config工具。
sudo raspi-config
2.运行该命令后,您将看到一个屏幕,其中显示了您可以配置的各种选项。
在此屏幕上,使用箭头键向下并选择“ 5 Interfacing Options ”,然后按ENTER。
3.在下一个屏幕上,需要使用箭头键选择“ P4 SPI ”选项,选择后按ENTER。
4.现在需要确认是否要启用SPI接口。为此,您需要使用箭头键选择“ 是 ”,然后在选择后按ENTER键。
5. 现在应该成功启用SPI接口,现在您应该会在屏幕上看到“ SPI接口已启用 ” 的文本。
现在,在SPI接口完全启用之前,我们需要重新启动Raspberry Pi。我们可以通过按ENTER然后按ESC返回终端来实现这一点。
输入以下命令以重新启动Raspberry Pi。
sudo reboot
6. Raspberry Pi完成重启后,您可以通过运行以下命令来验证SPI接口是否已启用。
此命令将检索已启用的内核模块列表,并从该列表中获取包含文本“ spi ”的任何内容。
lsmod | grep spi
如果您在命令行中看到文本“ spi_bcm2835 ”,那么您现在可以继续测试电路是否正常工作。完成后,我们可以设置我们的RFID供电考勤系统。
如果没有出现,那么我们建议您查看我们关于设置RFID RC522的指南,了解启用正确内核模块的其他方法。
1. 现在使用以下“pip”命令克隆spidev库到我们的Raspberry Pi。
我们依靠spidev库与RFID阅读器界面进行交互。
sudo pip3 install spidev
2.现在已将spidev库安装到我们的Raspberry Pi中,我们需要使用“pip”命令继续下载MFRC522库。
这个库将处理我们的RFID考勤系统的繁重工作。
sudo pip3 install mfrc522
3.现在已在我们的Raspberry Pi上安装了MFRC522库和spidev库,让我们继续创建一个目录来保存我们的测试脚本。
mkdir ~/pi-rfid
4.现在需要编写一个简短的脚本来测试我们的RC522实际上能够读取RFID卡并且所有内容都正确连线。
首先,通过运行以下命令打开我们的新脚本,这将在我们最近创建的目录中创建一个名为“ read.py ” 的文件。
nano ~/pi-rfid/read.py
5.在此文件中输入以下代码行。如果您想在此处了解所有内容,我们建议您查看RFID RC522的完整指南。
#!/usr/bin/env python
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
reader = SimpleMFRC522()
try:
id, text = reader.read()
print(id)
print(text)
finally:
GPIO.cleanup()
完成后,按CTRL + X然后按Y和ENTER保存文件。
6. 现在通过运行以下脚本并在阅读器上点击RFID芯片来测试RFID RC522。
python3 ~/pi-rfid/read.py
1.现在设置两个电路,仔细检查一切是否正常。通过运行我们在前几节中快速组合的测试脚本进行测试。
如果遇到问题,可以将最终电路与下图进行比较。下面这个图是完整的电路图,旨在让您了解最终电路的外观。
RFID考勤系统电路原理图
RFID考勤系统GPIO引脚使用
1.在开始编程我们的RFID考勤系统之前,必须首先准备和设置MYSQL数据库。将在这个数据库中跟踪每张RFID卡的出勤情况以及谁拥有该RFID卡。
可以通过遵循我们的MySQL和PHPMyAdmin指南深入研究设置MYSQL 。RFID考勤系统将引导您完成大部分基础知识,但额外的指南将教您如何设置PHPMyAdmin等有用的工具。
首先在Pi上运行以下命令,将MYSQL安装到Raspberry Pi。
sudo apt-get install mysql-server -y
2. 接下来,需要运行MYSQL打包的“ 安全安装 ”脚本。此脚本将指导您完成使MYSQL服务器更安全的一些过程。
通过在Raspberry Pi上的终端中运行以下命令来运行此脚本。
sudo mysql_secure_installation
出现提示时,请确保为根MYSQL服务器设置新密码。此外,应该对大多数提示回答“ y ”,例如禁用对MYSQL服务器的root登录访问。
3.现在通过运行以下命令加载到MYSQL命令行工具中。系统将提示您输入在上一步中设置的密码。
由于MariaDB在安装时默认使用UNIX_SOCKET作为身份验证方法,因此我们需要使用超级用户登录,使用sudo执行此操作。
sudo mysql -u root -p
4. 首先创建一个数据库,我们将存储我们将用于RFID考勤系统的所有数据。
我们将命名这个数据库,“ attendancesystem ”。要创建此数据库,请运行以下命令。
CREATE DATABASE attendancesystem;
5.创建我们的数据库后,让我们创建一个名为“ attendanceadmin ”的用户,我们将在Python脚本中使用该用户从我们新创建的数据库中读取。
确保将此密码设置为独特且难以猜测的密码。对于我们的示例,我们将仅使用“ pimylifeup ”作为密码。
CREATE USER 'attendanceadmin'@'localhost' IDENTIFIED BY 'pimylifeup';
6. 现在我们已经创建了用户,我们需要赋予它访问我们的“ attendancesystem ”数据库的权限。
我们可以通过运行以下命令来完成此操作。此命令将为我们的“ attendanceadmin ”用户提供数据库中任何表的完全权限。
GRANT ALL PRIVILEGES ON attendancesystem.* TO 'attendanceadmin'@'localhost';
7. 在创建表之前,我们需要使用“ use ”命令,以便我们直接与“ attendancesystem ”数据库进行交互。
通过运行以下命令开始与数据库交互。
use attendancesystem;
8. 现在我们正在直接处理我们想要使用的数据库,现在我们可以开始创建存储所有数据的表。
运行以下两个命令将创建我们将依赖的表来存储数据。我们将在创建它们之后解释这些表中的字段。
create table attendance(
id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
user_id INT UNSIGNED NOT NULL,
clock_in TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ( id )
);
create table users(
id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
rfid_uid VARCHAR(255) NOT NULL,
name VARCHAR(255) NOT NULL,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ( id )
);
您可以通过输入exit离开MYSQL工具;
现在我们已经创建了表格,让我们看一下我们将要存储的数据以及我们将如何在脚本中使用它们。
对于考勤表,我们为每个记录的RFID水龙头持有三个数据。
id - 这是一个整数,用于跟踪当前行并自动增加。
user_id - 这是一个整数,我们利用它来将出勤率与我们的用户表中具有相同ID的用户联系起来。
clock_in - 此变量存储SQL 时间戳。该时间戳用于跟踪用户何时将RFID卡轻敲到RFID读取器上。
对于users表,我们为每个添加的用户保留了四个数据。
id - 这是一个整数,用于跟踪当前用户并自动增加。
rfid_uid - 此变量用于存储在RFID读取器上轻敲RFID卡时捕获的UID。
name - 此变量存储拥有RFID卡的人员的姓名。
created - 我们使用此变量来跟踪用户的创建时间。
1.在编写考勤系统脚本之前,我们首先需要使用pip 安装Python“ MYSQL Connector ”。
通过在Pi上运行以下命令来安装连接器库。
sudo pip3 install mysql-connector-python
2.现在,创建一个文件夹,完全服务于这个项目。
mkdir ~/attendancesystem
3.是时候开始为考勤系统编写我们的第一个Python脚本了。第一个脚本允许您基于轻敲的RFID卡创建用户。
点击RFID卡后,Python脚本会要求您输入用户名以将此卡注册到某人。
通过运行以下命令开始编写考勤系统的第一部分。
nano ~/attendancesystem/save_user.py
4.在新文件中写下以下代码行。将解释每个代码段的内容以及我们使用该代码的原因。
#!/usr/bin/env python
添加这一行,以便操作系统知道该文件应该使用Python执行。
import time
导入时间库,以便我们可以让脚本进入休眠状态,因此不会立即发生。
import RPi.GPIO as GPIO
需要GPIO库,以便在脚本结束时运行清理功能。
from mfrc522 import SimpleMFRC522
SimpleMFRC522库用于轻松与我们的RFID阅读器通信。
import mysql.connector
使用MySQL连接器,以便我们可以与之前设置的数据库进行通信。
import Adafruit_CharLCD as LCD
最后,加载Adafruit库与LCD交谈。这个库大大简化了与16×2显示器通信的过程。
db = mysql.connector.connect(
host="localhost",
user="attendanceadmin",
passwd="pimylifeup",
database="attendancesystem"
)
在代码的这一部分中,创建了与MYSQL服务器的连接。对于此功能,传递进行连接所需的所有信息,例如主机,用户,数据库名称和密码。
连接器创建的对象存储在db变量中,以便我们可以轻松地与数据库进行交互。
在输入此代码时,请确保使用本指南前面为“ attendanceadmin ”SQL用户设置的密码替换密码。
cursor = db.cursor()
这里我们从数据库连接中实例化游标对象的副本。我们利用这个对象与数据库交互并执行SQL查询。
reader = SimpleMFRC522()
现在我们通过将SimpleMFRC522库实例化为我们的reader对象来准备它。该库将允许我们稍后在脚本中与RC522轻松交谈以读取读取器的输入。
lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);
我们的最终设置线,该系列准备CharLCD库,用于处理16×2显示。对于此功能,我们传递所有必需的引脚数,行数等。
try:
while True:
lcd.clear()
lcd.message('Place Card to\nregister')
id, text = reader.read()
这段代码是用户创建逻辑的开始。首先在try:语句中包含整个逻辑,我们将在本指南的后面解释原因。
我们还将逻辑包装在一个True循环中。此循环将确保以下代码无限期运行,以便最终用户可以连续注册多个用户。
接下来,清除每个循环上的LCD,以确保我们在写入“将卡注册到屏幕”之前处理干净的显示。该文本提示用户将RFID卡放在阅读器上。
最后,利用SimpleMFRC522库从读卡器中读取输入。此功能将等到用户放置RFID阅读器,然后返回卡的ID和存储在其上的文本。
cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))
cursor.fetchone()
在本节中,使用游标执行我们的第一个SQL。在这个SQL语句中,只是搜索我们的“用户”表,看看是否有任何行与我们在读取RFID卡时检索到的ID具有匹配的RFID UID。
要获取检索到的数据,使用游标对象中的另一个函数,特别是fetchone()函数。此函数将从返回的结果中获取一行。
if cursor.rowcount >= 1:
lcd.clear()
lcd.message("Overwrite\nexisting user?")
overwrite = input("Overwite (Y/N)? ")
if overwrite[0] == 'Y' or overwrite[0] == 'y':
lcd.clear()
lcd.message("Overwriting user.")
time.sleep(1)
sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"
else:
continue;
else:
sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"
从本节开始,检查上一次SQL调用返回的行数。
如果SQL调用返回任何行,需要提示用户是否要覆盖现有用户。
在if语句中,继续清除LCD屏幕并显示消息“ Overwrite existing user?“并在命令行中提供一个提示,让用户响应Y覆盖或取消其他任何内容。
一旦输入函数收到输入,就需检查返回数据的第一个字符是否等于' Y '或' y '。
如果第一个字符与我们期望的相同,那么再次清除LCD。接下来,会显示一条消息“ 覆盖用户”一秒钟。
最后,构建SQL查询以使用我们在下一步中指定的新名称更新现有条目。执行此过程而不是删除旧条目并重新添加它。
如果用户对输入函数响应“ Y ”和“ y ”以外的任何内容,则使用“ continue ” 跳回循环的开头。
如果这不是一个重复的条目,我们构建一个不同的SQL查询来在我们的“ 用户 ”表中创建一个新条目。这个新条目将包含我们在下一个代码块中指定的新名称以及我们在用户点击其卡时获得的RFID ID。
lcd.clear()
lcd.message('Enter new name')
new_name = input("Name: ")
cursor.execute(sql_insert, (new_name, id))
db.commit()
lcd.clear()
lcd.message("User " + new_name + "\nSaved")
time.sleep(2)
finally:
GPIO.cleanup()
最后一段代码非常简单,并且包装了所有内容。我们首先再次清除LCD,并在液晶显示屏上提示用户输入新名称。
同时在控制台上,当我们利用输入等待用户的输入时,应出现文本“ Name: ” 。
一旦用户在控制台中输入了一个名称并按下回车键,我们就继续利用游标对象来执行我们在上一段代码中形成的查询。
另外,还创建了一个传递给execute函数的元组。此元组包含新名称和RFID卡的ID。这两个值都会在执行时自动传递给我们的查询字符串。
最后,通过使用.commit()函数调用db对象来提交对数据库的更改。如果不调用此函数,则不会发生INSERT和UPDATE查询。
通过再次清除LCD并显示新用户已保存的消息来结束我们的主代码逻辑。运行一个快速的2秒睡眠,让用户有足够的时间在重新启动循环之前查看消息。
最后,有finally:声明,这是我们的try:声明的另一部分。这段代码确保无论发生什么,我们都将运行GPIO.cleanup函数。例如,如果我们在脚本运行时按CTRL + C,它仍应清理GPIO状态。
6.希望在这一点上,已经完成了将脚本写入文件。
但是,如果您想检查并确保一切正确,那么您可以在下面找到完整版本的代码。
一旦您对所有内容感到满意,请按CTRL + X然后按Y并最后按ENTER保存文件。
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD
db = mysql.connector.connect(
host="localhost",
user="attendanceadmin",
passwd="pimylifeup",
database="attendancesystem"
)
cursor = db.cursor()
reader = SimpleMFRC522()
lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);
try:
while True:
lcd.clear()
lcd.message('Place Card to\nregister')
id, text = reader.read()
cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))
cursor.fetchone()
if cursor.rowcount >= 1:
lcd.clear()
lcd.message("Overwrite\nexisting user?")
overwrite = input("Overwite (Y/N)? ")
if overwrite[0] == 'Y' or overwrite[0] == 'y':
lcd.clear()
lcd.message("Overwriting user.")
time.sleep(1)
sql_insert = "UPDATE users SET name = %s WHERE rfid_uid=%s"
else:
continue;
else:
sql_insert = "INSERT INTO users (name, rfid_uid) VALUES (%s, %s)"
lcd.clear()
lcd.message('Enter new name')
new_name = input("Name: ")
cursor.execute(sql_insert, (new_name, id))
db.commit()
lcd.clear()
lcd.message("User " + new_name + "\nSaved")
time.sleep(2)
finally:
GPIO.cleanup()
7.保存save_user脚本后,继续进行操作,以确保一切都按预期运行,并且复制代码没有错误。
运行以下命令运行该脚本。
python3 ~/attendancesystem/save_user.py
8.如果不仔细检查您的代码和接线,请点击您的RFID卡,看看是否一切正常。如果您看到“ 用户保存”,那么一切都应该正常工作。
1.现在编写了save_user脚本并确保它正常工作,让我们转到check_attendance脚本。
该脚本将在无限循环中运行,检查来自RFID芯片的任何抽头。当有人点击他们的RFID芯片时,我们将在数据库中检查该芯片的ID。
如果找到用户,我们会设置一条欢迎消息并在考勤表中插入一个条目,该条目将包含当前日期和时间。
让我们使用以下命令开始编写脚本的过程。
nano ~/attendancesystem/check_attendance.py
2.输入以下代码行。我们将逐步解释每个新的代码部分,您将熟悉其中的一部分,因为我们在上一节的保存用户脚本中使用了它。
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD
db = mysql.connector.connect(
host="localhost",
user="attendanceadmin",
passwd="pimylifeup",
database="attendancesystem"
)
cursor = db.cursor()
reader = SimpleMFRC522()
lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);
try:
while True:
不会过多地讨论这段代码,因为它是在Raspberry Pi RFID考勤系统教程的最后一节中编写的第一个save_user.py脚本中重用的。
需要记住的主要事情是替换“ passwd ” 旁边指定的数据库密码,因为默认情况下它是我们的示例密码“ pimylifeup ”。
lcd.clear()
lcd.message('Place Card to\nrecord attendance')
id, text = reader.read()
在这段代码中,清除LCD屏幕并显示一条消息,提示用户将卡片放入记录出勤状态。然后我们等待RFID阅读器的响应。
cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))
result = cursor.fetchone()
lcd.clear()
在这里,执行我们的第一个SQL。此SQL语句从我们的“ 用户 ”表中获取“ id ”和“ name ”,其中用户具有与读取器上的卡相同的RFID ID。
然后,获取SQL查询返回的行,并将其结果存储到“ result ”变量中以供以后使用。
最后,清除LCD屏幕,以便在下一段代码中准备好打印新消息。
cursor.execute("SELECT id, name FROM users WHERE rfid_uid="+str(id))
result = cursor.fetchone()
lcd.clear()
在本节中,首先检查最后一个SQL请求是否返回任何行。如果它返回0,那么我们向16×2显示器显示“ 用户不存在”的消息。”
如果确实有一行,那么我们将继续显示欢迎用户的消息。我们使用从数据库中检索的名称作为结果[1]。
然后,创建一个SQL语句,在我们的考勤表中插入一行。我们需要传入我们从之前的SQL调用中检索到的用户id,并存储在result [0]中。
最后,提交对数据库的更改。
time.sleep(2)
finally:
GPIO.cleanup()
我们的最后一段代码很简单。我们让脚本休眠两秒钟,让用户有时间阅读我们在16×2显示器上显示的信息并移除RFID卡。
“ finally: ”语句确保我们在脚本完成后清理GPIO。
3.输入完所有代码后,可以根据下面的完整版本进行检查。
输入所有代码时要注意的主要事项是确保所有缩进都相同。每个级别应分隔两个空格。
一旦您对一切都正确感到满意,请按CTRL + X然后按Y并最后按ENTER保存文件。
#!/usr/bin/env python
import time
import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522
import mysql.connector
import Adafruit_CharLCD as LCD
db = mysql.connector.connect(
host="localhost",
user="attendanceadmin",
passwd="pimylifeup",
database="attendancesystem"
)
cursor = db.cursor()
reader = SimpleMFRC522()
lcd = LCD.Adafruit_CharLCD(4, 24, 23, 17, 18, 22, 16, 2, 4);
try:
while True:
lcd.clear()
lcd.message('Place Card to\nrecord attendance')
id, text = reader.read()
cursor.execute("Select id, name FROM users WHERE rfid_uid="+str(id))
result = cursor.fetchone()
lcd.clear()
if cursor.rowcount >= 1:
lcd.message("Welcome " + result[1])
cursor.execute("INSERT INTO attendance (user_id) VALUES (%s)", (result[0],) )
db.commit()
else:
lcd.message("User does not exist.")
time.sleep(2)
finally:
GPIO.cleanup()
4.保存脚本后,让我们继续并快速浏览它,检查一切是否正常。
输入以下命令运行脚本,然后按照16×2显示屏上显示的提示进行操作。
python3 ~/attendancesystem/check_attendance.py
如果您遇到任何错误,请务必仔细检查所有代码是否已正确输入。
1.既然已经编写并测试了我们的保存用户脚本和检查考勤脚本,那么请继续查看数据库以查看新条目。
通过运行以下命令启动MYSQL命令行工具。在继续之前,系统将提示您输入为root用户输入的密码。
我们使用sudo作为此命令,因为MariaDB默认使用UNIX_SOCKET进行身份验证。
sudo mysql -u root -p
2.连接到MYSQL命令行后,我们需要使用“ use ”命令。需要使用此命令,以便我们可以交互我们的“ attendancesystem ”数据库。
运行以下命令以与“ attendancesystem ”数据库进行交互。
use attendancesystem;
3.现在直接与我们的“attendancesystem”数据库进行交互,首先查看我们的脚本创建的所有用户。
可以通过运行指定“ users ”表的简单SELECT SQL调用来完成此操作。下面的查询中使用的星号(*)表示我们想要抓取所有列。
键入以下命令以获取“ users ”表中可用的所有用户。
SELECT * FROM users;
从这个命令,您应该看到类似我们下面的内容。
+--+------------------+---------+------------------------+
| id | rfid_uid | name | created |
+--+------------------+---------+------------------------+
| 1 | 160747764001 | Emmet | 2019-01-31 11:28:04 |
+--+------------------+---------+------------------------+
4.现在检查了“ 用户 ”表,让我们继续看看我们的“ 出勤 ”表。就像之前的查询一样,我们只是从“ 考勤 ”表中选择所有列。
输入以下命令以获取所有数据。
SELECT * FROM attendance;
从这个命令,您应该在命令行中看到类似我们的内容。您可以将“user_id”引用回“用户”表“id”以查看用户输入的用户。
+----+---------+---------------------+
| id | user_id | clock_in |
+----+---------+---------------------+
| 6 | 1 | 2019-02-01 03:23:30 |
| 7 | 1 | 2019-02-01 03:35:36 |
| 8 | 1 | 2019-02-01 03:36:51 |
+----+---------+---------------------+
您可以通过输入exit离开MYSQL工具;
1.在开始本节之前,要求您设置NGINX以用于PHP。按照我们的Raspberry Pi NGINX指南了解如何执行此操作。
一旦你启动并运行NGINX和PHP,现在就可以开始在考勤系统中编写一些前端了。这个前端使您可以直观地看到当前用户以及他们何时点击了阅读器。
首先创建一个目录,使我们的脚本保持在默认的NGINX文件夹中。
sudo mkdir /var/www/html/attendance
2.您应该已经在Raspberry Pi上安装了GIT,所以现在是时候将前端脚本克隆到我们在第一步中创建的文件夹了。
通过运行以下命令从GitHub存储库中克隆代码。此命令将使用git将代码克隆到出勤文件夹中。
sudo git clone https://github.com/pimylifeup/attendance-system-frontend.git /var/www/html/attendance
3.现在克隆了脚本,我们需要对“ common.php ”文件进行一次修改,以便我们利用您在本指南中设置的数据库登录。
通过运行以下行开始修改脚本。
sudo nano /var/www/html/attendance/common.php
4.在此脚本中,找到以下部分,并确保使用您自己的密码替换密码。
找:
'password' => 'pimylifeup'
更改了行后,按CTRL + X然后按Y和ENTER保存文件。
5.对于我们的前端脚本,我们使用“ medoo ”和“ bootstrap ”。Medoo是一个轻量级框架,用于处理我们为考勤系统设置的数据库。
另一方面,Bootstrap是一个前端框架,可以更容易地开发干净的前端,而不必担心编写大量的CSS。
现在将脚本克隆到目录中,您现在应该可以通过转到Raspberry Pi的IP地址并在URL末尾添加/出席来检查前端,如下所示。
https://192.168.160/attendance
6.访问该网站后,您将看到以下网页,您可以点击“ 用户 ”查看当前用户,或点击“ 出勤 ”按钮查看用户的出席情况。
如果你已经达到了这一点,那么一切都正常,你应该拥有一个基本的RFID,并且Raspberry Pi驱动的考勤系统正常运行。
欢迎页面
考勤系统用户页面
出勤页面
整个系统相对基础,但涵盖了良好的考勤系统所需的一切。您可以进一步扩展后端和前端以实现新功能,更好的用户界面等等。