从六路传感器采集到自动控制、上云远程监控,手把手讲透设计全流程
STM32水稻苗大棚环境监测系统:从六路传感器采集到自动控制、上云远程监控,手把手讲透设计全流程
一、为什么水稻育苗需要一套"自动管家"?
水稻育苗期是整个种植周期里最娇贵的阶段:温度高了烧苗、低了僵苗,湿度大了沤根、小了干尖,光照不够苗体徒长,CO₂浓度和土壤 pH 跑偏又直接影响养分吸收。传统做法是人工巡棚、凭经验开关棚膜和卷帘,数据滞后、误差大,一场倒春寒就可能毁掉一棚苗。
这篇要讲的系统,就是用一块 STM32 把大棚里环境温湿度、光照、土壤温湿度、CO₂、土壤 pH 六类参数实时盯住,超阈值自动拉窗帘、补光、开风扇、启加热、浇水,还能把数据推到阿里云,手机 APP 和电脑上位机随时远程看。整体成本低、模块全是常见型号,跟着本文从选型到接线到逻辑一次走通。
二、系统功能拆解:它到底能干什么
| 功能 | 说明 |
|---|---|
| 数据采集 | 环境温湿度(DHT11)、土壤温度(DS18B20)、土壤湿度(YL-69)、光照(光敏电阻)、CO₂(JW01)、土壤 pH(PH-4502C) |
| 实时显示 | 0.96 寸 OLED 轮播各路数据与阈值 |
| 阈值自动控制 | 超上限/下限自动驱动对应执行器,无需人工干预 |
| 定时功能 | 按设定时间段自动启停补光、水泵、风扇(如夜间补光) |
| 远程监控 | ESP8266 通过 MQTT 上传阿里云,手机 APP / PC 上位机远程查看与控制 |
| 本地交互 | 按键设置阈值、切换显示、查看模式 |
自动控制逻辑(论文核心策略,可直接当需求文档用):
| 监测量 | 超限条件 | 动作 |
|---|---|---|
| 光照 | 高于上限 | 拉窗帘遮光 |
| 光照 | 低于下限 | 开补光灯 |
| 环境温度 | 过高 | 开风扇降温 |
| 环境温度 | 过低 | 开加热器 |
| 环境湿度 | 过高 | 开风扇除湿 |
| 土壤湿度 | 过低 | 开水泵浇灌 |
三、器件选型:为什么选它不选它
论文里每组器件都做了双方案对比,这里浓缩成一张表,把"为什么最终选它"的理由讲清楚:
| 模块 | 选定型号 | 落选方案 | 选定理由 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | ATmega328P | Cortex-M3 @72MHz、64KB Flash/20KB SRAM、外设丰富,跑多路 ADC+串口+MQTT 更从容 |
| 显示 | OLED12864 (SSD1306) | ILI9341 TFT | 静态显示功耗低、I2C 两线接线简单,适合常显数据;TFT 全彩但费电且 SPI 占用资源多 |
| 环境温湿度 | DHT11 | HTU21D | 预算有限且精度要求不高,DHT11 ±2℃/±5%RH 够用,单总线一根线连接最简单 |
| 土壤温度 | DS18B20 | LM35 | 数字输出免 ADC、±0.5℃ 精度、1-Wire 一线可挂多点,省去模拟信号调理 |
| 土壤湿度 | YL-69 | FC-28 | 便宜、即插即用,适合入门级农业项目 |
| 土壤 pH | PH-4502C | SEN0161 | 模拟输出直接进 ADC、经济,校准流程标准 |
| CO₂ | JW01-CO2-V2.2 | MH-Z19 | NDIR 原理 ±50ppm、0~5000ppm 量程覆盖大棚场景,价格更友好 |
| 时钟 | DS1302 | M41T62 | 三线串口易接、带电池备份、±2ppm 对定时需求足够 |
| 云平台 | 阿里云物联网平台 | oneNET / 纯 QT 直连 | 设备接入+MQTT+数据存储一体,配合 QT 上位机与 uni-app APP 双端落地 |
成本参考(淘宝常见价,非论文数据):主控板 10 元级、OLED 8 元、DHT11 3 元、DS18B20 3 元、YL-69 3 元、光敏模块 2 元、JW01 CO₂ 40~60 元、PH-4502C 15 元、DS1302 3 元、ESP8266-01S 8 元、继电器/SSR 若干 10 元上下------整机 100 出头即可开搭。
四、硬件接线:一张表 + 三个容易踩的坑
论文中的核心接线整理如下(注意:论文原文存在个别模板残留冲突,见文末避坑提示,实物请以随文原理图为准):
| 模块 | 引脚 | 接 STM32 |
|---|---|---|
| OLED12864 (I2C) | SDA / SCL | PB7 / PB6 |
| DS18B20 (1-Wire) | DQ | PB8(接 4.7kΩ 上拉到 3.3V) |
| YL-69 土壤湿度 | AO | ADC 输入(模拟口,接 PA1 附近通道) |
| 光敏电阻模块 | OUT | ADC 输入 |
| PH-4502C | OUT | ADC 输入 |
| JW01 CO₂ | TX/RX | USART3(UART 通信,数据 0x2C 开头 6 字节协议) |
| ESP8266-01S | RX/TX | PA2 / PA3(3.3V 供电) |
| 继电器/SSR 组 | IN | GPIO 控制 窗帘/补光/风扇/加热/水泵 |
三个高频坑(来自论文调试部分 + 工程常识):
- ESP8266 要独立稳压:01S 模块 WiFi 发射瞬间电流可达 300mA+,和主控共用 3.3V LDO 容易复位重启。建议单独一路 AMS1117-3.3 供电,串口可加电平匹配。
- 1-Wire 必须有上拉:DS18B20 的 DQ 线不加 4.7kΩ 上拉电阻,会偶发性读不到温度------这是"代码没问题但数据时好时坏"最常见的元凶。
- 模拟量共地:YL-69、光敏、pH 三路模拟信号的地必须和 STM32 共地,否则 ADC 读数漂移得离谱。
五、软件设计:主循环 + 六路阈值控制怎么落
开发环境:Keil MDK5,标准外设库。主程序思路非常清晰:
- 初始化:中断分组 → 延时 → USART1(115200 调试) → 定时器 → OLED → 蜂鸣器 → 各路传感器(DHT11/DS18B20/3 路 ADC/DS1302)→ WiFi/MQTT 缓冲;
- 上电自检:OLED 显示欢迎信息,蜂鸣器/继电器复位到初始态;
- 主循环 :反复调用显示控制函数
OLED_Display_Cotrol(),内部按"工作模式"分流:- 模式 0:按传感器实时值与阈值比对,驱动对应继电器/LED;
- 模式 1:按 DS1302 时间点定时启停设备(水泵、风扇、补光);
- 显示切换:OLED 三屏------实时数据 / 阈值参数 / 日期时间+模式;
- 数据上云:按时间片定期打包数据进发送缓冲,走 MQTT 报文处理(连接确认、订阅确认、心跳、云端推送的阈值修改指令)。
5.1 DHT11 读取时序(最容易写错的地方)
论文里把 DHT11 时序写得非常具体,直接照着实现:
主机拉低 DATA 20ms 复位 → 拉高 30µs
→ 切输入模式,等 DHT11 拉低 40~80µs(存在应答)
→ 再拉高 40~80µs(应答完成)
→ 连续读 40 位数据:每 bit 先低 50µs,高 26~28µs=0、高 70µs=1
→ 校验:(buf[0]+buf[1]+buf[2]+buf[3]) == buf[4] 才有效
→ 湿度=buf[0],温度=buf[2]
校验和不通过直接丢弃本次数据,这是 DHT11 数据偶尔跳变的保底手段。
5.2 土壤温度 DS18B20 流程
复位 → 检测存在应答 → 发跳过 ROM(0xCC) → 发启动转换(0x44) → 读低字节 LSB → 读高字节 MSB → 拼接成温度值。转换需要时间,连续读之间记得加延时。
5.3 三路 ADC 采集(土壤湿度/光强/pH)
统一套路:ADC 初始化(独立模式、单通道、12 位右对齐)→ 软件触发 → 等 EOC 标志 → 多次采样取平均(每次间隔 5ms)→ 换算:
- 电压 = ADC值 × 参考电压 / 4096;
- 光强 = 电压 × 100(论文里直接线性放大到百分比量纲,够大棚控制用);
- pH 由电压按电极校准线换算(PH-4502C 需两点校准)。
5.4 阈值控制核心逻辑(伪代码)
// 浇水量控制:以土壤湿度为标准
if (soilHum < hum_low) {
soilHumLowFlag = 1;
}
if (soilHumLowFlag) {
GPIO_SetBits(RELAY_WATER_PORT, RELAY_WATER_PIN); // 开水泵
}
// 补光:光强低于下限 → 开灯(PC13 拉低/拉高按电路)
if (light < light_low) {
lightLowFlag = 1;
}
if (lightLowFlag) {
// 点亮补光灯
}
// 降温:环境温度超上限 → 开风扇
// 加热:环境温度低于下限 → 开加热器
// 除湿:环境湿度超上限 → 开风扇
// 遮光:光强超上限 → 拉窗帘
每个异常都用一个独立标志位,控制函数只查标志位,逻辑解耦后调试非常方便------这是这篇论文代码结构里值得抄的地方。
六、上云:ESP8266 + MQTT 连阿里云
单片机侧用标准 AT 指令链把 ESP8266 拉起来:
AT → OK
AT+CWMODE=1 → STA 模式
AT+CWJAP="SSID","密码" → OK(连 WiFi)
AT+CIPMUX=0 → 单连接
AT+CIPSTART="TCP","服务器IP",端口 → CONNECT
AT+CIPMODE=1 → 透传模式
进入透传后,数据包按 MQTT 报文格式组织:连接报文 → 订阅报文 → 定时发布传感器数据 → 处理 CONNACK/SUBACK/PINGRESP/云端下发指令(比如远程改阈值),收尾用 isSubstring() 匹配指令内容。
七、上位机双端:QT 桌面端 + uni-app 手机 APP
- QT 上位机:QTableWidget 实时数据面板 + QSlider/QSpinBox 设阈值 + QPushButton 发指令 + QTimer 定时拉数据刷新,MQTT 走 QMQTT 库;
- 手机 APP:HBuilderX + uni-app 开发,封装 startConnect / endConnect / reConnect / publish 四个方法对接 MQTT,注册登录 → 主页实时数据 → 图表趋势(ECharts)→ 超阈值推送告警;
- 数据层:uniCloud 连接阿里云数据库,设计用户表/设备表/消息表。
八、调试与测试结果
论文从四个层面做了验证:
- 硬件调试:逐模块供电/共地检查,用模块官方例程单独验证每颗传感器;
- 软件调试:Keil 编译 → ST-Link 烧录 → 断点 + Watch 窗口盯寄存器,逐步调通各采集函数;
- 云平台测试:设备注册、数据流规则、JSON 数据格式验证,MQTT 上下行链路正常;
- 双端测试:QT/APP 注册登录、数据实时刷新、阈值修改下发、告警推送均按预期工作。
结论:系统各项功能均按预期实现,响应速度与控制精度在可接受范围内。
九、毕设论文里常见的坑(做实物前务必看)
这篇论文本身暴露了该类毕业设计的通病,你抄作业/做实物时注意绕开:
- 引脚描述有模板残留 :论文多处把不同模拟传感器都写"接 PA1"、DS18B20 与某继电器都标 PB8------实际应以你手里原理图(.SchDoc)实际网络标号为准,别照文字接,会打架;
- CO₂ 传感器前后不一致 :电路章写 MQ-135(模拟输出),选型与软件章写 JW01(UART3),代码里是
CO2_Uart3_Init()------以代码和 UART3 协议为准; - WiFi 模块供电:ESP8266 与主控共 3.3V 是复位重启重灾区,独立供电最稳;
- OLED 与传感器共 I2C/单总线:若扩展多设备注意地址与总线时序冲突。
十、总结
这套系统本质是一个"六路采集 + 阈值控制 + 定时 + 上云"的通用农业物联网框架:STM32F103C8T6 做主控、DHT11/DS18B20/YL-69/光敏/JW01/PH-4502C 六类传感器、OLED 本地显示、ESP8266 走 MQTT 上阿里云、QT+uni-app 双端远程。换掉传感器和阈值,它可以直接变成温室大棚、菌菇房、养殖舍的监控系统------框架是通用的,改的只是"监测什么、超限干什么"。
如果你想做实物,建议先按最小闭环跑通:DHT11 + OLED + 一路继电器控制风扇,确认采集与阈值逻辑没问题,再逐步加土壤、CO₂、pH 和上云,每加一路单独验证一路,能少踩一半坑。
六、资料内容完整工程资料(原理图、PCB、代码、元件清单)

七、资料获取方式
