当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]本项目是一个专为STM32 Blue Pill设计的房间监控系统,使用Wokwi进行仿真。系统可测量温度、湿度和光照强度,检测运动,并通过SSD1306 OLED显示屏显示信息。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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭