- 基于单片机的密码锁智能柜设计(STM32 + 随机密码下发 + 手机远程开锁)
- 一、系统功能总览
- 二、核心模块选型对比
- 2.1 主控芯片:STM32F103C8T6 vs ESP32-WROOM-32
- 2.2 显示模块:OLED12864 vs LCD1602
- 2.3 无线通信模块:ESP8266 vs nRF24L01
- 2.4 继电器选型:SRD-05VDC-SL-C
- 三、系统接线总表
- 四、系统软件设计
- 4.1 主程序流程
- 4.2 密码生成与管理流程
- 4.3 显示模块流程
- 4.4 无线通信流程
- 4.5 继电器控制流程
- 五、系统实现与测试
- 5.1 硬件焊接与调试
- 5.2 软件编译与调试
- 5.3 系统功能测试
- 六、总结
基于单片机的密码锁智能柜设计(STM32 + 随机密码下发 + 手机远程开锁)
传统柜子一把钥匙走天下:钥匙丢了进不去、被复制了防不住,在快递暂存、健身房储物、共享寄存等场景里越来越力不从心。本文带来一套基于 STM32F103C8T6 的密码锁智能柜:柜子上只有一个"开启"键,按下后单片机现场生成一串高随机性的伪随机序列码,经 ESP8266 发送到绑定手机,用户凭收到的动态密码在柜端键盘输入,验证通过继电器即刻开锁;密码一次一换、错误次数受限,安全性与便捷性双双拉满,是智能存储设备的经典入门设计。
一、系统功能总览
| 功能模块 | 具体说明 |
|---|---|
| 动态密码生成 | 单片机按下"开启"键即时生成伪随机序列码,一次一密 |
| 密码下发 | 密码经 ESP8266 无线发送至绑定手机,用户凭短信式通知取码 |
| 密码验证 | 柜端矩阵键盘输入密码,单片机比对验证 |
| 开锁控制 | 验证通过驱动 SRD-05VDC-SL-C 继电器吸合,打开锁具 |
| 防试开保护 | 密码错误提示重输,超过限制次数锁定并报警 |
| 密码管理 | 密码安全存储,支持定期更新与泄露后及时更换 |
| 手机号绑定 | 用户手机号绑定与数据库管理,支持查询、修改、删除 |
| 状态显示 | OLED 实时显示操作提示、密码输入与系统状态 |
二、核心模块选型对比
2.1 主控芯片:STM32F103C8T6 vs ESP32-WROOM-32
| 对比项 | 方案一:STM32F103C8T6 | 方案二:ESP32-WROOM-32 |
|---|---|---|
| 内核 | Cortex-M3 @72MHz | 双核 LX6 @240MHz |
| Flash/RAM | 64KB / 20KB | 4MB / 520KB |
| 无线功能 | 需外接 WiFi 模块 | WiFi+蓝牙内置 |
| 长期稳定性 | 系列成熟,供货稳定 | 生态较新 |
| 价格 | 约 10 元 | 约 20 元 |
选择方案一(STM32F103C8T6)。密码生成与验证属轻量任务,C8T6 性能绰绰有余;无线通信由独立 ESP8266 承担,主控与通信解耦便于维护。STM32 系列的长期稳定性和广泛应用为项目提供了额外保障。
2.2 显示模块:OLED12864 vs LCD1602
| 对比项 | 方案一:OLED12864 | 方案二:LCD1602 |
|---|---|---|
| 分辨率 | 128×64 点阵 | 16×2 字符 |
| 显示类型 | 自发光单色图形 | 字符型液晶 |
| 信息量 | 支持中文字符与图形 | 仅限两行字符 |
| 视角/对比度 | 全视角,黑白对比鲜明 | 视角受限,需调对比度 |
| 功耗 | 低 | 背光常开功耗高 |
选择方案一(OLED12864)。系统需要显示密码输入界面、操作提示与状态信息,图形点阵屏信息呈现能力远胜字符屏,全视角高对比保证各种光线条件下清晰可读。
2.3 无线通信模块:ESP8266 vs nRF24L01
| 对比项 | 方案一:ESP8266 | 方案二:nRF24L01 |
|---|---|---|
| 联网方式 | WiFi 直连互联网 | 2.4GHz 点对点私有协议 |
| 上云能力 | TCP 透传,密码可送达任意手机 | 需自建接收端,覆盖有限 |
| 传输速率 | 最高 72Mbps | 低速 |
| 开发支持 | 文档丰富、社区活跃 | 相对封闭 |
选择方案一(ESP8266-01S)。动态密码必须送达用户手机,数据要经云平台转发,ESP8266 直连 WiFi 即可完成全链路;nRF24L01 还需自建接收网关,开发周期与硬件成本双升。
2.4 继电器选型:SRD-05VDC-SL-C
本系统锁具驱动选用 SRD-05VDC-SL-C 电磁继电器。该型号工作电压 5V 直流,由电磁线圈与一组触点构成:线圈通电励磁后触点闭合,断电后断开,负载能力足以驱动电子锁具,且耐用性设计适合长期工作。驱动电路以 NPN 三极管 S8050 为核心——基极经限流电阻接单片机 GPIO,发射极接地,集电极接继电器线圈负极,线圈正极接 5V 电源;GPIO 输出高电平三极管导通、继电器吸合。线圈两端反向并联续流二极管,吸收感性负载断电瞬间的反向电动势,保护电路安全。价格合理、负载能力足够,是低电压开关控制的经济实用之选。
三、系统接线总表
| 模块 | 引脚 | 连接 STM32 引脚 | 备注 |
|---|---|---|---|
| "开启"按键 | 一端 | PA0 | 按下接地,上拉输入,触发密码下发流程 |
| 4×4 矩阵键盘 | ROW0~ROW3 | PB11/PB12/PB13/PB14 | 行线输出扫描 |
| 4×4 矩阵键盘 | COL0~COL3 | PB15/PA4/PA5/PA6 | 列线读取,0~9 数字键 + 功能键 |
| ESP8266 | TXD/RXD | PA3/PA2 | USART2,115200,交叉相连 |
| ESP8266 | RST | PA8 | 复位控制,CH_PD 接 3.3V |
| OLED12864 | SCL/SDA | PB6/PB7 | I2C 接口,SSD1306 驱动,3.3V 供电 |
| 继电器 | IN | PB10 | 经 S8050 三极管驱动 SRD-05VDC-SL-C |
| 蜂鸣器 | I/O | PB5 | 三极管驱动,密码错误与锁定报警 |
接线说明:主控最小系统由 8MHz 晶振倍频至 72MHz 主频,32.768kHz 晶振配合备用电池维持 RTC 计时(记录开柜时间);NRST 复位电路由按键、电容与上拉电阻组成,保证系统从可靠状态启动。继电器线圈两端反向并联续流二极管保护三极管。
四、系统软件设计
4.1 主程序流程
系统上电后电源模块为单片机、按键、显示、通信模块与继电器供电,单片机完成内部初始化与硬件自检,OLED 显示待机界面。用户按"开启"键后:单片机生成伪随机序列码作为本次解锁密码,经 ESP8266 发送到绑定手机;OLED 提示输入密码,用户在矩阵键盘键入收到的密码;单片机验证比对,正确则驱动继电器开锁,错误则提示重输并累计错误次数,超限锁定报警;柜门关闭后系统复位回到初始状态,等待下一次指令。主程序骨架如下:
int main(void) { System_Init(); // GPIO/USART2/I2C/RTC 初始化 OLED_Init(); OLED_ShowString(0, 0, "Smart Lock"); ESP8266_Rst(); ESP8266_Net_Config(); // 入网 + 透传 + TCP 连接云端 while (1) { if (Key_Open_Pressed()) // "开启"键按下 { code = Rand_Code_Gen(); // 生成伪随机序列码 Save_Code(code); // 安全存储,用于比对 ESP8266_Send_Code(code, bind_phone); // 密码下发手机 OLED_Tip("Input Code:"); input = KeyPad_GetInput(); // 键盘读取密码 if (Check_Code(input, code)) { OLED_Tip("Open!"); Relay_On(); // 继电器开锁 Log_Open_Time(); // RTC 记录开启时间 Wait_Door_Close(); // 关门检测 System_Reset(); } else { err_cnt++; OLED_Tip("Wrong!"); if (err_cnt >= ERR_LIMIT) { Lock_Alarm(); } // 超限锁定并报警 } } delay_ms(50); } }4.2 密码生成与管理流程
伪随机序列码生成算法以单片机内部定时器计数与 RTC 秒值混合作为熵源,逐位抽取生成不定长序列码,保证高随机性与不可预测性。密码存储采用编码写入方式防止明文泄露;系统支持定期自动更换密码,用户怀疑泄露时也可通过手机端主动触发更新,旧码即刻作废。
4.3 显示模块流程
OLED 经 I2C 驱动:使能 I2C 与 GPIO 时钟,SCL/SDA 设为开漏输出并配置时钟频率;先发关闭显示、设置内存地址模式、对比度等初始化指令,再以OLED_Fill填充背景、OLED_CLS清屏;显示字符串时按 6×8 或 8×16 点阵从字库数组取模,中文字符从 F16x16 数组取点阵数据,位图逐行写入,密码输入界面与操作提示按页地址模式布局刷新。
4.4 无线通信流程
USART2 初始化为 115200、8 位数据位、1 位停止位、无校验并启用收发中断。ESP8266 复位脚拉低再恢复,等待串口缓冲区出现 “ready”;设 STA 模式并以AT+CWJAP入网,检查 “OK”;AT+CIPMUX单连接、AT+CIPSEND进透传,确认缓冲区含 “\r\nOK\r\n\r\n>”;AT+CIPSTART连接 TCP 服务器并等待 “CONNECT”。链路建立后,密码报文经透传通道发往云端,由云端按绑定手机号投递,同时接收密码更新与手机号管理指令。
4.5 继电器控制流程
系统初始化时对控制引脚 PB10 置初始电平,保证继电器初始处于释放状态。主循环持续检测控制信号类型:收到开启信号则输出高电平,S8050 导通、线圈通电、常开触点闭合接通锁具电路;收到关闭信号则输出低电平断电释放。每次动作后系统回读引脚状态反馈当前工作情况,随后返回检测阶段循环执行,实现实时可靠的开锁控制。
五、系统实现与测试
5.1 硬件焊接与调试
按原理图完成主控最小系统、矩阵键盘、OLED、ESP8266 与继电器驱动电路的焊接,重点检查电源极性、晶振负载电容与续流二极管方向。逐模块上电验证:测量 AMS 稳压输出 3.3V 正常,键盘按键扫描无串键,继电器吸合释放干脆无粘连。
5.2 软件编译与调试
程序在 Keil 环境下编译烧录,使用 ST-Link 断点调试密码生成、串口通信与继电器控制逻辑;串口助手监视 ESP8266 的 AT 交互过程,确认入网、透传与 TCP 连接各环节应答正确。
5.3 系统功能测试
| 测试项 | 操作方法 | 系统动作 | 结果 |
|---|---|---|---|
| 按键响应 | 按下"开启"键 | 即时生成密码并下发手机 | 通过 |
| 密码随机性 | 连续多次触发取码 | 密码互不重复,无规律可循 | 通过 |
| 正确开锁 | 输入手机收到的密码 | 继电器吸合,柜锁打开 | 通过 |
| 错误保护 | 故意输错密码 | 提示重输,超限锁定报警 | 通过 |
| 密码更新 | 手机端触发更新 | 旧密码作废,新码即时生效 | 通过 |
| 关门复位 | 关闭柜门 | 系统复位回到待机状态 | 通过 |
六、总结
本文完成了一套基于 STM32F103C8T6 的密码锁智能柜:伪随机序列码一次一密,从根源上杜绝了静态密码被窃取复制的风险;ESP8266 无线下发把手机变成"电子钥匙",OLED 与矩阵键盘构成清晰的人机交互;SRD-05VDC-SL-C 继电器经三极管驱动稳定控制锁具,配合错误次数限制与报警形成完整防护闭环。系统还建立了手机号绑定与密码更新管理机制,兼顾安全、便捷与智能化管理。后续可加装指纹识别模组、接入智能家居联动,或上云实现远程管理与使用记录大数据分析,让储物场景的安全等级再上一个台阶。