1. 项目概述
这个基于STM32的RFID员工打卡门禁系统是我去年指导的一个毕业设计项目,当时学生面临的主要问题是传统毕设项目缺乏创新点,难以满足答辩要求。这个系统将RFID识别技术与无线通信相结合,实现了员工考勤的自动化管理,最终获得了不错的评分(难度3分/工作量3分/创新点4分)。
系统核心功能包括:
- 通过RFID模块识别员工电子标签
- 采用WiFi模块实现上下位机通信
- OLED显示屏实时显示打卡状态
- 上位机管理员工数据库
- 完整的考勤记录功能
2. 硬件设计详解
2.1 主控模块选型
我们选择了STM32F103C8T6作为主控芯片,主要考虑因素:
- 性价比:这款芯片价格适中(约10-15元),性能足够满足需求
- 外设支持:具有足够的GPIO、USART和SPI接口
- 开发资源:社区支持完善,有丰富的库函数和示例代码
注意:如果预算充足,可以考虑STM32F4系列,性能更强但成本会提高30-40%
2.2 RFID模块设计
采用MFRC522射频识别模块,工作频率13.56MHz,主要参数:
- 读写距离:3-5cm(适合门禁场景)
- 通信协议:ISO 14443A标准
- 接口方式:SPI(与STM32连接)
接线示意图:
code复制MFRC522 STM32
VCC → 3.3V
GND → GND
RST → PA4
MISO → PA6
MOSI → PA7
SCK → PA5
2.3 无线通信模块
选用ESP-01S WiFi模块实现上下位机通信:
- 支持802.11 b/g/n协议
- 工作模式:STA+AP
- 通信协议:TCP
- 传输速率:实测可达500KB/s
配置要点:
- 需先通过AT指令配置模块:
code复制AT+CWMODE=3 // 设置双模式 AT+CWJAP="SSID","password" // 连接WiFi - 在代码中设置正确的服务器IP和端口
3. 软件系统实现
3.1 下位机程序设计
3.1.1 RFID识别流程
c复制void RFID_Process(void)
{
// 1. 寻卡
status = PCD_Request(PICC_REQIDL, &TagType);
// 2. 防冲突
status = PCD_Anticoll(&serNum[0]);
// 3. 选卡
status = PCD_Select(&serNum[0]);
// 4. 验证密钥
status = PCD_Authenticate(...);
// 5. 读取卡号
status = MFRC522_Read(...);
// 6. 通过WiFi上传数据
ESP8266_SendData(cardID);
}
3.1.2 OLED显示设计
采用SSD1306驱动,显示内容包括:
- 当前时间(通过RTC获取)
- 打卡状态(成功/失败)
- 员工姓名(从服务器返回)
技巧:使用u8g2库可以简化显示开发,支持多种字体和图形绘制
3.2 上位机系统设计
3.2.1 数据库设计
采用简单的文本数据库(persons.txt),格式为:
code复制姓名,卡号,打卡次数,最后打卡时间
张三,12345678,5,2023-05-20 09:00:00
李四,87654321,3,2023-05-20 08:55:00
3.2.2 TCP服务端实现
Python关键代码:
python复制def tcp_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8080))
server.listen(5)
while True:
conn, addr = server.accept()
data = conn.recv(1024).decode()
# 处理打卡请求
if data.startswith("RFID:"):
card_id = data[5:]
check_card(card_id)
4. 系统调试与优化
4.1 常见问题排查
-
RFID读卡不稳定的解决方案:
- 检查天线连接是否牢固
- 调整读卡距离(3-5cm最佳)
- 更换不同频段的卡片测试
-
WiFi连接失败的排查步骤:
- 确认模块供电稳定(3.3V)
- 检查AT指令响应
- 测试网络环境(ping测试)
-
数据库写入异常处理:
- 检查文件读写权限
- 确保数据格式正确
- 添加异常捕获机制
4.2 性能优化建议
- 增加卡片缓存机制:对最近使用的卡片信息进行缓存,减少重复读取时间
- 采用多线程处理:将RFID读取、网络通信、显示刷新放在不同线程
- 添加看门狗:防止程序跑飞
5. 项目扩展方向
在实际部署中,可以考虑以下改进:
- 增加人脸识别模块,实现多因素认证
- 改用SQLite数据库,提高查询效率
- 开发手机APP,实现远程管理
- 添加数据统计分析功能
这个项目从设计到实现大约需要4-6周时间,硬件成本约200-300元。我在调试过程中发现,RFID天线的布局对系统稳定性影响很大,建议在PCB设计时特别注意天线部分的走线。