1. 项目概述
这个智能电子密码锁项目是我去年为一个社区门禁系统改造时设计的方案。当时物业希望用低成本方案替换老旧机械锁,要求支持密码开锁、防撬报警和低功耗运行。最终我们基于STM32F103C8T6单片机实现了整套系统,成本控制在50元以内,比市面同类产品便宜60%以上。
传统机械锁存在钥匙易丢失、配钥成本高的问题,而市售智能锁动辄几百上千元的价格又让很多小区望而却步。我们这个设计正好填补了中低端市场的空白,特别适合出租屋、小区单元门、储物柜等场景。实测下来,整套系统待机电流仅2.8mA,用4节AA电池就能持续工作半年以上。
2. 核心功能设计
2.1 密码验证模块
采用4x4矩阵键盘作为输入设备,通过74HC165移位寄存器扩展IO口。密码存储使用STM32内部的Flash模拟EEPROM,设计了三级存储空间:
- 主密码区:存储管理员密码
- 用户密码区:最多支持20组用户密码
- 临时密码区:支持设置有效期(如快递临时密码)
密码验证流程特别加入了防暴力破解机制:
- 连续3次输错密码触发30秒锁定
- 键盘输入间隔超过5秒自动清空输入缓存
- 所有按键事件都通过硬件消抖处理
实际开发中发现,直接读取矩阵键盘容易受干扰产生误触发。后来改为中断+轮询双重检测,先通过EXTI中断唤醒MCU,再用定时器间隔10ms轮询确认按键状态。
2.2 电机驱动电路
选用5V减速电机(型号JGA25-370)作为锁舌驱动,通过L298N电机驱动模块控制。这里有几个关键设计点:
- 电机运行时间严格控制在0.5秒(通过PWM占空比调节)
- 堵转检测:监测电流突变判断是否卡死
- 双路限位开关检测锁舌位置
电路设计中特别加入了TVS二极管保护,防止电机反电动势损坏单片机。实测驱动电流约800mA,所以电源线要用至少22AWG规格。
2.3 安全防护系统
除了密码验证外,还集成了三重物理防护:
- 震动传感器(SW-420):检测撬锁行为
- 门磁开关:监测门体异常开启
- 备用电源接口:支持9V电池应急供电
报警触发后会执行以下动作:
- 本地蜂鸣器鸣响(频率2kHz,响度85dB)
- 继电器切断电机电源
- 通过SIM800C模块发送报警短信(需插手机卡)
3. 硬件搭建详解
3.1 核心元件选型
主控芯片选用STM32F103C8T6(蓝色pill开发板),主要考虑:
- 72MHz主频足够处理密码逻辑
- 内置64KB Flash和20KB SRAM
- 多达37个GPIO口
- 价格仅10元左右
其他关键元件清单:
| 元件 | 型号 | 数量 | 备注 |
|---|---|---|---|
| 矩阵键盘 | 4x4薄膜键盘 | 1 | 带背光版本 |
| 电机驱动 | L298N | 1 | 带散热片 |
| 蜂鸣器 | 有源5V | 1 | 频率可调 |
| 稳压芯片 | AMS1117-3.3 | 1 | 给MCU供电 |
| 电量检测 | INA219 | 1 | 监测电池电压 |
3.2 PCB设计要点
采用双层板布局,注意以下设计规范:
- 电机驱动线路走线宽度≥1mm
- 模拟信号(如震动传感器)远离数字线路
- 所有IC电源脚就近放置0.1μF去耦电容
- 预留SWD调试接口
有个踩坑经验:最初版本没加电源滤波电容,电机启动时会导致MCU复位。后来在电源入口加了470μF电解电容+100nF陶瓷电容组合才解决。
3.3 低功耗优化
待机功耗是重点优化方向,采取以下措施:
- 主频动态调整:正常模式72MHz,休眠模式8MHz
- 外设分时供电:通过MOS管控制非必要外设电源
- 深度睡眠模式:无操作5分钟后进入STOP模式
- 唤醒源配置:保留键盘中断和震动传感器唤醒
经过优化后的功耗对比:
| 模式 | 电流 | 唤醒时间 |
|---|---|---|
| 运行 | 45mA | - |
| 休眠 | 6.8mA | 2ms |
| STOP | 2.8mA | 50ms |
4. 软件实现关键
4.1 系统架构设计
采用前后台系统架构:
- 前台:中断服务程序(处理键盘、传感器等紧急事件)
- 后台:主循环处理状态机和非实时任务
状态机设计包含5个主要状态:
c复制typedef enum {
LOCK_STANDBY, // 待机状态
LOCK_INPUT, // 密码输入中
LOCK_VERIFY, // 验证密码
LOCK_OPEN, // 开锁状态
LOCK_ALARM // 报警状态
} LockState;
4.2 密码管理实现
密码存储采用AES-128加密,密钥分散存储在Flash不同位置。关键函数包括:
c复制// 密码加密存储
void savePassword(uint8_t slot, char* pwd) {
uint8_t iv[16] = {0};
AES_CBC_encrypt_buffer(pwd, iv, master_key);
FLASH_Write(slot*16, pwd, 16);
}
// 密码验证
bool verifyPassword(char* input) {
uint8_t encrypted[16];
AES_CBC_encrypt_buffer(input, iv, master_key);
return memcmp(encrypted, stored_pwd, 16)==0;
}
4.3 电机控制算法
采用梯形速度控制,避免机械冲击:
- 加速阶段:PWM从30%线性增加到80%(0-0.2秒)
- 匀速阶段:保持80%占空比(0.2-0.3秒)
- 减速阶段:PWM从80%降到0(0.3-0.5秒)
通过定时器编码器模式监测电机转速,发现异常立即刹车:
c复制void motor_control(uint8_t duty) {
TIM1->CCR1 = duty;
if(encoder_diff < 2) { // 转速过低
brake_motor();
set_alarm(MOTOR_STALL);
}
}
5. 常见问题解决方案
5.1 键盘响应迟钝
可能原因及排查:
- 消抖时间过长:建议设置为10-20ms
- 扫描间隔不合理:推荐5ms扫描一次
- 上拉电阻阻值过大:改用4.7kΩ电阻
5.2 电机偶尔不动作
典型故障处理流程:
- 测量L298N使能端电压(应>3V)
- 检查电机两端电压(负载下应>4V)
- 用示波器观察PWM波形
- 检查限位开关是否误触发
5.3 电池耗电过快
省电配置检查清单:
- 确认所有未用IO设为模拟输入模式
- 关闭调试接口(SWD/JTAG)
- 检查是否有外设漏电(如LED指示灯)
- 降低系统时钟频率(HCLK分频)
6. 生产测试方案
6.1 老化测试项目
批量生产时建议进行以下测试:
- 连续密码输入测试(≥1000次)
- 电机耐久测试(500次开合循环)
- 低温测试(-20℃运行24小时)
- 静电测试(接触放电±8kV)
6.2 校准流程
关键参数校准步骤:
- 电机行程校准:用螺丝刀调节限位开关位置
- 蜂鸣器音量校准:调节可调电阻至85±3dB
- 电量检测校准:分别在4.5V和6V时记录ADC值
这套系统在实际部署中表现超出预期。有个使用技巧:在门框安装位置加装橡胶垫片,能有效减少震动传感器的误报。最近我们正在开发蓝牙解锁功能,准备用ESP32-C3做下一代主控,成本可以再降30%。