用Raspberry Pi 建立自己的RFID考勤系统

嵌入式ARM 2019-04-10 16:20

来源:PiMyLifeUp

编译:Panda


在这个项目中,将向您展示如何设置和编程您自己的考勤系统,该系统使用RC522 RFID reader。



整个项目中,将展示如何组合使用RFID RC522阅读器和16×2 LCD的电路。


首先展示将这些电路连接到Raspberry Pi的GPIO引脚所需的所有步骤。还将向您展示如何测试每个电路,使其正常工作。这有助于确保所有内容都可以在我们的RFID考勤系统中使用。


第二部分中,将引导您完成设置数据库的所有步骤。还将编写Python脚本,与数据库通信以标记单个RFID卡的出席情况。


最后,设置一个简单的PHP脚本,可以直观地查看RFID考勤系统生成的数据。


您需要以下设备才能完成此项目。



可选的


 RFID考勤系统的主角:准备Raspbian

1.首先在Raspberry Pi上运行以下两个命令来确保Raspbian安装的所有内容都是最新的。

sudo apt-get update
sudo apt-get upgrade

2.现在安装接下来几节中依赖的所有软件包。

让我们首先运行build-essentialgitpython3-devpython3-pippython3-smbus,然后运行以下命令。

sudo apt-get install build-essential git python3-dev python3-pip python3-smbus

 构建16×2 LCD显示电路

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 1LCD(接地)到试验板接地

  • Pin 2LCD(VCC / 5V)到试验板

  • Pin 3LCD(V0)到中间线的的电位器

  • Pin 4LCD(RS)到GPIO4(物理引脚7)

  • Pin 5LCD(RW)到试验板接地

  • Pin 6LCD(EN)到GPIO24(物理引脚18)

  • Pin 11LCD(D4)到GPIO23(物理引脚16)

  • Pin 12LCD(D5)到GPIO17(物理引脚11)

  • Pin 13LCD(D6)到GPIO18(物理引脚12)

  • Pin 14LCD(D7)到GPIO22(物理引脚15)

  • Pin 15LCD(LED +)到试验板

  • Pin 16LCD(LED - )到试验板接地


RFID考勤系统LCD接线图

测试16×2 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

 构建RFID RC522读卡器电路

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考勤系统接线图

启用SPI接口

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的指南,了解启用正确内核模块的其他方法。

测试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然后按YENTER保存文件。

6.  现在通过运行以下脚本并在阅读器上点击RFID芯片来测试RFID RC522。

python3 ~/pi-rfid/read.py

 完整的Raspberry Pi RFID考勤系统电路

1.现在设置两个电路,仔细检查一切是否正常。通过运行我们在前几节中快速组合的测试脚本进行测试。

如果遇到问题,可以将最终电路与下图进行比较。下面这个图是完整的电路图,旨在让您了解最终电路的外观。

RFID考勤系统电路原理图

RFID考勤系统GPIO引脚使用

 准备RFID考勤系统数据库

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对象来提交对数据库的更改。如果不调用此函数,则不会发生INSERTUPDATE查询。

通过再次清除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工具;

 构建Web前端

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然后按YENTER保存文件。

5.对于我们的前端脚本,我们使用“ medoo ”和“ bootstrap ”。Medoo是一个轻量级框架,用于处理我们为考勤系统设置的数据库。

另一方面,Bootstrap是一个前端框架,可以更容易地开发干净的前端,而不必担心编写大量的CSS。

现在将脚本克隆到目录中,您现在应该可以通过转到Raspberry Pi的IP地址并在URL末尾添加/出席来检查前端,如下所示。

https://192.168.160/attendance

6.访问该网站后,您将看到以下网页,您可以点击“ 用户 ”查看当前用户,或点击“ 出勤 ”按钮查看用户的出席情况

如果你已经达到了这一点,那么一切都正常,你应该拥有一个基本的RFID,并且Raspberry Pi驱动的考勤系统正常运行。

欢迎页面

考勤系统用户页面

出勤页面

整个系统相对基础,但涵盖了良好的考勤系统所需的一切。您可以进一步扩展后端和前端以实现新功能,更好的用户界面等等。

嵌入式ARM 关注这个时代最火的嵌入式ARM,你想知道的都在这里。
评论
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 190浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 66浏览
  • 电动汽车(EV)正在改变交通运输,为传统内燃机提供更清洁、更高效的替代方案。这种转变的核心是电力电子和能源管理方面的创新,而光耦合器在其中发挥着关键作用。这些不起眼的组件可实现可靠的通信、增强安全性并优化电动汽车系统的性能,使其成为正在进行的革命中不可或缺的一部分。光耦合器,也称为光隔离器,是一种使用光传输电信号的设备。通过隔离高压和低压电路,光耦合器可确保安全性、减少干扰并保持信号完整性。这些特性对于电动汽车至关重要,因为精确控制和安全性至关重要。 光耦合器在电动汽车中的作用1.电池
    腾恩科技-彭工 2025-01-10 16:14 78浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 325浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 108浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 492浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 482浏览
  • 在不断发展的电子元件领域,继电器——作为切换电路的关键设备,正在经历前所未有的技术变革。固态继电器(SSR)和机械继电器之间的争论由来已久。然而,从未来发展的角度来看,固态继电器正逐渐占据上风。本文将从耐用性、速度和能效三个方面,全面剖析固态继电器为何更具优势,并探讨其在行业中的应用与发展趋势。1. 耐用性:经久耐用的设计机械继电器:机械继电器依靠物理触点完成电路切换。然而,随着时间的推移,这些触点因电弧、氧化和材料老化而逐渐磨损,导致其使用寿命有限。因此,它们更适合低频或对切换耐久性要求不高的
    腾恩科技-彭工 2025-01-10 16:15 100浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 498浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 523浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 444浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 457浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 466浏览
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 83浏览
我要评论
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦