基于STM32与FreeRTOS的实时多传感器房间监控系统
本项目是一个专为STM32 Blue Pill设计的房间监控系统,使用Wokwi进行仿真。系统可测量温度、湿度和光照强度,检测运动,并通过SSD1306 OLED显示屏显示信息。FreeRTOS任务负责分担传感器、输入、显示、运动检测和报警等各部分的工作。
动机
目标是练习构建一个实时嵌入式系统,其中多个输入和输出协同工作。该项目还展示了FreeRTOS队列、事件组以及互斥锁如何帮助任务共享数据并协调其工作。
功能
•DHT22传感器的温度和湿度读数
•光敏电阻的相对光照强度读数
•通过旋转编码器选择四个OLED页面
•当温度超出18–30°C时发出声音报警
•运动控制的主动(ACTIVE)和非主动(INACTIVE)状态
•串行诊断功能,受互斥锁保护
电路
DHT22、光敏电阻、PIR传感器和旋转编码器为STM32提供输入信号,OLED、蜂鸣器和串口监视器则提供输出。完整的接线和引脚连接请参见Wokwi电路图。
系统架构
传感器和输入信号进入STM32。FreeRTOS任务处理这些信号,更新选定的OLED页面,控制蜂鸣器,并打印诊断信息。
FreeRTOS架构
本项目使用五个任务:
独立的队列用于将传感器读数传递给显示和报警任务。事件位用于传递系统状态,一个互斥锁保护串口输出。
优先级:运动和编码器输入需要快速响应,因此具有最高优先级;传感器和报警任务可容忍约2秒的采样周期;OLED刷新可以等待,因此DisplayTask的优先级最低。
沟通。
SensorTask 向两个独立的单项覆盖队列写入数据,因此 DisplayTask 和 AlarmTask 都能获取最新的完整传感器读数。
一个事件组包含三个位:EVENT_ACTIVE 和 EVENT_MOTION(由 MotionTask 设置)以及 EVENT_ALARM(由 AlarmTask 设置)。
一个互斥锁保护 USART1,以防止不同任务的诊断线路发生交叉干扰。
所有权方面,DisplayTask 是唯一向 OLED 写入数据的任务,AlarmTask 是唯一驱动蜂鸣器的任务,因此不存在硬件写操作的竞争。
工作原理
SensorTask 每约两秒采样一次 DHT22 和光敏电阻。OLED 显示四个页面之一:温度、湿度、光照或运动。旋转编码器可切换页面。
当温度低于 18°C 或高于 30°C 时,AlarmTask 会触发蜂鸣器。PIR 运动传感器使系统保持活动状态。若 15 秒内无运动,系统将转为非活动状态;再次检测到运动后,系统恢复至活动状态。
测试与验证
原生 PlatformIO 测试运行通过了 13 个单元测试,涵盖报警范围、页面导航和状态转换。静态分析已完成,本项目运行中未发现高风险或中等风险问题。
在 Wokwi 中执行了 10 项功能检查,包括传感器显示更新、编码器导航、报警的激活与清除,以及基于运动的状态变化。请在验证文档中准确记录输入内容和观察结果。
演示
01 温度
02 运动页面
03 湿度设置与显示
04 光照页面与输入
05 识别到运动
遇到的问题
由于 PowerShell 会话中没有 GCC 和 G++,原生测试最初无法运行。在安装 MSYS2 工具链并将其 bin 目录添加到 PATH 后,测试成功运行。PlatformIO 还要求测试套件必须位于名为 test 的文件夹内。
经验总结
该项目展示了如何为每个 FreeRTOS 任务分配明确的责任,并使用队列和事件位进行通信。它还说明了为什么原生单元测试和仿真具有不同的目的:单元测试用于检查决策逻辑,而 Wokwi 则用于验证集成的仿真系统。
本文编译自hackster.io





