1. 项目背景与核心价值
去年帮朋友改造老旧小区门禁时,发现传统RFID门禁存在明显痛点:住户丢失卡片需物业重新授权、访客临时通行不便、开门记录无法追溯。这促使我开始研究基于STM32的智能门禁方案,最终实现的系统支持手机蓝牙/NFC开锁、远程授权、操作日志存储等现代门禁所需的核心功能。
相比市面成品,自研方案的优势在于三点:首先,硬件成本可控制在百元内(商用系统至少千元起);其次,功能可完全自定义(比如添加人脸识别模块);最重要的是所有数据本地存储,不存在隐私泄露风险。这个项目特别适合物业技术人员、创客爱好者学习嵌入式开发全流程。
2. 硬件系统设计
2.1 核心器件选型
主控采用STM32F103C8T6最小系统板,选择依据主要有:
- 72MHz主频足够处理加密算法和外围设备通信
- 64KB Flash可存储超过10万条开门记录
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 市场价格仅15元左右
其他关键器件:
- 射频模块:RC522 RFID读卡器(兼容M1卡和手机NFC)
- 蓝牙模块:HC-05(经典蓝牙协议,兼容性优于BLE)
- 电控锁体:12V常闭型,实测工作电流需800mA
- 电源方案:LM2596降压模块(输入12V转5V)给主控供电
关键提示:电控锁必须单独供电!实测STM32的GPIO驱动电流不足以直接驱动锁体,需通过继电器模块控制。
2.2 电路设计要点
原理图设计时特别注意三点:
- 防反接保护:在12V电源入口处串接SS34二极管
- 信号隔离:射频模块与主控间添加光耦隔离电路
- 状态指示:用RGB LED实现多色提示(蓝色-待机、绿色-开门、红色-报警)
PCB布局经验:
- 射频天线区域禁止走其他信号线
- 电源模块远离模拟信号线路
- 所有接插件采用凤凰端子便于现场安装
3. 软件架构实现
3.1 主程序流程图
c复制void main() {
hardware_init(); // 外设初始化
load_config(); // 读取EEPROM中的授权信息
while(1) {
check_rfid(); // 轮询RFID读卡器
check_ble(); // 处理蓝牙数据
check_button();// 物理按键检测
system_watchdog(); // 喂狗防死机
}
}
3.2 关键算法解析
动态密码验证流程:
- 手机APP生成6位随机数+时间戳
- 通过AES-128加密后蓝牙传输
- STM32解密后校验时间戳(允许±3分钟误差)
- 验证通过后触发开锁
EEPROM存储优化:
- 每条记录占用16字节:4字节时间戳+8字节卡号+4字节操作类型
- 采用循环存储策略,当写满时自动覆盖最早记录
- 关键参数存储在末页防止意外擦除
4. 功能实现细节
4.1 多模式开锁逻辑
系统支持四种开锁方式,优先级如下:
- 管理员密码(USART串口输入)
- 手机蓝牙动态密码
- NFC卡片识别
- 物理应急按键(需长按3秒)
冲突处理机制:
- 任何模式下连续5次验证失败触发30秒锁定
- 蓝牙与RFID同时触发时优先处理蓝牙请求
- 所有操作事件实时写入日志
4.2 低功耗优化方案
虽然门禁需常电工作,但通过以下措施降低待机功耗:
- 关闭未使用的外设时钟(ADC、TIM2等)
- RFID模块设置为轮询模式(非中断触发)
- 蓝牙模块在无连接时进入SNIFF模式
实测优化后整机待机电流从85mA降至32mA
5. 典型问题排查实录
5.1 RFID读卡不稳定
现象: 卡片需反复靠近才能识别
排查过程:
- 用示波器检查天线引脚波形,发现谐振频率偏移
- 调整匹配电容C1从47pF改为33pF
- 重新计算天线参数:电感值=1.15uH,Q值>30
解决: 修改天线匹配电路后识别距离稳定在5cm
5.2 蓝牙连接超时
现象: 安卓手机连接需多次尝试
根因分析: HC-05模块默认波特率38400与手机兼容性差
优化方案:
- AT+UART=115200,0,0(修改波特率)
- 添加连接超时重试机制
- 增加信号强度RSSI检测
6. 扩展功能建议
已完成基础功能的开发者可以尝试:
- 增加OLED屏显示实时状态
- 集成蜂鸣器实现语音提示
- 通过ESP8266添加WiFi远程控制
- 移植FreeRTOS实现多任务管理
实际部署时建议:
- 电控锁供电线路需用1.5mm²以上线径
- 室外安装时做好防水处理(推荐IP65外壳)
- 定期通过串口导出日志备份