树莓派考勤打卡系统,详细步骤搭建和使用RC522 RFID

在这个Raspberry Pi RFID考勤系统项目中,详细记录了如何利用RC522 RFID阅读器搭建一个考勤打卡系统。

Raspberry-Pi-RFID-Attendance-System-Thumbnail-Watermarky.jpg

首先,展示如何将这些电路连接到Raspberry Pi的GPIO引脚,还将展示如何测试每个电路,使其正常工作。

然后,引导您完成建立数据库的所有步骤,还将编写Python脚本,与数据库通信,为个人的RFID卡标记考勤。

最后,设置一个简单的PHP脚本,让你直观地看到RFID考勤系统产生的数据。

在本教程中,有相当多的工作要做,但一旦你完成了这个考勤系统,你会非常有成就感。

设备清单

要完成这个项目,你需要以下设备,点击链接可直达特别优惠购买。

建议:

可选:

为RFID考勤系统准备Raspbian

1. 开始时,首先要确保Raspbian安装的所有东西都是最新的,在Raspberry Pi上运行以下两个命令。

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液晶显示电路

1. 首先开始设置16×2的LCD,将快速运行这一切的设置过程。如果你想了解更多的内容,可以查看我的16×2液晶显示器教程。

开始本教程之前,请确保已经准备好了以下元件。

  • 8条公头至公头面包板线
  • 8根公头转母头面包板线
  • 16×2液晶显示器
  • 10k欧姆电位器
  • 面包板

2. 一旦有了所有所需的零件,就可以观察下面的图和步骤开始组装电路。

如果按照我的指南将LCD连接到Raspberry Pi是一个非常简单的过程,每个连接的物理引脚号我都标注了出来。

首先,把各种元件与面包板连接起来。

  • 5V(物理引脚2)至面包板正极轨
  • 接地(物理引脚6)至面包板接地轨
  • 将16×2液晶显示器放入面包板的右侧。
  • 将电位器放入面包板左侧的LCD显示屏旁。
  • 将电位器的左脚连接到地线上。
  • 将电位器的右脚连接到正极。

3. 现在开始将液晶显示器连接到树莓派上。

  • LCD(Ground)的1号引脚接面包板地线
  • LCD的2号引脚(VCC/5V)至面包板正极。
  • 液晶显示器(V0)的3号脚接电位器的中线。
  • LCD(RS)的4号引脚至GPIO4(物理引脚7)
  • 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(LED +)的15号引脚至面包板正轨
  • LCD(LED-)的16号引脚接面包板地线

RFID考勤系统LCD布线图

LCD-Display-Wiring-Schematic.png

LCD-Display-Raspberry-Pi-GPIO-Pins-.png

测试16×2液晶显示器

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引脚配置: “部分,并修改它,使其与我们下面的值一致。

# 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上的物理引脚6连接到面包板上的地轨。

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

  • SDA连接到GPIO8(物理引脚24)。
  • SCK连接到GPIO11(物理引脚23)。
  • MOSI连接到GPIO10(物理引脚19)。
  • MISO连接到GPIO9(物理引脚21)。
  • GND连接到面包板接地轨。
  • RST连接到GPIO25(物理引脚22)。
  • 3.3v连接到3v3(物理引脚1)。

RC522 RFID考勤系统接线图谱

Raspberry-Pi-rfid-rc522-attendance-schematic.png

rfid-rc522-attendance-GPIO-Pins.png

启用SPI接口

1. 现在RFID已经连接到Raspberry Pi上,需要进入raspi-config工具来启用SPI接口。这个接口是必需的,这样就可以和RC522模块进行通信。

要做到这一点,首先运行以下命令来启动 raspi-config 工具。

sudo raspi-config

2. 运行该命令后,会看到一个屏幕,显示了可以配置的各种选项。

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

在这个屏幕上使用方向键向下选择 “5个接口选项”,然后按ENTER键。

3. 在下一个屏幕上,你要用方向键选择 “P4 SPI “选项,一旦选择,按ENTER键。

4. 现在您需要确认是否要启用SPI接口。为此,您需要使用方向键选择 “Yes”,然后在选择后按回车键。

5. 现在SPI接口应该已经成功启用,您现在应该看到屏幕上出现 “The SPI interface is enabled “的文字。

现在在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. 现在我们已经将MFRC522库和spidev库安装到了Raspberry Pi上,让我们继续制作一个目录来保存我们的测试脚本。

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

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

1. 现在设置了两个电路,仔细检查一切都在正常工作。通过运行我们在前面几节中快速整理的测试脚本进行测试。

如果您有问题,您可以将您的最终电路与下面的图表进行比较。这些图是为了让您了解最终的电路应该是怎样的。

RFID考勤系统电路原理图

Raspberry-Pi-LCD-Display-and-RFID-RC522-Schematic.png

RFID考勤系统GPIO引脚的使用情况

LCD-Display-and-RFID-Raspberry-Pi-GPIO-Pins-.png

准备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”,比如禁止root登录访问你的MYSQL服务器。

3. 现在让我们通过运行下面的命令加载到MYSQL命令行工具中。系统会提示你输入上一步设置的密码。

由于MariaDB在安装时默认使用UNIX_SOCKET作为认证方式,所以我们需要使用超级用户登录,使用sudo来完成。

sudo mysql -u root -p

4. 让我们先建立一个数据库,我们将在这里存储所有数据,我们的RFID考勤系统将利用这些数据。

我们将把这个数据库命名为” attendancesystem”。要创建这个数据库,请运行以下命令。

CREATE DATABASE attendancesystem;

5. 我们创建了数据库,现在让我们创建一个名为 “考勤管理员 “的用户,我们将在Python脚本中利用这个用户从我们新创建的数据库中读取数据。

确保你设置的密码是独特的和难以猜测的。在我们的例子中,我们将使用 “pimylifeup “作为密码。

CREATE USER 'attendanceadmin'@'localhost' IDENTIFIED BY 'pimylifeup';

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

我们可以通过运行以下命令来实现。这条命令将赋予我们的 “考勤管理员 “用户在数据库中任何表上的全部权限。

GRANT ALL PRIVILEGES ON attendancesystem.* TO 'attendanceadmin'@'localhost';

7. 在创建表之前,我们需要利用 “使用 “命令,这样我们就可以直接与 “endanceystem “数据库进行交互。

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

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 tap都持有三条数据。

  • id – 这是一个整数,用于跟踪当前行并自动增加。
  • user_id – 这是一个整数,我们利用它将考勤与用户表中具有相同id的用户联系起来。
  • clock_in – 这个变量存储了一个SQL时间戳。这个时间戳用于跟踪用户何时将RFID卡拍到RFID阅读器上。

对于用户表,我们为每一个添加的用户保留四条数据。

  • id – 这是一个整数,用于跟踪当前用户并自动增加。
  • rfid_uid – 这个变量用于存储当RFID卡在RFID阅读器上被点击时捕获的UID。
  • name – 这个变量存储了拥有RFID卡的人的名字。
  • created – 我们用这个变量来跟踪用户的创建时间。

在考勤系统中记录用户的情况

1. 在开始编写考勤系统脚本之前,我们首先需要用pip安装Python “MYSQL连接器”。

在您的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变量中,这样我们就可以方便地与数据库进行交互。

在输入该代码时,请确保将密码替换为本指南前面为 “考勤管理员 “SQL用户设置的密码。

cursor = db.cursor()

在这里,我们从数据库连接中实例化一个游标对象的副本。我们利用这个对象与数据库进行交互,并执行SQL查询。

reader = SimpleMFRC522()

现在我们准备SimpleMFRC522库,将它实例化到我们的阅读器对象中。这个库将允许我们在稍后的脚本中轻松地与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:语句将整个逻辑包装起来,我们将在后面的指南中解释为什么。

我们还将我们的逻辑包裹在一个while True循环中。这个循环将确保下面的代码会无限期地运行,这样最终用户就可以连续注册多个用户。

接下来,在屏幕上写下 “Place card to register”(放卡注册)之前,我们要清除每一个循环的LCD,以确保我们处理的是一个干净的显示器。这段文字提示用户将他们的RFID卡放在阅读器上。

最后,我们利用SimpleMFRC522库来读取阅读器的输入。这个函数会等到用户将他们的RFID读写器放置好后才返回卡的id和存储在卡上的文本。

    cursor.execute("SELECT id FROM users WHERE rfid_uid="+str(id))
    cursor.fetchone()

在本节中,我们使用游标来执行第一条SQL语句。在这条SQL语句中,我们只是简单的搜索 “用户 “表,看看是否有任何行的RFID UID与我们读取RFID卡时的ID相匹配。

为了抓取我们检索到的数据,我们利用游标对象的另一个函数,特别是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屏幕,并显示 “覆盖现有用户?”的信息,并在命令行中提供一个提示,让用户回复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,并在LCD上提示用户需要输入一个新的名字。

同时在控制台上,应出现文字 “Name: “应该会出现,因为我们利用输入来等待用户的输入。

当用户在控制台中输入一个名字并按下回车键后,我们就开始利用游标对象来执行我们在上一节代码中形成的查询。

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

最后,我们通过调用db对象的.commit()函数将更改提交到数据库中。如果我们不调用这个函数,我们的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卡,看看一切是否正常工作,如果不是,请仔细检查你的代码和布线。如果你看到 “User Saved”,那么一切都应该正常工作。

记录考勤打卡情况

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查询返回的记录,并将其结果存储到我们的 “结果 “变量中供以后使用。

最后,我们清除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用户输入的密码。

由于MariaDB默认使用UNIX_SOCKET进行身份验证,所以我们利用sudo来执行这个命令。

sudo mysql -u root -p

2. 一旦你连接到MYSQL命令行,我们需要利用 “使用 “命令。我们需要使用这个命令,这样我们就可以和我们的 “考勤系统 “数据库进行交互。

运行以下命令与 “endanceystem “数据库进行交互。

use attendancesystem;

3. 现在我们直接与我们的 “考勤系统 “数据库进行交互,让我们开始检查我们的脚本所创建的所有用户。

我们可以通过运行一个简单的SELECT SQL调用,指定我们的 “用户 “表来实现。下面的查询中使用的星号(*)表示我们要抓取所有的列。

键入以下命令来抓取 “用户 “表中的所有可用用户。

SELECT * FROM users;

从这个命令中,你应该看到类似于我们下面的东西。

+--+------------------+---------+------------------------+
| id | rfid_uid       | name    | created                |
+--+------------------+---------+------------------------+
|  1 | 160747764001   | Emmet   | 2019-01-31 11:28:04    |
+--+------------------+---------+------------------------+

4. 现在我们已经检查了 “用户 “表,让我们继续看看 “考勤 “表。就像之前的查询一样,我们只是选择 “考勤 “表中的所有列。

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

SELECT * FROM attendance;

从这个命令中,你应该可以看到类似下面的命令行。你可以将 “user_id “引用到 “user “表 “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然后按Y和ENTER键保存文件。

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

另一方面,Bootstrap是一个前端框架,它可以让你更容易地开发出外观简洁的前端,而不用担心编写大量的CSS。

现在脚本已经被克隆到了目录中,你现在应该可以通过访问你的树莓派的IP地址并在URL的结尾添加/attendance来检查前端,如下所示。

http://192.168.160/attendance

6. 进入网站后,你会看到下面的网页,从这里你可以通过点击 “用户 “查看当前的用户,也可以通过点击 “考勤 “按钮查看用户的考勤情况。

如果你已经走到了这一步,那么所有的工作都是应该的,你现在应该有一个基本的RFID和树莓皮驱动的考勤系统了。

欢迎页

RFID-Attendance-System-Index-Page.png

考勤系统用户页

RFID-Attendance-System-Users-Page.png

考勤页

RFID-Attendance-System-Attendance-Page.png

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

我希望到现在,你已经拥有一个完整的工作的Raspberry Pi RFID考勤系统。

平均: 5 / 5. votes: 2

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派考勤打卡系统,详细步骤搭建和使用RC522 RFID

赞 (1)

评论

9+4=