文章目录
0 前言1 简介2 主要器件3 实现效果4 设计原理4.1 Adafruit 指纹传感器库4.2 树莓派读取 RC522 RFID 标签**4.3 20×4 LCD 模块5 部分核心代码5 最后0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩基于树莓派的指纹识别与RFID考勤系统
🥇学长这里给一个题目综合评分(每项满分5分)
难度系数:4分工作量:4分创新点:3分
1 简介
2 主要器件
R305指纹模块PL2303 USB转TTLRC522 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 1KMIFARE 4K,MIFARE 超轻MIFARE DESFire EV1MIFARE Plus 射频
可以购买额外的卡片和标签,但您应该确保它们支持其中一种标准。
这些 RFID 模块无法读取非接触式银行卡。他们可以从智能手机读取 ID,但 ID 每次都不同,因此在大多数情况下不是很有用。
硬件设置
使用 7 路母母跨接电缆将模块连接到 Pi。
接线细节如下表所示:
下载 RC522 Python 库
示例 Python 脚本
import timeimport RPi.GPIO as GPIOimport MFRC522# Create an object of the class MFRC522MIFAREReader = MFRC522.MFRC522()# Welcome messageprint("Looking for cards")print("Press Ctrl-C to stop.")# This loop checks for chips. If one is near it will get the UIDtry: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, continueif status == MIFAREReader.MI_OK:# Print UIDprint("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 GPIOimport time# Define GPIO to LCD mappingLCD_RS = 7LCD_E = 8LCD_D4 = 25LCD_D5 = 24LCD_D6 = 23LCD_D7 = 18LED_ON = 15# Define some device constantsLCD_WIDTH = 20 # Maximum characters per lineLCD_CHR = TrueLCD_CMD = FalseLCD_LINE_1 = 0x80 # LCD RAM address for the 1st lineLCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd lineLCD_LINE_3 = 0x94 # LCD RAM address for the 3rd lineLCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line# Timing constantsE_PULSE = 0.0005E_DELAY = 0.0005def main():# Main program blockGPIO.setmode(GPIO.BCM) # Use BCM GPIO numbersGPIO.setup(LCD_E, GPIO.OUT) # EGPIO.setup(LCD_RS, GPIO.OUT) # RSGPIO.setup(LCD_D4, GPIO.OUT) # DB4GPIO.setup(LCD_D5, GPIO.OUT) # DB5GPIO.setup(LCD_D6, GPIO.OUT) # DB6GPIO.setup(LCD_D7, GPIO.OUT) # DB7GPIO.setup(LED_ON, GPIO.OUT) # Backlight enable# Initialise displaylcd_init()# Toggle backlight on-off-onlcd_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 testlcd_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 delaylcd_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 displaylcd_byte(0x01, LCD_CMD)time.sleep(3) # 3 second delaydef lcd_init():# Initialise displaylcd_byte(0x33,LCD_CMD) # 110011 Initialiselcd_byte(0x32,LCD_CMD) # 110010 Initialiselcd_byte(0x06,LCD_CMD) # 000110 Cursor move directionlcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Offlcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font sizelcd_byte(0x01,LCD_CMD) # 000001 Clear displaytime.sleep(E_DELAY)def lcd_byte(bits, mode):# Send byte to data pins# bits = data# mode = True for character# False for commandGPIO.output(LCD_RS, mode) # RS# High bitsGPIO.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' pinlcd_toggle_enable()# Low bitsGPIO.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' pinlcd_toggle_enable()def lcd_toggle_enable():# Toggle enabletime.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 justifiedif 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-onGPIO.output(LED_ON, flag)if __name__ == '__main__':try:main()except KeyboardInterrupt:passfinally:lcd_byte(0x01, LCD_CMD)lcd_string("Goodbye!",LCD_LINE_1,2)GPIO.cleanup()