去年帮朋友改造老式保险柜时,发现机械密码锁存在两个致命缺陷:密码组合有限且易被破解,长期使用后机械部件磨损导致卡顿。这促使我尝试用STM32单片机+矩阵键盘+电磁锁的方案实现电子密码锁控制。相比传统方案,电子密码锁不仅支持6-12位可变长度密码,还能记录开锁日志、设置临时密码等扩展功能。
这个设计特别适合需要中等安全级别的场景,比如家庭保险柜、办公室文件柜、实验室设备间等。核心在于用单片机替代机械齿轮组,通过软件算法实现密码验证与锁体控制。实测下来,整套方案成本可控制在50元以内(不含外壳),比市面同类产品便宜60%以上。
在STM32F103C8T6(蓝桥杯开发板常用款)和ATmega328P之间反复对比后,最终选择前者。虽然两者都能满足需求,但STM32的72MHz主频和64KB Flash明显优于ATmega的20MHz/32KB配置。更关键的是,STM32内置的硬件SPI接口能直接驱动OLED显示屏,而ATmega需要软模拟SPI,会占用更多CPU资源。
注意:采购时要认准"STM32F103C8T6"完整型号,市场上有打磨重印的假冒芯片。正品芯片的丝印清晰锐利,背面有激光雕刻的批次号。
采用4x4矩阵键盘而非独立按键,节省了10个IO口。实际焊接时发现,薄膜键盘的触点电阻较大(约200Ω),容易导致信号抖动。解决方法是在每个行线上拉10kΩ电阻,同时在软件中采用"按下-延时20ms-二次检测"的防抖逻辑。键盘布局参考ATM取款机:
code复制1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
其中A/B/C/D分别对应"确认"、"删除"、"菜单"和"取消"功能键。
电磁锁的瞬间工作电流可达1A,直接用IO口驱动会烧毁芯片。测试了S8050(1.5A)和TIP122(5A)两种NPN三极管,最终选择后者并加装散热片。驱动电路关键参数:
采用有限状态机(FSM)模型管理锁的工作流程,包含以下状态:
状态转换用switch-case实现,关键技巧是每个状态函数必须限制执行时间在10ms内,避免阻塞其他任务。
绝对禁止明文存储密码!采用SHA-256哈希算法+盐值(salt)的方案:
c复制// 示例代码:密码哈希生成
void generate_hash(char* pwd, uint8_t salt, uint8_t* hash) {
char salted_pwd[20];
sprintf(salted_pwd, "%d%s%d", salt, pwd, salt);
mbedtls_sha256(salted_pwd, strlen(salted_pwd), hash, 0);
}
盐值随机生成并和哈希值一起存入EEPROM。即使有人读取芯片存储区,也无法反推出原始密码。
实测发现直接调用HAL_Delay()会导致屏幕刷新卡顿。改用基于SysTick的时间戳判断法:
c复制uint32_t last_key_time = 0;
void key_scan() {
if(HAL_GetTick() - last_key_time < 200) return; // 防抖间隔
// ...扫描按键代码
last_key_time = HAL_GetTick();
}
配合RTOS的优先级设置,确保密码输入响应延迟不超过50ms。
电磁锁在吸合后只需维持电流的1/3即可保持锁定。采用PWM动态调节:
c复制// 初始吸合:100%占空比
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 999); // 周期=1000
HAL_Delay(300);
// 维持阶段:30%占空比
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 300);
实测可使锁体温度从60℃降至35℃,同时降低功耗约70%。
频繁写入会导致存储单元失效。采用"滑动窗口"算法将数据分散到不同地址:
c复制#define EEPROM_SIZE 4096
#define PAGE_SIZE 32
uint16_t find_free_page() {
static uint16_t last_page = 0;
last_page = (last_page + PAGE_SIZE) % (EEPROM_SIZE - PAGE_SIZE);
return last_page;
}
配合CRC校验,确保数据可靠性。实测在每天写入100次的情况下,寿命可达5年以上。
在待机状态下,通过以下措施将功耗从25mA降至80μA:
现象:吸合后立即释放
排查步骤:
可能原因及处理:
典型故障模式:
通过HC-05模块实现,需注意:
FPM10A光学指纹模块的集成要点:
利用STM32的TAMPER引脚检测机箱开启:
c复制void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc) {
buzzer_alarm(3); // 三长声报警
send_alert_sms(); // 通过GSM模块发短信
}
配合干簧管或振动传感器,构建完整安防系统。
这个项目最让我意外的是硬件成本与系统可靠性的平衡——用50元的物料实现了商业产品300元级别的功能。特别是在密码安全方面,通过哈希算法+盐值的设计,即使获得芯片物理访问权限也无法破解密码。下一步计划加入无线同步功能,实现多台密码锁的集中管理。