网站首页 > 技术教程 正文
基于树莓派的指纹识别与RFID考勤系统
- 难度系数: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()
完整代码可进群免费领取。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!
点击这里找小助理0元领取:扫码进群领资料
猜你喜欢
- 2024-11-07 超值一篇分享,Docker:从入门到实战过程全记录
- 2024-11-07 首创引入蛋白动态信息的AI模型,高效预测药物-蛋白亲和力
- 2024-11-07 这个高中女生建立了一个道德黑客站,让人们进入数据安全
- 2024-11-07 「洞幺邦」智能停车场车位管理系统
- 2024-11-07 基于ARM的商用车信息系统的设计 基于arm的车辆中控娱乐系统报告
- 2024-11-07 CrowPi2树莓派4教育笔记本电脑的评测
- 2024-11-07 浅谈嵌入式开发朋友的身边事 嵌入式开发实例
- 2024-11-07 校园一卡通系统中RFID读写器的设计
- 2024-11-07 学生设计——小区门禁系统设计 小区门禁系统安装图教程
- 2024-11-07 电容式触控开关实验(二):触控式LED调光器
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)