基于 STM32F103 + FreeRTOS 的智能水域监测系统设计与实现
一、项目概述
本项目设计了一套基于 STM32F103C8T6 微控制器 + FreeRTOS 实时操作系统的智能水域监测设备。系统集成 pH、ORP、TDS、浊度、光照、温湿度等多路水质传感器,通过 ESP8266 WiFi 模块将数据上传至 OneNet 物联网云平台,并配备 OLED 显示屏 实现本地数据可视化,同时支持手机 APP 远程实时监控。
图1:设备正在运行

二、硬件平台
| 模块 | 型号 / 参数 |
|---|---|
| 主控 MCU | STM32F103C8T6 (Cortex-M3, 72MHz) |
| RTOS | FreeRTOS (CMSIS-RTOS v2 接口) |
| HAL 库 | STM32F1xx HAL Driver |
| 开发环境 | STM32CubeMX + Keil MDK 5 |
| WiFi 模块 | ESP8266 (UART2, AT 指令驱动) |
| 显示模块 | 0.96 寸 OLED (I2C, 128x64) |
| 云平台 | OneNet IoT (MQTT 协议) |
传感器清单
| 参数 | 传感器 / 接口 | 说明 |
|---|---|---|
| pH 值 | ADC (DMA) | 酸碱度 |
| ORP | ADC (DMA) | 氧化还原电位(支持负值) |
| TDS | ADC (DMA) | 溶解性总固体 (ppm) |
| 浊度 | ADC (DMA) | 水质浑浊度 (NTU) |
| 光照 | ADC (DMA) | 环境光照 (lux) |
| 温度 | DHT11 | 环境温度 (摄氏度) |
| 湿度 | DHT11 | 环境湿度 (百分比) |
图2:设备 OLED 屏显示内容

三、FreeRTOS 多任务架构
系统采用 4 任务并行 架构,充分利用 FreeRTOS 提供的同步机制实现任务间高效通信:
| 任务 | 优先级 | 栈大小 | 周期 | 功能 |
|---|---|---|---|---|
| SensorTask | Normal | 1KB | 连续循环 | ADC + DHT11 传感器采集,互斥锁保护共享数据 |
| OledTask | BelowNormal | 1.5KB | 100ms | OLED 双页显示,增量刷新优化 |
| KeyTask | Low | 512B | 20ms | 按键扫描,消息队列传递翻页事件 |
| NetTask | Low | 3KB | 事件驱动 | ESP8266 WiFi + OneNet MQTT,二值信号量驱动 |
RTOS 同步机制
- 互斥锁 (Mutex):保护 g_sensor_data 全局传感器数据,防止 SensorTask 写入时被 OledTask/NetTask 读到不完整数据
- 二值信号量 (Binary Semaphore):UART2 接收中断释放信号量,NetTask 获取并处理,实现中断到任务的低延迟传递
- 消息队列 (Message Queue):KeyTask 检测按键后 put 页码,OledTask get 翻页事件,实现任务间解耦通信
核心代码:任务创建与同步对象初始化
void App_Init(void)
{
sensorMutexHandle = osMutexNew(NULL);
uart2RxSemaphore = osSemaphoreNew(1, 0, NULL);
keyQueue = osMessageQueueNew(4, sizeof(uint8_t), NULL);
sensorTaskHandle = osThreadNew(SensorTask, NULL, &sensorTask_attributes);
oledTaskHandle = osThreadNew(OledTask, NULL, &oledTask_attributes);
keyTaskHandle = osThreadNew(KeyTask, NULL, &keyTask_attributes);
netTaskHandle = osThreadNew(NetTask, NULL, &netTask_attributes);
}
四、OLED 双页显示设计
OLED 采用双页显示方案,通过按键切换页面:
- 第 0 页:pH / ORP / 温度 / WiFi 状态
- 第 1 页:TDS / 浊度 / 光照 / 湿度
同时实现了 增量刷新优化:仅当数值变化时才更新对应 OLED 区域,大幅减少 I2C 通信量,提升显示流畅度。
五、网络通信与云端对接
ESP8266 WiFi 连接
ESP8266 通过 UART2 串口与 STM32 通信,采用 AT 指令驱动,实现了 4 步渐进连接 + MQTT 重试 + 冷却机制 (cooldown) 的非阻塞连接策略。
OneNet 云平台 MQTT 对接
系统通过 MQTT 协议接入 OneNet 物联网平台,支持:
- 属性上报:每 2s 通过 OneNet 物模型上传全部 7 路传感器数据
- 心跳保活:维持 MQTT 长连接
- 命令下发:订阅平台 reply topic,支持云端指令接收
图3:手机 APP 图标

六、与裸机版对比
此 FreeRTOS 版本由裸机版迁移而来,主要改进点:
| 方面 | 裸机版 | FreeRTOS 版 |
|---|---|---|
| 架构 | 单 while(1) 大循环 | 4 任务并行 |
| 传感器保护 | 无 | 互斥锁 (Mutex) |
| UART 接收 | 轮询 | 中断 + 二值信号量 |
| 按键通信 | 直接读写全局变量 | 消息队列 (Message Queue) |
| OLED 刷新 | 全量刷新 | 增量刷新优化 |
| HAL 平台 | StdPeriph Lib | HAL + CubeMX |
| WiFi 超时 | Delay_ms 阻塞 | FreeRTOS 非阻塞延时 |
图4:设备运行 + 手机 APP 实时在线数据展示

七、总结
本项目完整实现了从传感器采集 - 本地显示 - 云端上传 - APP 远程监控的全链路 IoT 闭环,核心亮点:
- FreeRTOS 多任务 + 互斥锁 / 信号量 / 消息队列三种同步机制的规范应用
- ESP8266 非阻塞 WiFi 连接状态机 + 重试 / 冷却机制,健壮的断线恢复能力
- OLED 增量刷新优化,减少无效 I2C 通信
- OneNet MQTT 物模型标准对接,支持云端双向通信

浙公网安备 33010602011771号