硬件平台:STM32F103C8T6 + DX-BT04-E 蓝牙模块 + 指纹识别模块
软件平台:Keil MDK + STM32 标准库 应用场景:智能门锁、智能保险柜、门禁系统
一、前言
随着物联网技术的快速发展,智能安防设备已经成为现代生活中不可或缺的一部分。传统的单一解锁方式(如仅指纹或仅密码)已经难以满足用户对便捷性和安全性的双重需求。
本文将分享一套基于深圳大夏龙雀科技有限公司 DX-BT04-E 蓝牙模块打造的智能安防设备设计方案,通过蓝牙远程控制 + 指纹本地识别的双模控制架构,实现灵活、安全、可靠的智能安防管理。
二、方案概述
本方案以 STM32F103C8T6 为主控 MCU,搭配大夏龙雀 DX-BT04-E 双模蓝牙模块和串口指纹识别模块,构建一套双模智能安防控制系统。系统支持两种解锁方式:
| 解锁方式 | 通信接口 | 认证机制 | 适用场景 |
|---|---|---|---|
| 指纹识别 | USART1 (115200bps) | 指纹特征匹配 | 本地快速解锁 |
| 蓝牙远程 | USART2 (9600bps) | 密码 + 指令协议 | 手机 APP 远程控制 |
双模控制的核心设计理念:指纹优先,蓝牙并行。当指纹模块处于通信状态时,蓝牙指令暂缓处理,确保指纹识别的实时性;指纹空闲时,蓝牙指令即时响应。
三、硬件选型 ——DX-BT04-E 蓝牙模块
3.1 模块简介
DX-BT04-E 是深圳大夏龙雀科技有限公司专为智能无线数据传输打造的蓝牙模块,采用上海博通 BK3432 芯片,支持SPP V3.0 + BLE V4.2双模蓝牙协议,兼具兼容性与低功耗优势。
3.2 核心参数
| 参数 | 详情 |
|---|---|
| 芯片型号 | BK3432 |
| 蓝牙规格 | SPP V3.0 + BLE V4.2 |
| 工作电压 | 3.3V |
| 工作电流 | 6mA |
| 空旷距离 | 75m |
| 传输速率 | 双模 10K Byte/s |
| UART 波特率 | 2400~115200bps (默认 9600) |
| 工作温度 | -40~+85°C |
| 认证资质 | CE、FCC、SRRC |
3.3 引脚连接
本方案中使用以下关键引脚与 STM32 连接:
| BT04-E 引脚 | 引脚功能 | STM32 引脚 | 说明 |
|---|---|---|---|
| Pin 21 (UART-RX) | 串口数据输入 | PA2 (USART2_TX) | MCU 发送 → 模块接收 |
| Pin 22 (UART-TX) | 串口数据输出 | PA3 (USART2_RX) | 模块发送 → MCU 接收 |
| Pin 2 (LINK-STATUS) | 连接状态输出 | PA4 (GPIO 输入) | 连接时输出高电平 |
| Pin 13 (VBAT) | 电源 | 3.3V | 模块供电 |
| Pin 1/12 (GND) | 地 | GND | 系统共地 |
3.4 AT 指令兼容性
DX-BT04-E 的 AT 指令集与 DX-BT36 完全兼容,支持以下关键指令:
| 指令 | 功能 | 默认值 |
|---|---|---|
AT | 测试串口连通性 | - |
AT+NAME<name> | 设置蓝牙名称 | BT36 |
AT+BAUD<param> | 设置波特率 | 3 (9600) |
AT+LADDR | 查询 MAC 地址 | - |
AT+NOTI<param> | 通知连接状态 | 0 (关闭) |
AT+PWRM<param> | 设置工作模式 | 1 (正常) |
AT+POWE<param> | 设置发射功率 | C (+4dB) |
AT+ADVI<param> | 设置广播间隔 | 5 (546ms) |
AT+RESET | 软件重启 | - |
AT+DEFAULT | 恢复出厂设置 | - |
- 命令模式:蓝牙未连接时,模块响应 AT 指令
- 透传模式:蓝牙连接后,模块直接透传 UART 数据
四、系统架构设计
系统整体架构图
系统采用中心化架构,STM32F103 作为主控核心,通过两路独立 USART 分别连接指纹模块和蓝牙模块:
- USART1 (115200bps):连接指纹识别模块,PB0 作为触摸唤醒引脚
- USART2 (9600bps):连接 DX-BT04-E 蓝牙模块,PA4 监测蓝牙连接状态
- SPI 接口:驱动 LCD 显示屏,实时显示系统状态
- TIM3_CH4 (PB1):PWM 输出控制舵机,模拟门锁开关动作
- PB10/PB11:LED 指示灯,红色表示错误,绿色表示成功
五、蓝牙通信协议设计
5.1 通信架构
蓝牙通信采用透传模式,手机 APP 通过 BLE 连接 BT04-E 后,发送的指令数据直接透传至 STM32 的 USART2,MCU 解析后执行相应操作并返回响应。
手机APP <--BLE V4.2--> DX-BT04-E <--UART 9600--> STM32F1035.2 指令协议格式
为保证安全性,所有控制指令均需携带密码验证字段:
| 指令格式 | 说明 |
|---|---|
OPEN:8266\r\n | 开门指令(密码:8266) |
CLOSE:8266\r\n | 关门指令 |
STATUS\r\n | 查询门锁状态(无需密码) |
INFO\r\n | 查询设备信息 |
MCU 响应格式:
| 响应格式 | 说明 |
|---|---|
OK:UNLOCK\r\n | 开门成功 |
OK:LOCK\r\n | 关门成功 |
OK:STATUS=LOCKED\r\n | 当前状态:已锁 |
OK:STATUS=UNLOCKED\r\n | 当前状态:已开 |
ERR:WRONG_PASSWORD\r\n | 密码错误 |
ERR:UNKNOWN_CMD\r\n | 未知指令 |
5.3 通信时序
以远程开门为例,完整通信流程如下:
1. 手机APP发起BLE连接请求
2. BT04-E建立连接,LINK-STATUS引脚拉高(PA4检测到高电平)
3. 手机发送指令 OPEN:8266\r\n,经BT04-E透传至STM32
4. STM32解析指令并校验密码
5. STM32通过USART2返回 OK:UNLOCK\r\n,经BT04-E透传至手机
6. STM32控制舵机转到180°,门锁打开
7. 绿色LED亮3秒,LCD显示开门成功
六、双模控制流程
双模控制流程图
6.1 主循环设计
系统主循环以 20ms 为周期运行,每次循环依次执行:
- 指纹通信处理:检查 PB0 唤醒信号,处理指纹识别全流程
- 蓝牙指令处理:指纹空闲时检查 USART2 接收缓冲,解析并执行蓝牙指令
- 状态显示更新:定期刷新 LCD 上的蓝牙连接状态
6.2 优先级机制
指纹识别具有高优先级,确保用户触摸指纹传感器时能获得即时响应。蓝牙指令在指纹处理间隙执行,不会干扰指纹通信的时序要求。
void Process_Bluetooth_Control(void) { /* 指纹处理中时不响应蓝牙指令(优先级控制) */ if(finger_state != FINGER_IDLE) { return; } /* ... 蓝牙指令处理 ... */ }七、核心代码实现
7.1 蓝牙模块初始化 (bluetooth.c)
void BT_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(BT_UART_RCC, ENABLE); RCC_APB2PeriphClockCmd(BT_UART_GPIO_RCC, ENABLE); /* PA2(USART2_TX) - 复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = BT_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(BT_UART_GPIO, &GPIO_InitStructure); /* PA3(USART2_RX) - 浮空输入 */ GPIO_InitStructure.GPIO_Pin = BT_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(BT_UART_GPIO, &GPIO_InitStructure); /* PA4(LINK-STATUS) - 上拉输入 */ GPIO_InitStructure.GPIO_Pin = BT_LINK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(BT_LINK_PORT, &GPIO_InitStructure); /* USART2配置: 9600/8/N/1 */ USART_InitStructure.USART_BaudRate = baudrate; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(BT_UART, &USART_InitStructure); /* 使能接收中断 */ USART_ITConfig(BT_UART, USART_IT_RXNE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(BT_UART, ENABLE); BT_ClearRxBuffer(); }7.2 USART2 中断接收 (bluetooth.c)
中断服务函数以\r\n作为指令结束标志,实现非阻塞式指令接收:
void USART2_IRQHandler(void) { if(USART_GetITStatus(BT_UART, USART_IT_RXNE) != RESET) { uint8_t data = USART_ReceiveData(BT_UART); if(bt_rx_index < BT_RX_BUF_SIZE - 1) { /* 检测\r\n作为指令结束 */ if(data == '\n' && bt_rx_index > 0 && bt_rx_buffer[bt_rx_index - 1] == '\r') { bt_rx_buffer[bt_rx_index] = data; bt_rx_index++; bt_rx_buffer[bt_rx_index] = '\0'; bt_rx_complete = 1; // 标记接收完成 } else if(data != '\r' || bt_rx_index > 0) { bt_rx_buffer[bt_rx_index] = data; bt_rx_index++; } } else { bt_rx_buffer[bt_rx_index] = '\0'; bt_rx_complete = 1; } USART_ClearITPendingBit(BT_UART, USART_IT_RXNE); } }7.3 指令解析与密码验证 (bluetooth.c)
BT_CmdType BT_ParseCommand(void) { char* cmd_str = (char*)bt_rx_buffer; char cmd[16] = {0}; char pass[16] = {0}; int sep_pos = -1; /* 查找冒号分隔符 */ for(int i = 0; i < bt_rx_index; i++) { if(cmd_str[i] == ':') { sep_pos = i; break; } } /* 无密码指令(STATUS/INFO) */ if(sep_pos == -1) { if(strncmp(cmd_str, "STATUS", 6) == 0) return BT_CMD_QUERY_STATUS; if(strncmp(cmd_str, "INFO", 4) == 0) return BT_CMD_QUERY_INFO; return BT_CMD_UNKNOWN; } /* 提取指令和密码 */ // ... (提取cmd和pass字符串) /* 校验密码 */ if(strncmp(pass, BT_PASSWORD, BT_PASSWORD_LEN) != 0) { return BT_CMD_WRONG_PASS; } /* 匹配指令 */ if(strncmp(cmd, "OPEN", 4) == 0) return BT_CMD_UNLOCK; else if(strncmp(cmd, "CLOSE", 5) == 0) return BT_CMD_LOCK; else if(strncmp(cmd, "STATUS", 6) == 0) return BT_CMD_QUERY_STATUS; return BT_CMD_UNKNOWN; }7.4 双模控制主循环 (main.c)
void Process_Bluetooth_Control(void) { if(finger_state != FINGER_IDLE) return; // 指纹优先 BT_UpdateLinkStatus(); BT_ProcessCommand(); switch(bt_result) { case BT_RESULT_UNLOCK: Execute_Unlock("Bluetooth"); delay_ms(3000); Execute_Lock(); // 蓝牙开门后自动关门 bt_result = BT_RESULT_IDLE; Display_Initial_Screen(); break; case BT_RESULT_LOCK: Execute_Lock(); led_ok(); bt_result = BT_RESULT_IDLE; Display_Initial_Screen(); break; case BT_RESULT_ERROR: Display_Status("BT Auth Failed"); led_err(); bt_result = BT_RESULT_IDLE; delay_ms(2000); Display_Initial_Screen(); break; default: break; } }7.5 主函数
int main(void) { PC14_PC15_Init(); delay_init(); LCD_Init(); uart_init(115200); // USART1 - 指纹模块 BT_Init(9600); // USART2 - 蓝牙模块(BT04-E默认9600) Wake_Pin_Init(); led_Init(); Servo_Init(&door_servo); Servo_InitPosition(&door_servo); Display_Initial_Screen(); while(1) { Process_Finger_Communication(); // 优先处理指纹 Process_Bluetooth_Control(); // 蓝牙指令处理 // 定期更新蓝牙状态显示 delay_ms(20); } }八、应用场景推荐
8.1 智能门锁
推荐理由:双模控制完美适配家庭门锁场景。家庭成员可注册指纹实现 "秒开" 体验;访客或远程场景下,主人可通过手机 APP 蓝牙远程开锁,无需物理钥匙。BT04-E 的 75 米空旷距离覆盖典型家庭范围,BLE V4.2 低功耗特性确保门锁长效运行。
我对智能门锁的扩展建议:
- 增加防撬传感器(振动检测),异常时通过蓝牙推送告警
- 结合
AT+NOTI指令通知连接状态变化,实现防尾随检测 - 利用
AT+BIND绑定指定手机 MAC 地址,实现白名单管理
8.2 智能保险柜
推荐理由:保险柜对安全性要求极高,双模控制提供双重认证机制 —— 可设计为 "指纹 + 蓝牙" 双重验证才能开柜,大幅提升安全等级。BT04-E 支持冬眠模式,适合保险柜电池供电的长期运行需求。
我对智能保险柜的扩展建议:
- 设计双重认证流程:先指纹验证,再蓝牙确认,两步完成开柜
- 增加震动传感器 + 温度传感器,异常状态蓝牙实时告警
- 利用 BT04-E 的 GPIO 口扩展传感器,减少 MCU 引脚占用
- 开柜记录本地存储 + 蓝牙同步至手机 APP
8.3 门禁系统
推荐理由:办公场所门禁需要管理多用户权限。指纹模块支持多指纹注册(ID 管理),BT04-E 的AT+FILTER指令可设置蓝牙名称过滤,实现指定设备自动连接授权。管理员可通过手机 APP 远程为访客开门。
我对门禁系统的扩展建议:
- 利用指纹 ID 实现分级权限管理(普通用户呀,管理员之类)
- 蓝牙临时授权:发送限时开门码,过期自动失效
- 结合
AT+INQ搜索功能,实现蓝牙设备自动发现与配对
8.4 其他应用场景
| 应用场景 | 核心需求 | BT04-E 优势 |
|---|---|---|
| 智能药箱 | 定时提醒 + 安全取药 | 低功耗冬眠模式 + GPIO 传感器扩展 |
| 智能快递柜 | 取件码 + 身份验证 | BLE 透传 + 密码认证协议 |
| 车载安防 | 指纹启动 + 远程解锁 | 75 米通信距离 + SRRC 认证 |
| 智能工具柜 | 权限管理 + 使用记录 | 多用户指纹 ID + 蓝牙日志同步 |
九、BT04-E 模块使用注意事项
9.1 电源设计
- 供电电压范围为 3.0~3.6V,典型值 3.3V
- 建议在 VBAT 引脚附近放置22uF + 0.1uF去耦电容,防止射频突发传输时电压跌落
- 断电后 MCU 连接模块的所有 IO 口必须配置为下拉,防止微弱电流导致模块异常
9.2 PCB 布局
- 模块天线部分应靠 PCB 边缘放置,天线下方载板铣空
- 天线方向至少保留 5mm 自由空间,平行方向不允许铺铜走线
- 产品外壳避免使用金属,金属部件应远离天线区域
9.3 软件设计要点
- 蓝牙模块默认波特率 9600bps,修改波特率后需软件重启生效
- 透传模式下串口数据直接透传,需自行设计应用层协议
LINK-STATUS引脚可用于检测连接状态,但仅在正常工作模式下有效- 低功耗模式下串口不响应指令,需通过 KEY 引脚唤醒
十、总结
本方案基于大夏龙雀 DX-BT04-E 蓝牙模块,实现了蓝牙远程 + 指纹本地的双模智能安防控制。方案具有以下特点:
- 双模冗余:指纹与蓝牙互为备份,任一方式失效不影响系统可用性
- 安全可靠:蓝牙指令需密码认证,指纹采用累加和校验,双重保障
- 低功耗设计:BT04-E 支持冬眠模式,适合电池供电场景
- 扩展性强:AT 指令灵活配置,GPIO/SPI/I2C 接口丰富,适配多种传感器扩展
- 认证齐全:CE/FCC/SRRC 三重认证,满足国内外市场准入要求
DX-BT04-E 模块凭借其双模蓝牙协议、丰富的 AT 指令集、低功耗特性和完善的认证资质,是智能安防设备开发的理想选择。