基于 STM32F103 + FreeRTOS 的智能水域监测系统设计与实现



一、项目概述

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

图1:设备正在运行

设备正在运行

二、硬件平台

模块型号 / 参数
主控 MCUSTM32F103C8T6 (Cortex-M3, 72MHz)
RTOSFreeRTOS (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)酸碱度
ORPADC (DMA)氧化还原电位(支持负值)
TDSADC (DMA)溶解性总固体 (ppm)
浊度ADC (DMA)水质浑浊度 (NTU)
光照ADC (DMA)环境光照 (lux)
温度DHT11环境温度 (摄氏度)
湿度DHT11环境湿度 (百分比)

图2:设备 OLED 屏显示内容

设备OLED屏显示内容

三、FreeRTOS 多任务架构

系统采用 4 任务并行 架构,充分利用 FreeRTOS 提供的同步机制实现任务间高效通信:

任务优先级栈大小周期功能
SensorTaskNormal1KB连续循环ADC + DHT11 传感器采集,互斥锁保护共享数据
OledTaskBelowNormal1.5KB100msOLED 双页显示,增量刷新优化
KeyTaskLow512B20ms按键扫描,消息队列传递翻页事件
NetTaskLow3KB事件驱动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 图标

手机APP图标

六、与裸机版对比

此 FreeRTOS 版本由裸机版迁移而来,主要改进点:

方面裸机版FreeRTOS 版
架构单 while(1) 大循环4 任务并行
传感器保护互斥锁 (Mutex)
UART 接收轮询中断 + 二值信号量
按键通信直接读写全局变量消息队列 (Message Queue)
OLED 刷新全量刷新增量刷新优化
HAL 平台StdPeriph LibHAL + CubeMX
WiFi 超时Delay_ms 阻塞FreeRTOS 非阻塞延时

图4:设备运行 + 手机 APP 实时在线数据展示

设备正在运行以及手机APP实时更新在线更新数据展示

七、总结

本项目完整实现了从传感器采集 - 本地显示 - 云端上传 - APP 远程监控的全链路 IoT 闭环,核心亮点:

  • FreeRTOS 多任务 + 互斥锁 / 信号量 / 消息队列三种同步机制的规范应用
  • ESP8266 非阻塞 WiFi 连接状态机 + 重试 / 冷却机制,健壮的断线恢复能力
  • OLED 增量刷新优化,减少无效 I2C 通信
  • OneNet MQTT 物模型标准对接,支持云端双向通信

项目源码GitHub - water-monitor

posted @ 2026-06-22 08:37  grey_smith  阅读(3)  评论(0)    收藏  举报