项目介绍
项目背景:随着物联网(IoT)技术的迅速发展,智能家居系统的需求日益增加。因此,我使用了STM32WB09KE为核心主控设计了一个智能家居蓝牙控制中枢这么一个项目。这个项目不仅能够通过无线通信技术实现对家庭环境中灯光、风扇等设备的远程控制,还能实时采集温度、湿度、光照强度等环境参数,并将这些数据反馈终端(手机、电脑等),从而让居家生活更加的舒适。
创新点:
- 双向通信控制:不同于传统的单向控制系统,这个项目实现了指令下发与设备状态反馈的闭环控制逻辑。这意味我不仅可以发送控制命令,比如开关灯或调整风扇速度,还可以实时接收设备的状态信息,确保操作的有效性和准确性。
- 多任务实时处理:这个项目能够在控制设备的同时完成对多个传感器的数据采集工作,并且还可以实时上报数据终端设备。
- 低功耗设计:利用WB09KE是一款低功耗蓝牙和超低功耗的芯片,在不影响性能的前提下大幅降低了功耗,并且在没有连接蓝牙的情况下让它会进入睡眠模式。这对于电池供电且需要长时间供电的它来说,能够显著延长设备的工作时间,减少了频繁充电的情况。
- 支持蓝牙中继:扩展了终端的无线覆盖的范围,实现更广泛的网络覆盖和更稳定的通信质量
方案框图与设计思路
本次项目采用星型拓扑结构,以STM32WB09KE为核心节点,构建了多设备协同的智能家居网络。这样窝在家中的某一个角落中就可以控制家中的蓝牙设备。具体架构如下:
需要实现以下功能
- 主控制器(STM32WB09KE)作为网络协调器,负责:
- 接收手机/PC端的控制指令并分发至目标设备
- 聚合各从设备的传感器数据并回传至手机/PC端
- 维护蓝牙网络连接状态
- 从设备节点
- 执行器模块:驱动灯光和风扇
- 传感器模块:实时采集温湿度、光照等环境参数
- 独立通信协议栈:支持自定义数据帧格式(设备ID+指令/数据)
完成本次项目大致可以以下分为5个步骤
硬件介绍
- 主控:
- NUCLEO-WB09KE开发板
- 执行单元:
- 风扇
- 灯条
- 传感器模块:
- 光照传感器
- 蓝牙终端:
- 手机
- PC
主控
- STM32WB09KE 是 Arm Cortex-M0+ 内核,具有 512 KB 的闪存和 64 KB 的 SRAM,采用VFQFPN32封装
- 符合Bluetooth®低功耗SIG核心规范版本5.3,支持点对点连接和Bluetooth® Mesh网络,允许以可靠的方式建立大规模设备网络
- 超低功耗和出色无线电性能的优化,电池寿命遥遥领先,关断模式下12 nA (1.8 V)
- 包含专用硬件功能:符合NIST特别出版物800-90B要求的真随机数发生器 (TRNG)、用于128位AES加密的安全协处理器、CRC计算单元、64位唯一ID、Flash存储器读/写保护以及公钥加速器 (PKA)
如下是NUCLEO-WB09KE这个板子的正反面介绍,标注出了重要的部分
这个内部框图庖丁解牛般的展示了电源的脉络、对外的接口。
执行单元
使用光耦来进行隔力,通过继电器来控制设备的通和断开,可以支持220V的交流电(但注意高压有风险,行动需谨慎!)
绘制的原理图和PCB就是硬件介绍中的执行单元
软件流程图
MCU
代码是参考官方提供的例程修修补补而来的,过程是非不易。以下是代码整体的运行流程图
graph TD
A[系统初始化] --> B[硬件抽象层初始化 HAL_Init]
B --> C[系统时钟配置 SystemClock_Config]
C --> D[外设时钟配置 PeriphCommonClock_Config]
D --> E[外设初始化]
E --> F[GPIO初始化 MX_GPIO_Init]
E --> G[无线电模块初始化 MX_RADIO_Init]
E --> H[定时器初始化 MX_TIM16_Init]
E --> I[加密模块初始化 MX_PKA_Init]
I --> J[BLE应用层初始化 MX_APPE_Init]
J --> K[主循环]
K --> L[BLE事件处理 MX_APPE_Process]
K --> M{按键检测}
M --> |B1按下| N[BLE数据4号位+1]
M --> |B3按下| O[BLE数据4号位+10]
K --> P{接收数据处理}
P --> |0x01标志| Q[切换蓝灯状态]
P --> |0x01标志| R[更新BLE数据2号位]
P --> |0x01标志| S[切换红灯状态]
P --> |0x01标志| T[更新BLE数据3号位]
H --> U[定时器中断触发]
U --> V[周期计数器+1]
V --> W[发送BLE数据]
上位机
PC端使用python来开发,下面是代码运行的主要流程图
graph T
A[启动应用] --> B[初始化界面]
B --> C[创建异步事件循环]
C --> D[显示主界面]
D --> E{用户操作}
E --> |扫描设备| F[启动BleakScanner]
F --> G[填充设备列表]
G --> D
E --> |选择设备| H[发起连接请求]
H --> I{连接成功?}
I --> |是| J[启用功能按钮]
I --> |否| K[显示错误信息]
J --> D
E --> |发送数据| L[选择特征UUID]
L --> M[编码输入数据]
M --> N[通过GATT发送]
N --> D
E --> |订阅通知| O[选择特征UUID]
O --> P[注册回调函数]
P --> Q[持续接收数据]
Q --> R[更新全局字节数组]
R --> S[刷新界面状态]
E --> |控制中心| T[显示控制面板]
T --> U[设备状态操作]
U --> V[发送控制指令]
V --> D
Q --> W[解析数据包]
W --> X{灯光状态变化?}
X --> |是| Y[更新LED图片]
X --> |否| Z{风扇状态变化?}
Z --> |是| AA[更新风扇图片]
AA --> AB[温度/湿度显示]
运行程序,首先会显示主界面,点击扫描设备就会罗列出附件的蓝牙设备(注意,需要开启电脑的蓝牙。若未开启,日志和弹窗会提示)
主要可以操作以下几个功能:
- 扫描设备
- 选择需要连接的设备
- 断开当前连接的设备
- 查看连接设备的UID
- 向连接的设备发送数据
- 订阅连接设置中的指定UID
- 控制中心:可以控制和查看设备的状态和数据。
整体代码还算比较简洁吧……,main函数中就三行【狗头】,将操作和显示的内容都封装到了BluetoothApp这个类中了
功能展示图说明
以下是实际的连接图,STM32WB09KE连接了一个风扇和灯条
风扇和灯条均处于未启动的状态,可以看到上位机中都是黑色的,实物里面灯条未亮起、风扇没有转动
风扇和灯条均处于启动的状态,可以看到上位机中已经亮起来了,实物里面灯条亮起、风扇处于转动(拍摄都有残影了)
遇到的问题
1. IDE不兼容
这个问题还是比较好解决的,去官网下载最新版本的Cube IDE即可(可能这个芯片比较新,老的版本不支持)
2. 蓝牙数据无法发送
需要按照定义的数据长度来发送,必须一致!下面是对这个信息的描述(写入或通知的字节数)
3.2 继电器驱动的问题
硬件设计错了,打了了两次板子,左边的是成功的,右边的是失败的
总结
2025贸泽电子M-Design创意设计竞赛是一次难忘的旅程,让我学习了蓝牙的通信技术和使用,以及python上位机蓝牙的开发。未来,我将继续保持对科技创新的热情,不断探索未知的世界,争取在更多的舞台上展现自我价值。