使用树莓派和 RFID 读取器打造一个考勤系统?

在这个树莓派 RFID 考勤系统项目中,我们将向您展示如何使用 RC522 RFID 读取器来设置和编程自己的考勤系统。


在整个项目中,我们将向您展示如何将同时使用 RFID RC522 阅读器和 16 ×2 LCD 的电路组合在一起。

我们首先向您展示将这些电路连接到树莓派的 GPIO 引脚所需的所有步骤。我们还将向您展示如何测试每个电路,以使其正常工作。这有助于确保一切准备就绪,可以在我们的 RFID 考勤系统中使用。

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

最后,我们让您设置一个简单的 PHP 脚本,该脚本使您可以直观地查看 RFID 考勤系统产生的数据。

本教程有很多工作要做,但是一旦考勤系统正常工作,您将很高兴。

设备

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

推荐的

  • 树莓派

  • Micro SD 卡如果您使用的是树莓派 2、 3 或 B +

  • 电源

  • 以太网线

  • RC522 RFID 阅读器

  • 16×2 LCD,带 [header pin] [https://go.pimylifeup.com/QAuvqH/amazon/headerpins)

  • 10k 欧姆电位器

  • Breadboard (如果您使用的是 [突破套件],则需要一个大的 []/breakoutkit))

  • Breadboard Wire

可选的

  • 树莓派外壳

  • USB 键盘

  • USB 鼠标

视频

我们整理了一段视频,将介绍建立该 RFID 考勤系统的所有步骤。很长,但是涵盖了所有步骤。

如果您需要更详尽的说明,则强烈建议您阅读视频下方的完整书面教程。我们投入了大量工作,希望您喜欢它。

Adblock 阻止了视频?订阅我们的无广告服务,为我们提供支持。

为您的 RFID 考勤系统准备 Raspbian

1 首先,我们将通过在 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

建立 16 ×2 LCD 显示电路

1 要开始我们的教程,我们将首先开始设置 16 ×2 LCD。我们将快速完成所有设置过程。如果您想了解更多信息,可以查看我们的关于 16 ×2 LCD 显示器的教程。

对于本教程的这一部分,请确保您准备好以下内容。

  • 8 根公对公面包板线
  • 8 根公对母面包板线
  • 16×2 LCD 显示屏
  • 10k 欧姆电位器
  • 面包板

2 拥有所需的所有零件之后,您可以通过观察以下图表和步骤来开始组装电路。

如果遵循我们的指南,则将 LCD 连接到树莓派的过程非常简单。我们已经为您需要建立的每个连接提供了物理引脚号。

首先,让我们将各种组件与面包板连接起来。

  • ** 5V (物理引脚 2) 至面包板正 ** 导轨
  • 接地 (物理引脚 6) 至面包板接地导轨
  • 将 ** 16×2 LCD 显示屏放置在面包板的右侧
  • 将电位器放在面板左侧旁边, LCD 显示屏 **。
  • 将电位器左销连接到地线 **
  • 将电位器右销连接到正轨 **3 现在开始将 LCD 显示器连接到树莓派。
  • ** LCD (接地) 的引脚 1 ** 至面包板接地 ** 导轨
  • ** LCD LCD (VCC/5V) 的引脚 2 至面包板正 ** 导轨
  • ** LCD (V0) 的引脚 3 ** 至电位器的中间线
  • ** LCD **(RS) 的引脚 4 ** 至 GPIO4 **(物理引脚 7 )
  • ** LCD LCD (RW) 的引脚 5 到面包板接地 ** 导轨
  • ** LCD (EN) 的引脚 6 ** 至 GPIO24 **(物理引脚 18)
  • ** LCD **(D4) 的引脚 11 ** 至 GPIO23 **(物理引脚 16 )
  • ** LCD **(D5) 的引脚 12 ** 至 GPIO17 **(物理引脚 11 )
  • ** LCD **(D6) 的引脚 13 ** 至 GPIO18 **(物理引脚 12 )
  • ** LCD **(D7) 的引脚 14 ** 至 GPIO22 **(物理引脚 15 )
  • ** LCD LCD (LED +) 的引脚 15 至面包板正 ** 导轨
  • ** LCD LCD (LED-) 的引脚 16 至面包板接地 ** 导轨

** RFID 考勤系统 LCD 接线图 **

测试 16 ×2 LCD 显示器

1 至此,电路已经设置好,让我们继续进行测试,以确保所有接线均正确。

首先,继续克隆我们将用于此项目的 Adafruit CharLCD 库。如果您的显示板使用 ** HD44780 ** 控制器,则它将正常工作。

要将库克隆到您的树莓派,请在其上运行以下命令。

git clone https://github.com/pimylifeup/Adafruit_Python_CharLCD.git

2 现在,将库克隆到我们的树莓派中,我们需要运行安装脚本。该脚本将安装该库,以便任何 Python 脚本都可以使用它。

运行以下两个命令以移至新克隆的目录并运行 ** setup.py ** 脚本。

cd ./Adafruit_Python_CharLCD
sudo python3 setup.py安装

3 将库安装到树莓派后,我们需要继续编辑示例文件。我们需要这样做以测试电路,因为我们使用与示例所用引脚不同的引脚。

通过运行以下命令开始编辑文件。

vim 〜/Adafruit_Python_CharLCD/examples/char_lcd.py

4 在此文件中,找到”** #树莓派引脚配置 **:” 部分并进行更改,以使值与下面的值匹配。

#树莓派引脚配置:
lcd_rs = 4
lcd_en = 24
lcd_d4 = 23
lcd_d5 = 17
lcd_d6 = 18
lcd_d7 = 22

进行更改后,请依次按 ** CTRL + X Y ** 和 ENTER * 保存文件。

5 现在,在继续运行我们的新修改示例之前,我们将需要安装树莓派的 GPIO Python 库。

要安装所需的库,请运行以下命令。

sudo pip3安装 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 ,请确保将树莓派上的 ** Physical Pin 6 连接到面包板上的 ground rail **。

请按照下面的图和步骤将 RFID 电路连接到树莓派。

  • ** 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 已连接到我们的树莓派,我们将需要进入 raspi-config ** 工具来启用 SPI 接口。此接口是必需的,以便我们可以与 RC522 模块进行通信。

为此,您需要先通过运行以下命令来启动 raspi -config 工具。

sudo raspi-config**2** 运行命令后,您将看到一个屏幕,显示可以配置的各种选项。

目前,我们仅对激活 SPI 接口感兴趣。如果您想了解更多信息,可以查看我们的 Raspi-Config 工具的最终指南。

在该屏幕上,使用箭头键向下并选择” 5 Interface Options **”,然后按 ENTER 键。

3 在下一个屏幕上,您将要使用选择”** P4 SPI “选项,选择后按 ENTER **。

4 现在,您将需要确认是否要启用 SPI 接口。为此,您将需要使用箭头键选择” 是”,然后然后选择 ** ENTER **。

5 SPI 接口现在应该已成功启用,并且您现在应该会在屏幕上看到文本”** SPI 接口已启用 **”。

现在,在完全启用 SPI 接口之前,我们将需要重新启动树莓派。我们可以通过按 ENTER 键然后按 ESC 键返回到终端来实现。

输入以下命令以重新启动树莓派。

sudo reboot

6 一旦树莓派完成重启,您可以通过运行以下命令来验证 SPI 接口是否已启用。

该命令将检索已启用内核模块的列表,并从该列表中获取包含文本”** spi **” 的所有内容。

lsmod | grep spi

如果您在命令行中看到文本”** spi \ _bcm2835 **”,那么您现在可以继续测试电路是否正常工作了。一旦完成,我们就可以设置我们的 RFID 考勤系统。

如果未出现,那么我们建议您查看有关设置 RFID RC522 的指南,以了解启用正确内核模块的其他方法。 。

测试 RFID RC522

1 我们现在使用以下”pip” 命令将 spidev 库安装到我们的树莓派中。

我们依靠 spidev 库与 RFID 阅读器接口进行交互。

sudo pip3安装 spidev 

2 现在,我们已经将 spidev 库安装到我们的树莓派中,我们需要继续使用”pip” 命令下载 ** MFRC522 库 **。

该库将处理我们的 RFID 考勤系统的繁重工作。

sudo pip3 安装 mfrc522 

3 现在,我们已经将 MFRC522 库和 spidev 库都安装到了树莓派中,让我们继续创建目录以保留测试脚本。

mkdir〜/pi-rfid

4 现在,我们需要编写一个简短的脚本来测试我们的 RC522 实际上是否能够读取 RFID 卡以及所有接线是否正确。

首先,通过运行以下命令打开新脚本,这将在我们最近创建的目录中创建一个名为”** read.py **” 的文件。

vim 〜/pi-rfid/read.py

5 在该文件中输入以下代码行。如果您想在这里对所有内容进行解释,那么我们建议您阅读 RFID RC522 的完整指南。

#!/usr/bin/env python

将 RPi .GPIO导入为 GPIO 
从 mfrc522 导入 SimpleMFRC522 

读者= SimpleMFRC522()
尝试:
        ID,文字= reader.read()
        打印(id)
        打印(文字)
最后:
        GPIO.cleanup()

完成后,按 ** CTRL + X ,然后按 Y ENTER **,保存文件。

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

python3〜/pi-rfid/read.py

完整的树莓派 RFID 考勤系统电路

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

如果遇到问题,可以将最终电路与下图进行比较。这些图旨在使您了解最终电路的外观。

** RFID 考勤系统电路原理图 **

使用了 RFID 考勤系统 GPIO 引脚

准备 RFID 考勤系统数据库

1 现在,在继续对 RFID 考勤系统进行编程之前,我们必须首先准备并设置 MYSQL 数据库。我们将在该数据库中跟踪每个 RFID 卡的出勤情况以及谁拥有该 RFID 卡。

您可以按照我们的 MySQL 教程和 PHPMyAdmin 指南深入研究 MYSQL 的设置。 -phpmyadmin /)。我们的 RFID 考勤系统将引导您完成大多数基础知识,但额外的指南将教您如何设置有用的工具,例如 PHPMyAdmin 。

首先在 Pi 上运行以下命令,将 MYSQL 安装到树莓派上。 sudo apt-get install mysql-server -y
2 接下来,我们将需要运行 MYSQL 随附的” 安全安装 “脚本。该脚本将指导您完成一些使 MYSQL 服务器更安全的过程。

通过在树莓派上的终端中运行以下命令来运行此脚本。

sudo mysql _secure_installation

出现提示时,请确保您为根 MYSQL 服务器设置了新密码。另外,您应该对大多数提示回答”** y **”,例如禁用对您的 MYSQL 服务器的 root 登录访问。

3 现在,通过运行以下命令将其加载到 MYSQL 命令行工具中。系统将提示您输入在上一步中设置的密码。

默认情况下,由于 MariaDB 在安装时使用 UNIX \ _SOCKET 作为身份验证方法,因此我们需要使用超级用户登录,请使用 sudo ** 进行登录。

sudo mysql -u root -p

4 首先,我们创建一个数据库,我们将在其中存储将用于 RFID 考勤系统的所有数据。

我们将命名该数据库为” 考勤系统 “。要创建此数据库,请运行以下命令。

创建数据库出勤系统;

5 创建数据库后,我们现在创建一个名为”** attendanceadmin **” 的用户,我们将在 Python 脚本中利用该用户从新创建的数据库中进行读取。

确保为此设置了唯一且难以猜测的密码。对于我们的示例,我们将仅使用”** pimylifeup **” 作为密码。

创建用户'attendanceadmin'@'localhost'由'pimylifeup'标识;

6 现在,我们已经创建了用户,我们需要授予它访问” 出勤系统 “数据库的权限。

我们可以通过运行以下命令来做到这一点。此命令将为我们的”** attendanceadmin **” 用户提供数据库中任何表的全部特权。

*将所有特权授予出勤系统。*至'attendanceadmin'@'localhost';

7 。在创建表之前,我们需要利用”** use “命令,以便我们直接与” attenceancesystem **” 数据库进行交互。

通过运行以下命令开始与数据库进行交互。

使用考勤系统;

8 现在,我们正在直接处理要利用的数据库,现在我们可以开始创建表,在其中将存储所有数据。

运行以下两个命令将创建我们将用来存储数据的表。创建它们后,我们将解释这些表中的字段。

创建表出勤(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
   user_id INT UNSIGNED NOT NULL,
   clock_in TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   主键(id)
);

创建表用户(
   id INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE,
   rfid_uid VARCHAR(255)NOT NULL,
   名称 VARCHAR (255)NOT NULL,
   创建的 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   主键(id)
);

您可以通过输入 ** exit; ** 离开 MYSQL 工具。

现在我们已经创建了表,让我们看一下将要存储的数据以及如何在脚本中使用它们。

对于” 出勤率” 表,每个记录的 RFID 抽头都保存三个数据。

  • ** id ** –这是一个整数,用于跟踪当前行并自动增加。
  • ** user \ _id ** –这是一个整数,我们利用它来将出勤人数与我们的 ** user 表中具有相同 id ** 的用户联系起来。
  • ** clock \ _in - 此变量存储 SQL ** 时间戳。此时间戳用于跟踪用户何时将其 RFID 卡点击到 RFID 阅读器上。

对于 ** users ** 表,我们为所添加的每个用户保存四段数据。

  • ** id ** –这是一个整数,用于跟踪当前用户并自动增加。
  • ** rfid \ _uid ** –该变量用于存储在 RFID 阅读器上轻按 RFID 卡时捕获的 UID 。
  • 名称 –此变量存储拥有 RFID 卡的人的姓名。
  • 创建 –我们使用此变量来跟踪创建用户的时间。

在考勤系统中记录用户

1 在编写考勤系统脚本之前,我们需要首先使用 pip 安装 Python “** MYSQL Connector **”。

通过在 Pi 上运行以下命令来安装连接器库。

sudo pip3安装 mysql -connector-python

2 现在,我们创建一个文件夹来保留此项目的所有内容。

mkdir〜/考勤系统

3 是时候开始为我们的出勤系统编写我们的第一个 Python 脚本了。第一个脚本将使您可以基于轻敲的 RFID 卡创建用户。

轻触 RFID 卡后,Python 脚本将要求您输入用户名以将该卡注册给他人。

通过运行以下命令开始编写我们的考勤系统的第一部分。

vim 〜/attendancesystem/save_user.py**4** 在此新文件中编写以下代码行。我们将解释代码的每个部分在做什么,以及为什么要使用该代码。
#!/usr/bin/env python

我们添加此行,以便操作系统知道该文件应使用 Python 执行。

导入时间

我们导入了” 时间库”**,以便我们可以使脚本进入休眠状态,这样就不会立即发生。

将 RPi .GPIO导入为 GPIO 

我们需要 ** GPIO 库 **,以便在脚本结束时可以运行清除功能。

从 mfrc522 导入 SimpleMFRC522 

SimpleMFRC522 库用于简化与我们的 RFID 阅读器的通讯。

导入 mysql .connector

我们利用 ** MySQL 连接器 **,以便我们可以与之前建立的数据库进行通讯。

导入 Adafruit _CharLCD作为 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 查询。

读者= SimpleMFRC522()

现在,我们通过将它实例化到我们的读者对象来准备 SimpleMFRC522 库。该库使我们可以在脚本的后面轻松地与 RC522 进行对话,以读取来自阅读器的输入。

lcd = LCD.Adafruit_CharLCD(4,24,23,17,18,22,16,2,4);

我们的最终设置线,该行准备了 CharLCD 库以处理 16 ×2 的显示。对于此功能,我们传入所有必需的引脚号,行数等。

尝试:
  而 True :
    lcd.clear()
    lcd.message("将卡放置到\ n注册")
    ID,文字= reader.read()

此代码块是我们用户创建逻辑的开始。我们将首先在 ** try:** 语句中包装整个逻辑,我们将在本指南的后面部分解释原因。

我们还将逻辑包装在 True 循环中。此循环将确保下面的代码将无限期运行,以便最终用户可以连续注册多个用户。

接下来,我们清除每个循环的 LCD ,以确保在将”Place card to register” 写入屏幕之前,我们正在处理干净的显示。此文本提示用户将其 RFID 卡放在读取器上。

最后,我们利用 SimpleMFRC522 库从阅读器中读取输入。此功能将一直等到用户放置其 RFID 读取器后,才返回卡的 ID 和存储在其中的文本。

    cursor.execute("从用户那里选择 ID ,其中 rfid _uid ="+ str(id))
    cursor.fetchone()

在本节中,我们使用游标执行 SQL 的第一位。在此 SQL 语句中,我们只是在搜索” 用户” 表,以查看是否有任何行具有与读取 RFID 卡时检索到的 ID 匹配的 RFID UID。

为了获取我们检索到的数据,我们利用了游标对象中的另一个函数,特别是 fetchone () 函数。此函数将从返回的结果中获取一行。

    如果 cursor .rowcount> = 1:
      lcd.clear()
      lcd.message("覆盖\存在的用户?")
      覆盖=输入("覆盖(是/否)?")

      如果 overwrite [0] =='Y'或 overwrite [0] =='y':
        lcd.clear()
        lcd.message("覆盖用户。")
        time.sleep(1)
        sql_insert ="更新用户 SET 名称=%s,其中 rfid _uid =%s"
      其他:
        继续;
    其他:
      sql_insert ="将用户(名称,rfid_uid)插入到值(%s,%s)中"

在本节中,我们首先检查上一次 SQL 调用返回了多少行。

如果 SQL 调用返回任何行,我们需要提示用户是否要覆盖已经存在的用户。

在 if 语句内,我们继续清除 LCD 屏幕并显示消息” 覆盖现有用户?“,并在命令行中提示用户,以要求 Y 覆盖或取消其他操作。

** input 函数收到输入后,我们将检查返回数据的第一个字符是否等于’ Y ‘或’ y **’。

如果第一个字符与我们期望的相等,则再次清除 LCD 。接下来,我们显示一则消息” 覆盖用户 “一秒钟。最后,我们构建 SQL 查询以使用在下一步中指定的新名称更新现有条目。我们执行此过程,而不是删除旧条目并重新添加它。
如果用户对输入函数的响应不是”** Y “和” y “,我们将使用” continue **” 跳回到循环的开始。

如果这不是重复的条目,我们将构建一个不同的 SQL 查询以在”** users **” 表中创建一个新条目。这个新条目将包含我们在下一个代码块中指定的新名称以及当用户轻按其卡时获得的 RFID ID。

    lcd.clear()
    lcd.message('输入新名称')
    new_name = input("Name:")

    cursor.execute(sql_insert,(new_name,id))

    db.commit()

    lcd.clear()
    lcd.message("用户"+ new_name +"\ nSaved")
    time.sleep(2)
最后:
  GPIO.cleanup()

我们的最后一段代码非常简单,并且将所有内容包装起来。我们首先要清除 LCD ,然后在 LCD 上提示用户他们需要输入新名称。

同时,在控制台上,当我们利用 ** input 来等待用户输入时,应该显示文本” Name:**”。

一旦用户在控制台中输入了名称,然后按 Enter ,我们就可以利用光标对象执行我们在上一部分代码中形成的查询。

我们还将创建一个元组,并将其传递给 execute 函数。该元组包含新名称和 RFID 卡的 ID 。这两个值将在执行时自动传递到我们的查询字符串中。

最后,我们通过使用。 commit ()** 函数调用 db 对象将更改提交到数据库。如果我们不调用此函数,则不会发生 INSERT UPDATE ** 查询。

通过再次清除 LCD 并显示新用户已保存的消息,我们结束了主要代码逻辑。我们运行了 2 秒钟的快速睡眠,以便在重新启动循环之前为用户提供足够的时间来查看消息。

最后,我们有 ** finally:语句,这是 try:语句的另一部分。这段代码确保无论发生什么情况,我们都将运行 GPIO.cleanup 函数。例如,如果在脚本运行时按 CTRL + C **,它仍应清除 GPIO 状态。

6 希望在这一点上,您已经完成了将脚本写入文件的操作。

但是,如果您要检查并确保所有内容都正确,则可以在下面找到完整版本的代码。

对所有内容满意后,请依次按 ** CTRL + X ,然后按 Y **,最后按 ENTERENTER 保存文件。

#!/usr/bin/env python

导入时间
将 RPi .GPIO导入为 GPIO 
从 mfrc522 导入 SimpleMFRC522 
导入 mysql .connector
导入 Adafruit _CharLCD作为 LCD 

db = mysql.connector.connect(
  host ="localhost",
  user ="attendanceadmin",
  passwd ="pimylifeup",
  database ="attendancesystem"
)

cursor = db.cursor()
读者= SimpleMFRC522()
lcd = LCD.Adafruit_CharLCD(4,24,23,17,18,22,16,2,4);

尝试:
  而 True :
    lcd.clear()
    lcd.message("将卡放置到\ n注册")
    ID,文字= reader.read()
    cursor.execute("从用户那里选择 ID ,其中 rfid _uid ="+ str(id))
    cursor.fetchone()

    如果 cursor .rowcount> = 1:
      lcd.clear()
      lcd.message("覆盖\存在的用户?")
      覆盖=输入("覆盖(是/否)?")
      如果 overwrite [0] =='Y'或 overwrite [0] =='y':
        lcd.clear()
        lcd.message("覆盖用户。")
        time.sleep(1)
        sql_insert ="更新用户 SET 名称=%s,其中 rfid _uid =%s"
      其他:
        继续;
    其他:
      sql_insert ="将用户(名称,rfid_uid)插入到值(%s,%s)中"
    lcd.clear()
    lcd.message('输入新名称')
    new_name = input("Name:")

    cursor.execute(sql_insert,(new_name,id))

    db.commit()

    lcd.clear()
    lcd.message("用户"+ new_name +"\ nSaved")
    time.sleep(2)
最后:
  GPIO.cleanup()

7 保存了我们的 ** save \ _user ** 脚本后,让我们继续尝试一下,以确保一切正常进行,并且复制代码没有任何错误。

通过运行以下命令来运行脚本。

python3〜/attendancesystem/save_user.py

8 轻按您的 RFID 卡,然后仔细检查代码和接线,看看一切是否正常运行。如果您看到” 用户已保存 “,则说明一切正常。

录音出席

1 现在,我们已经编写了 ** save \ _user 脚本并确保其正常工作,让我们继续执行 check \ _attendance ** 脚本。

此脚本将无限循环运行,以检查 RFID 芯片中的所有抽头。当有人点击其 RFID 芯片时,我们将在数据库中检查该芯片的 ID 。如果找到用户,我们将设置一条欢迎消息,并在出勤表中插入一个具有当前日期和时间的条目。
让我们使用以下命令开始编写脚本的过程。

vim 〜/attendancesystem/check_attendance.py

2 输入以下代码行。我们将逐步解释每个新的代码部分,您将在上一节的 save user 脚本中利用它,对它们有些熟悉。

#!/usr/bin/env python
导入时间
将 RPi .GPIO导入为 GPIO 
从 mfrc522 导入 SimpleMFRC522 
导入 mysql .connector
导入 Adafruit _CharLCD作为 LCD 

db = mysql.connector.connect(
  host ="localhost",
  user ="attendanceadmin",
  passwd ="pimylifeup",
  database ="attendancesystem"
)

cursor = db.cursor()
读者= SimpleMFRC522()

lcd = LCD.Adafruit_CharLCD(4,24,23,17,18,22,16,2,4);

尝试:
  而 True :

我们不会在此代码块上做太多介绍,因为所有代码都可以从我们在本树莓派 RFID 出勤系统教程的最后一部分中编写的第一个 save \ _user.py ** 脚本中重复使用。

您需要记住的主要事情是替换在”** passwd “旁边指定的数据库密码,因为默认情况下,这是我们的示例密码” pimylifeup **”。

    lcd.clear()
    lcd.message("将卡放置到\ n记录出席信息")
    ID,文字= reader.read()

在此代码块中,我们清除 LCD 屏幕并显示一条消息,提示用户放置他们的卡来记录考勤。然后,我们等待 RFID 读取器的响应。

    cursor.execute("SELECT id,name from Users WHERE rfid_uid ="+ str(id))
    结果= cursor.fetchone()

    lcd.clear()

在这里,我们执行 SQL 的第一位。该 SQL 语句从”** users “表中同时获取” id “和” name “,其中用户具有与所窃取的卡相同的 RFID ID ** 读者。

然后,我们获取 SQL 查询返回的行,并将其结果存储到”** result **” 变量中,以备后用。

最后,我们清除 LCD 屏幕,以便准备在我们的下一部分代码中打印新消息。

    cursor.execute("SELECT id,name from Users WHERE rfid_uid ="+ str(id))
    结果= cursor.fetchone()

    lcd.clear()

在本节中,我们首先检查最后一个 SQL 请求是否返回任何行。如果返回 0 ,则在 16 ×2 显示屏上显示一条消息,提示” 用户不存在。

如果确实有一行,则继续显示一条欢迎用户的消息。我们使用从数据库中检索到的它们的名称作为 ** result \ [1] **。

之后,我们执行一条 SQL 语句,将一行插入到我们的出勤表中。我们需要传递从先前的 SQL 调用中检索到的用户 ID ,并将其存储在 ** result \ [0] ** 中。

最后,我们将更改提交到数据库。

    time.sleep(2)
最后:
  GPIO.cleanup()

我们的最后一部分代码很简单。我们将脚本休眠两秒钟,以使用户有时间阅读我们在 16 ×2 显示屏上显示的消息并取出 RFID 卡。

“** finally:**” 语句确保脚本完成后我们清除 GPIO 。

3 输入完所有代码后,您可以对照下面的完整版本进行检查。

输入所有代码时要注意的主要事情是确保所有缩进都相同。每个级别应分隔两个空格。

当您满意所有设置正确之后,请依次按 ** CTRL + X ,然后按 Y **,最后按 ENTER * 保存文件。

#!/usr/bin/env python
导入时间
将 RPi .GPIO导入为 GPIO 
从 mfrc522 导入 SimpleMFRC522 
导入 mysql .connector
导入 Adafruit _CharLCD作为 LCD 

db = mysql.connector.connect(
  host ="localhost",
  user ="attendanceadmin",
  passwd ="pimylifeup",
  database ="attendancesystem"
)

cursor = db.cursor()
读者= SimpleMFRC522()

lcd = LCD.Adafruit_CharLCD(4,24,23,17,18,22,16,2,4);

尝试:
  而 True :
    lcd.clear()
    lcd.message("放置卡\ n记录出勤")
    ID,文字= reader.read()

    cursor.execute("选择 ID ,从用户那里输入名称 rfid _uid ="+ str(id))
    结果= cursor.fetchone()

    lcd.clear()

    如果 cursor .rowcount> = 1:
      lcd.message("欢迎"+结果[1])
      cursor.execute("插入出席(user_id)值(%s)",(结果[0],))
      db.commit()
    其他:
      lcd.message("用户不存在。")
    time.sleep(2)
最后:
  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 **” 数据库进行交互。

使用考勤系统;

3 现在,我们直接与” 考勤系统” 数据库进行交互,让我们首先检查一下由脚本创建的所有用户。

我们可以通过运行一个简单的 ** SELECT ** SQL 调用来实现此目的,该调用指定了我们的”** users “表。以下查询中使用的星号 ( \ ***) 表示我们要获取所有列。

输入以下命令以获取”** users **” 表中所有可用的用户。

SELECT * FROM用户;

通过此命令,您应该看到类似下面的内容。

+-+ ------------------ + --------- + ----------------- ------- +
| id | rfid_uid |名称|创建|
+-+ ------------------ + --------- + ----------------- ------- +
| 1 | 160747764001 | Emmet | 2019-01-31 11:28:04 |
+-+ ------------------ + --------- + ----------------- ------- +

4 现在我们已经检查了” 用户 “表,让我们继续来看一下” 出勤 “表。就像我们上一个查询一样,我们只是从” 出席 “表中选择所有列。

输入以下命令以获取所有数据。

选择*从出席;

从此命令中,您应该在命令行中看到类似下面的内容。您可以将”user \ _id” 引用回”users” 表”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 一起使用。您可以通过遵循我们的树莓派 NGINX 指南来找到执行此操作的方法。

一旦启动并运行了 NGINX 和 PHP ,我们现在就可以开始向我们的考勤系统编写一些前端。该前端使您可以直观地查看当前用户以及在阅读器上点击时的状态。

首先创建一个目录,以将我们的脚本保留在默认的 NGINX 文件夹中。

sudo mkdir /var/www/html/attendance

2 您应该已经在树莓派上安装了 [GIT],所以现在是时候将前端脚本克隆到该文件夹​​了我们在第一步中创建的

通过运行以下命令,从我们的 GitHub 存储库克隆代码。此命令将使用 git 将代码克隆到出勤文件夹中。

sudo git clone https://github.com/pimylifeup/attendance-system-frontend.git/var/www/html/attendance

3 现已克隆脚本,我们将需要对”** common.php **” 文件进行一次修改,以便我们利用您在本指南中设置的数据库登录名。

通过运行以下行开始修改脚本。

sudo vim /var/www/html/attendance/common.php

4 在此脚本中,找到以下部分,并确保将密码替换为您自己的密码。

找:

    '密码'=>'pimylifeup'

更改了该行后,请按 ** CTRL + X ,然后按 Y ENTER **,保存文件。

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

另一方面,Bootstrap 是一个前端框架,它使开发外观简洁的前端变得更加容易,而不必担心编写大量 CSS 。

现在将脚本克隆到目录中,您现在应该可以通过以下方式检出前端:树莓派的 IP 地址,并在 URL 的末尾添加 **/attendance **,如下所示。

https://192.168.160/出席**6** 进入网站后,您会看到以下网页,您可以从此处单击"** Users **"签出当前用户,或通过单击"**出勤**"按钮。

如果您到了这一步,那么一切都会按预期进行,现在您应该拥有一个基本的 RFID ,并且树莓派供电的考勤系统已经启动并正在运行。

欢迎页面

考勤系统用户页面

出勤页面

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

我希望到目前为止,您已经拥有一个功能全面的树莓派 RFID 考勤系统。如果您有任何反馈,提示或其他任何东西,请不要在下面发表评论。

分享到