基于STM32的电子密码锁设计与实现(矩阵键盘+防拆检测+GSM远程报警)
机械锁用钥匙开门,钥匙丢了要换锁芯;密码锁用按键开门,可一旦有人蹲守偷看密码、或者干脆暴力撬锁,主人往往最后一个知道。传统锁具在安全性和便捷性上的短板,随着智能家居的普及越来越明显。本文设计一款基于 STM32F103C8T6 的电子密码锁系统:矩阵键盘 + 蓝牙双通道密码输入,解锁成功 OLED 状态反馈 + 语音播报提示;连续三次密码错误自动通过 GSM 模块向指定手机发送警报短信;TTP223 触摸开关实时监测暴力拆锁行为,触发即拨打预设报警电话并播放报警语音------把"事后才知道"变成"发生即知晓"。
一、系统功能总览
| 功能模块 | 实现方式 | 作用 |
|---|---|---|
| 密码输入 | 4×4 矩阵键盘(本地)+ JDY-31 蓝牙(远程) | 双通道密码输入,支持按键与手机远程解锁 |
| 密码验证与解锁 | STM32 比对预设密码 | 密码正确自动开锁,OLED 更新锁状态 |
| 错误报警 | 错误计数 + SIM800C GSM 短信 | 连续 3 次密码错误,自动向指定手机发送警报短信 |
| 防拆检测 | TTP223 电容触摸开关 | 检测暴力开锁行为,触发即拨打报警电话 |
| 语音播报 | JR6001 语音模块 | 解锁成功提示、报警语音播报 |
| 状态显示 | OLED12864(I2C) | 实时显示锁状态与操作反馈 |
系统围绕"验证---反馈---报警"三条主线工作:正常路径下密码验证通过即开锁并给出显示与语音双重反馈;异常路径下,无论是连续输错密码还是暴力拆锁,GSM 模块都会第一时间把警报推送到用户手机,远程感知、及时处置。
二、核心模块选型对比
2.1 主控模块选型
| 方案 | 芯片 | 特点 |
|---|---|---|
| 方案1 | STM32F103C8T6 | ARM Cortex-M3 内核,72MHz 主频,64KB Flash / 20KB SRAM,外设接口丰富,支持睡眠/停止/待机多种低功耗模式,开发环境成熟(STM32CubeMX + HAL 库 + ST-Link) |
| 方案2 | ESP32-WROOM-32 | 双核 240MHz,内置 WiFi/蓝牙,4MB Flash + 520KB SRAM,适合物联网应用 |
密码锁需要驱动矩阵键盘扫描、多路串口(GSM + 蓝牙 + 语音)与 I2C 显示,且对低功耗待机有要求。STM32 内核稳定、外设成熟、社区资源丰富,选择方案1:STM32F103C8T6。
2.2 密码输入模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | 矩阵键盘 | 行列扫描识别按键,4×4 仅需 8 个引脚实现 16 键,结构简单、成本低、技术成熟 |
| 方案2 | 电容触摸按键 | 响应快、无机械磨损、外观现代,但成本高、多点设计复杂 |
密码输入需要数字 0-9、确认、删除等十余个按键,成本与开发效率优先。选择方案1:矩阵键盘。
2.3 防拆检测模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | TTP223 触摸开关 | 电容感应原理,高灵敏度、低功耗,单点检测,接口简单易于集成 |
| 方案2 | CAP1188 触摸开关 | 支持 8 路触摸输入,I2C 接口,带 LED 驱动与自动校准,适合多点触控场景 |
防拆检测只需在锁体关键位置布置单点感应,无需多点触控。选择方案1:TTP223 触摸开关。
2.4 GSM 通信模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | SIM800C | 四频段 GSM(850/900/1800/1900MHz),支持语音通话、SMS、GPRS,通信稳定、功耗低,兼容全球大部分 GSM 网络 |
| 方案2 | SIM7000 | 集成 2G/3G/4G LTE(含 Cat-M1、NB-IoT),下行速率最高 300kbps,适合大数据量应用 |
报警场景只需发送短信和拨打电话,对数据速率无要求。选择方案1:SIM800C,传统嵌入式应用的成熟之选。
2.5 数据显示模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | OLED12864 | 128×64 点阵,自发光高对比度,广视角,黑底白字显示清晰,支持图形显示 |
| 方案2 | LCD1602 | 16×2 字符显示,价格经济,但仅支持字符、需背光 |
锁具界面需显示锁状态、输入提示等多级信息,OLED 的分辨率与显示效果优势明显。选择方案1:OLED12864。
2.6 无线通信模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | JDY-31 | 蓝牙 4.0 模块,低功耗,传输速率 1Mbps,AT 指令配置简单,与主流智能设备无缝配对 |
| 方案2 | NRF24L01 | 2.4GHz 射频模块,跳频抗干扰,传输距离 100 米以上,速率最高 2Mbps,但需配对专用收发端 |
远程输入密码面向手机蓝牙场景,JDY-31 兼容性与配置简易性更契合。选择方案1:JDY-31。
2.7 语音播报模块选型
| 方案 | 模块 | 特点 |
|---|---|---|
| 方案1 | JR6001 | 内置 USB 接口,语音文件直接上传 SPI Flash,更新便捷免驱动,24 位 DAC 输出音质优良 |
| 方案2 | AB1000 | 支持蓝牙无线更新语音内容,兼容 MP3/WAV 多格式,32 位 DAC 输出 |
密码锁的提示语音(解锁成功、报警提示)内容固定、更新频率低,USB 直拷的方式更简单可靠。选择方案1:JR6001。
三、系统接线总表
| 模块 | 与 STM32F103C8T6 的连接 | 关键引脚说明 |
|---|---|---|
| 4×4 矩阵键盘 | 4 行线→GPIO 输出,4 列线→GPIO 输入 | 逐行输出低电平扫描,列线读回定位按键 |
| TTP223 触摸开关 | VCC→电源,GND→地,OUT→GPIO 输入 | 触摸发生时 OUT 输出高电平 |
| SIM800C GSM 模块 | VCC→4V 稳定电源,GND→地,TXD→RX,RXD→TX,SIM 卡插槽+天线 | 串口 9600 波特率,注意电平匹配与天线连接 |
| OLED12864 显示屏 | VCC→3.3V,GND→地,SCL→I2C 时钟线,SDA→I2C 数据线 | SSD1306 驱动,I2C 接口 |
| JDY-31 蓝牙模块 | VCC→3.3V,GND→地,TXD→RX,RXD→TX | UART 串口透传 |
| JR6001 语音模块 | TX→RX,RX→TX,GND 共地,AUDIO OUT→扬声器,VCC→3.3V/5V | UART 按命令协议收发,BUSY 脚可接 GPIO 监测状态 |
| 开锁继电器 | 控制端→GPIO | 密码验证通过后吸合开锁 |
| 时钟电路 | HSE 外部高频晶振 + LSE 低速晶振 | PLL 倍频后系统主时钟最高 72MHz |
| 复位电路 | 复位按键 + 电阻 + 电容,接 NRST 引脚 | 上拉电阻保持高电平,电容滤除噪声 |
四、系统软件设计
4.1 主程序设计
系统上电后完成 GPIO、定时器、UART 串口及 GSM、语音模块的寄存器初始化,随后进入主循环:持续监测本地键盘与远程蓝牙的密码输入→密码验证→正确则开锁并显示语音双反馈,错误则累计计数;主循环同时实时监测防拆开关,一旦检测到暴力开锁行为立即触发 GSM 报警链。主程序骨架如下:
int main(void)
{
/* 系统初始化 */
Sys_Init(); // GPIO、定时器配置
USART_Init(); // GSM/蓝牙/语音串口初始化
OLED_Init(); // I2C + SSD1306 初始化
GSM_Init(); // AT指令链:测试连接→关回显→设字符集→文本模式
KeyBoard_Init(); // 行线输出、列线输入,初始全高电平
while (1)
{
key = KeyBoard_Scan(); // 矩阵键盘扫描(含去抖动)
if (key) Input_Password(key);
if (Bluetooth_DataReady()) // 远程蓝牙密码输入
Input_Password(BT_Get());
if (Password_Check()) { // 密码验证
Relay_Unlock(); // 继电器开锁
OLED_Show("Unlocked"); // 状态显示
Voice_Play(VOICE_OK); // 语音"解锁成功"
err_cnt = 0;
} else if (input_done) {
if (++err_cnt >= 3) { // 连续3次错误
GSM_SendSMS(ALERT_NUM, "密码错误警报");
err_cnt = 0;
}
}
if (TTP223_Touched()) { // 防拆检测:OUT为高电平
if (Debounce_OK()) { // 去抖动过滤误触发
GSM_Call(ALERT_NUM); // 拨打预设报警电话
Voice_Play(VOICE_ALARM); // 播放报警语音
}
}
}
}
4.2 密码输入程序
矩阵键盘扫描流程:行线设为输出、列线设为输入,所有行线初始置高电平防误识别→逐行将该行拉低、其余行保持高电平→读取全部列线电平,某列为低电平即定位到该行列交点的按键→去抖动处理确认按键稳定→扫描完成后行线恢复高电平,进入下一轮扫描。本地键盘与远程蓝牙输入的密码走同一套验证与计数逻辑。
4.3 防拆检测程序
TTP223 的 OUT 引脚接 STM32 GPIO 输入,主循环轮询读取引脚状态:检测到高电平即发生触摸事件(锁体被外力触碰/撬动)。程序通过软件延时判断触摸信号的持续时间完成去抖动,过滤短促干扰信号,确认有效后才触发 GSM 拨打报警电话并播放报警语音,最大限度降低误报概率。
4.4 GSM 通信程序
SIM800C 串口波特率 9600,报警链路按 AT 指令序列执行:发送 AT 测试连接→ATE0 关闭回显,避免回显信息干扰解析→设置 GSM 字符集→AT+CMGF=1 设为文本短信模式→每条指令间加延时确保模块响应。发送短信时执行 AT+CMGS="号码"\r\n,写入短信内容后依次发送 0x0D、0x1A 结束符提交。每次发送通过检查 USART_FLAG_TXE 标志位确认数据完整发出,并清空接收缓存读取模块返回,确保链路状态可靠。
4.5 显示与语音播报程序
OLED 显示程序使能 I2C 与 GPIO 时钟,SCL/SDA 配置为开漏输出,写字节流程依次为:等待总线空闲→生成 START 信号→发送器件地址→发送寄存器地址与数据→生成 STOP 信号。初始化序列完成关闭显示、设置内存地址模式、设置对比度、开启显示等配置,随后按页地址模式逐页填充背景、清屏,再以 6×8 / 8×16 点阵显示字符串、16×16 点阵显示中文、按行写入显示位图。
JR6001 语音播报程序配置 USART 后,通过等待 TXE 标志位的方式逐字节发送指令字符串,按模块命令协议触发对应编号的语音播放,BUSY 引脚可实时监测播报状态。
五、系统实现与测试
5.1 功能测试
| 测试项目 | 测试方法 | 测试结果 |
|---|---|---|
| 密码输入与解锁 | 模拟用户经矩阵键盘输入正确密码 | 系统立即识别解锁,OLED 反馈锁状态,语音播放"解锁成功" |
| 错误密码报警 | 连续 3 次输入错误密码 | 错误计数触发报警机制,警报短信自动发送至指定手机号 |
| 防拆检测 | 模拟外部撬动锁体 | TTP223 准确识别触摸信号,GSM 拨打预设报警电话,语音播放警报信息 |
| 去抖动有效性 | 施加短促干扰信号 | 去抖动处理有效过滤干扰,误报警概率显著降低 |
5.2 硬件与软件调试
硬件按主控→密码输入→GSM→显示→语音→防拆→无线的顺序依次焊接,焊接完成后检查电源地线、观察各模块指示灯确认供电正常,再逐一测试模块功能。软件开发在 Keil 环境完成,编译生成 .hex 后经 ST-Link 下载,调试中重点验证键盘去抖动处理与 GSM 的 AT 指令响应,通过断点与变量监控定位问题,最终系统稳定运行达到设计要求。
六、总结
这款电子密码锁系统以 STM32F103C8T6 为核心,把"验证、反馈、报警"三件事做成了闭环:矩阵键盘与蓝牙双通道输入让解锁既本地可用又远程可控;密码正确时 OLED 显示与 JR6001 语音播报双重反馈;连续三次输错或 TTP223 检测到暴力拆锁时,SIM800C 立即以短信、电话两种方式把警报送到用户手机。系统各模块选型兼顾成熟度与成本,软硬件协同测试验证了识别准确性与报警及时性,为智能家居与物联网场景下的智能锁具开发提供了一个完整可复用的工程参考。