文章目录
0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于树莓派的指纹识别与RFID考勤系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
🧿 毕设项目分享:见文末!
1 简介
2 主要器件
- R305指纹模块
- PL2303 USB转TTL
- RC522 RFID 模块
- 20x4 液晶显示器
- 树莓派
- 以太网电缆
- 按钮 (8)
- 蜂鸣器
- 跳线
- SD 卡 (16 GB)
- 电位器 (10k)
3 实现效果
4 设计原理
4.1 Adafruit 指纹传感器库
具体配置见 Adafruit 指纹传感器库
4.2 树莓派读取 RC522 RFID 标签**
简介
RC522 RFID 模块是一个简单的附加组件,我们可以连接到 Raspberry Pi 以读取 MIFARE 标签和卡片。这是一个很棒的功能,可以包含在安全系统或任何需要识别物体或人而无需按下按钮、操作开关或其他传感器的应用程序中。非接触式标签可以放在钥匙圈上,卡片可以很好地放在钱包里。
支持的协议
使用 RC522 芯片的模块应该支持所有使用以下标准的标签:
- MIFARE 迷你
- MIFARE 1K
- MIFARE 4K,
- MIFARE 超轻
- MIFARE DESFire EV1
- MIFARE Plus 射频
可以购买额外的卡片和标签,但您应该确保它们支持其中一种标准。
这些 RFID 模块无法读取非接触式银行卡。他们可以从智能手机读取 ID,但 ID 每次都不同,因此在大多数情况下不是很有用。
硬件设置
使用 7 路母母跨接电缆将模块连接到 Pi。
接线细节如下表所示:
下载 RC522 Python 库
示例 Python 脚本
import time
import RPi.GPIO as GPIO
import MFRC522
# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()
# Welcome message
print("Looking for cards")
print("Press Ctrl-C to stop.")
# This loop checks for chips. If one is near it will get the UID
try:
while True:
# Scan for cards
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
# Get the UID of the card
(status,uid) = MIFAREReader.MFRC522_Anticoll()
# If we have the UID, continue
if status == MIFAREReader.MI_OK:
# Print UID
print("UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]))
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()
4.3 20×4 LCD 模块
液晶模组硬件
通常设备需要 8 条数据线来向位 0-7 提供数据。但是,此 LCD 可以配置为使用“4 位”模式,该模式允许您以 4 位的两个块(或半字节)发送数据。这减少了与 Pi 连接时所需的 GPIO 连接数量。
连接方法如下:
注: RW 引脚允许将设备置于读取或写入模式。我将此引脚接地以防止模块尝试向 Pi 发送数据,因为 Pi 不能容忍其 GPIO 接头上的 5V 输入。
Pin 3:为了控制对比度,您可以调整提供给 Pin 3 的电压。我使用 10K 欧姆微调器为 Pin 3 提供 0-5V 的可变电压,从而可以调整对比度。
引脚 15:这为背光 LED 供电。为了打开和关闭背光,我使用了一个晶体管(BC547、BC548 或同等产品)来切换此引脚。这需要一个额外的 GPIO 引脚来切换晶体管,但允许我的 Python 脚本控制背光。
LCD软件配置
使用 RPi.GPIO 库来提供对 Python 中 GPIO 的访问。
此设置的功能包括:
- 10k可变电阻调节对比度
- 2k可变电阻调节背光亮度
- 一个晶体管,可以打开和关闭背光
- 左对齐、居中和右对齐的文本
面包板电路如下所示:
5 部分核心代码
LCD部分代码
import RPi.GPIO as GPIO
import time
# Define GPIO to LCD mapping
LCD_RS = 7
LCD_E = 8
LCD_D4 = 25
LCD_D5 = 24
LCD_D6 = 23
LCD_D7 = 18
LED_ON = 15
# Define some device constants
LCD_WIDTH = 20 # Maximum characters per line
LCD_CHR = True
LCD_CMD = False
LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
def main():
# Main program block
GPIO.setmode(GPIO.BCM) # Use BCM GPIO numbers
GPIO.setup(LCD_E, GPIO.OUT) # E
GPIO.setup(LCD_RS, GPIO.OUT) # RS
GPIO.setup(LCD_D4, GPIO.OUT) # DB4
GPIO.setup(LCD_D5, GPIO.OUT) # DB5
GPIO.setup(LCD_D6, GPIO.OUT) # DB6
GPIO.setup(LCD_D7, GPIO.OUT) # DB7
GPIO.setup(LED_ON, GPIO.OUT) # Backlight enable
# Initialise display
lcd_init()
# Toggle backlight on-off-on
lcd_backlight(True)
time.sleep(0.5)
lcd_backlight(False)
time.sleep(0.5)
lcd_backlight(True)
time.sleep(0.5)
while True:
# Send some centred test
lcd_string("--------------------",LCD_LINE_1,2)
lcd_string("Rasbperry Pi",LCD_LINE_2,2)
lcd_string("Model B",LCD_LINE_3,2)
lcd_string("--------------------",LCD_LINE_4,2)
time.sleep(3) # 3 second delay
lcd_string("Raspberrypi-spy",LCD_LINE_1,3)
lcd_string(".co.uk",LCD_LINE_2,3)
lcd_string("",LCD_LINE_3,2)
lcd_string("20x4 LCD Module Test",LCD_LINE_4,2)
time.sleep(3) # 20 second delay
# Blank display
lcd_byte(0x01, LCD_CMD)
time.sleep(3) # 3 second delay
def lcd_init():
# Initialise display
lcd_byte(0x33,LCD_CMD) # 110011 Initialise
lcd_byte(0x32,LCD_CMD) # 110010 Initialise
lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off
lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
lcd_byte(0x01,LCD_CMD) # 000001 Clear display
time.sleep(E_DELAY)
def lcd_byte(bits, mode):
# Send byte to data pins
# bits = data
# mode = True for character
# False for command
GPIO.output(LCD_RS, mode) # RS
# High bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x10==0x10:
GPIO.output(LCD_D4, True)
if bits&0x20==0x20:
GPIO.output(LCD_D5, True)
if bits&0x40==0x40:
GPIO.output(LCD_D6, True)
if bits&0x80==0x80:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
lcd_toggle_enable()
# Low bits
GPIO.output(LCD_D4, False)
GPIO.output(LCD_D5, False)
GPIO.output(LCD_D6, False)
GPIO.output(LCD_D7, False)
if bits&0x01==0x01:
GPIO.output(LCD_D4, True)
if bits&0x02==0x02:
GPIO.output(LCD_D5, True)
if bits&0x04==0x04:
GPIO.output(LCD_D6, True)
if bits&0x08==0x08:
GPIO.output(LCD_D7, True)
# Toggle 'Enable' pin
lcd_toggle_enable()
def lcd_toggle_enable():
# Toggle enable
time.sleep(E_DELAY)
GPIO.output(LCD_E, True)
time.sleep(E_PULSE)
GPIO.output(LCD_E, False)
time.sleep(E_DELAY)
def lcd_string(message,line,style):
# Send string to display
# style=1 Left justified
# style=2 Centred
# style=3 Right justified
if style==1:
message = message.ljust(LCD_WIDTH," ")
elif style==2:
message = message.center(LCD_WIDTH," ")
elif style==3:
message = message.rjust(LCD_WIDTH," ")
lcd_byte(line, LCD_CMD)
for i in range(LCD_WIDTH):
lcd_byte(ord(message[i]),LCD_CHR)
def lcd_backlight(flag):
# Toggle backlight on-off-on
GPIO.output(LED_ON, flag)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
pass
finally:
lcd_byte(0x01, LCD_CMD)
lcd_string("Goodbye!",LCD_LINE_1,2)
GPIO.cleanup()
🧿 毕设项目分享:见文末!