XINDU · SMART AGRICULTURE · TECHNICAL DOCUMENT

🌱 EM菌改善盆栽土壤及白菜长势智能监测

基于 STM32F103C8T6、pH/湿度/温度传感器与 Flask Web 仪表盘的双盆对照实验系统,用连续数据记录 EM 菌对土壤环境和白菜出芽情况的影响。

一、项目概览

系统以两个盆栽为实验对象:A 盆加入 EM 菌液,B 盆作为不加菌液的对照组。STM32 采集土壤 pH、土壤湿度、空气温度和空气湿度,串口以 JSON 发送到 Flask,浏览器每 2 秒读取一次并更新仪表盘。

实验组 A营养土 + EM 菌液 10–20 ml;记录 pH、湿度、温度与出芽数。
对照组 B同批营养土,不添加 EM 菌液;前端使用同一总种子数进行对照展示。
实验周期14 天;每天记录数据,比较两组环境指标和白菜长势。
文档中的“目标值/范围”分为两类:代码中的模拟数据边界用于演示容错;实验判定应以同批次、同光照和同浇水条件下的连续记录为准,不能用单个瞬时值下结论。

二、硬件系统架构

土壤 pH 传感器 ─┐
土壤湿度传感器 ─┤
SHT31 温湿度 ───┼─> STM32F103C8T6 ─UART 9600bps─> USB 转串口 ─> Flask
OLED 0.96 寸 ───┤                                      │
旋钮 / 按键 ────┘                                      ▼
                                                Web 仪表盘
                                                A/B 盆对照数据

硬件模块职责

模块作用输出/接口
STM32F103C8T6采样调度、ADC 转换、I²C 设备读取、串口打包USART1 TX,9600,8N1
pH 传感器采集土壤酸碱度模拟量 → PA0,必须做 1kΩ + 2kΩ 分压
电容式土壤湿度采集土壤含水状态模拟量 → PA1
SHT31采集空气温度、空气湿度I²C,地址 0x44,PB8/PB9
OLED本地显示关键数据和状态软件 I²C,PB6/PB7,地址 0x3C

📸 硬件实物照片

以下照片按参考页面的硬件展示流程完整保留,图片已经纳入本项目静态资源,不依赖外部图片站。

GY-SHT31-D 温湿度传感器
GY-SHT31-D 温湿度传感器
TDS 电导率探头
TDS 电导率探头
CH340 USB转串口
CH340 USB转串口
ST-LINK/V2 下载器
ST-LINK/V2 下载器
0.96寸 OLED 显示屏
0.96寸 OLED 显示屏
MB-102 面包板
MB-102 面包板
杜邦线 母对母
杜邦线(母对母)
面包板跳线
面包板跳线
面包板飞线
面包板飞线

📋 硬件模块详解

感知层 · I²C

1. GY-SHT31-D 温湿度传感器 🌡

I²C 数字温湿度传感器,典型精度 ±0.3°C / ±2%RH。SCL/SDA 接入 STM32 后持续采集环境温湿度,并通过串口 JSON 上传到网页。当前 EM 项目使用 PB8/PB9 作为 SHT31 总线。

感知层 · ADC

2. TDS 电导率探头 💧

模拟量探头经 STM32 ADC 采样后可换算为电导率/ppm,用于扩展营养液或土壤溶液监测。当前 EM 项目 PA0 的主配置为 pH 模拟传感器;若替换为 TDS,需同步修改固件标定公式和前端字段。

通信层

3. CH340 USB 转串口 🔌

USB 转 TTL 串口模块,将 STM32 的 UART 数据送入电脑。当前系统采用 9600 bps、8N1;接线时 TX 与对端 RX 交叉,GND 必须共地。

编程工具

4. ST-LINK/V2 下载器 💻

通过 SWD 接口(SWCLK、SWDIO、GND、3.3V)给 STM32 烧录和调试固件,支持 Keil MDK 编译、下载、断点和变量查看。

本地显示

5. 0.96 寸 OLED 显示屏 📺

SSD1306、128×64 分辨率、I²C 地址 0x3C,用于在不打开网页时查看温度、湿度、pH/扩展传感器读数和连接状态,是远程仪表盘之外的现场校验屏。

结构件

6. MB-102 面包板与连接线 🔧

MB-102 面包板、面包板跳线、杜邦线(母对母)和飞线用于搭建传感器与 STM32 的原型电路。无须焊接即可快速替换模块;正式实验前应固定电源轨并检查每个 GND。

与当前 EM 项目的对应关系:本页完整保留参考页面的 TDS 图片与模块卡片,但当前部署版本的核心土壤传感器是 pH 探头,PA0 接口与 pH 分压电路以“引脚接线表”为准;TDS 属于可替换扩展方案。

三、引脚接线与电气约束

外设STM32 引脚协议注意事项
OLED 0.96PB6=SCL,PB7=SDA软件 I²CVCC 接 3.3V,地址 0x3C
SHT31-DPB8=SCL,PB9=SDAI²C独立总线,地址 0x44
pH 模拟输出PA0 / ADC1_CH0ADC5V 输出先经过 1kΩ + 2kΩ 分压,STM32 ADC 不超过 3.3V
土壤湿度PA1 / ADC1_CH1ADC确认传感器输出范围为 0–3.3V
旋钮编码器PB12=CLK,PB13=DTGPIO用于调节实验参数
按键/蜂鸣器PB5、PB14 / PA1GPIO上电前检查是否与模拟输入复用冲突
串口输出PA9 / USART1_TXUARTUSB 转串口接电脑,9600,8N1

四、系统工作流程

启动 Flask
  ↓
SensorReader.start()
  ↓
扫描 Arduino / STM32 串口
  ├─ 找到设备:打开串口,解析 JSON
  └─ 未找到/读数超时:切换模拟数据,15 秒后重连
  ↓
缓存最新数据(线程锁保护)
  ↓  GET /api/data?t=时间戳
浏览器每 2 秒请求一次
  ↓
更新 pH、温湿度、发芽数、连接状态与图表

单次数据包格式

{"ph": 6.8, "moisture": 65, "temperature": 25.0,
 "sprout": 13, "total": 20, "sprout_pct": 65,
 "em_active": 1, "sht31_ok": 1, "connected": true}

五、软件系统设计

层级文件/接口职责
硬件采集层硬件源码-STM32/ADC、I²C、OLED 显示、UART JSON 输出。
串口服务层后端/serial_reader.py扫描串口、读取 JSON、校验字段、维护线程安全缓存、断线模拟与重连。
Web 服务层后端/app.py提供 / 页面和 /api/data 数据接口,监听 0.0.0.0。
展示层前端/index.html仪表盘、A/B 盆卡片、pH/湿度/温度图表、连接状态。

状态机设计

状态进入条件系统行为
SCAN服务启动列出串口,优先匹配 Arduino、CH340、STM32、USB Serial。
CONNECTED串口打开且收到有效 JSON更新传感器缓存,connected=true。
SIMULATED无设备或连续 8 秒无有效数据生成演示数据,connected=false,维持网页可用。
RECONNECT模拟模式每 15 秒尝试重新打开上次串口,成功则回到 CONNECTED。

六、软件设计与关键逻辑

后端数据边界

字段默认值模拟模式边界/变化
ph7.0目标 6.8,限制在 0–14,随机扰动 ±0.2。
moisture65每次 ±3,限制在 20–95。
temperature25.0°C每次 ±0.3°C,限制在 18–32°C。
sprout / total0 / 20发芽数按采集数据展示,前端计算 sprout / total × 100%

前端刷新逻辑

页面通过 /em-monitor/api/data(本地运行时为 /api/data)发起 XMLHttpRequest;成功后更新所有仪表和图表,失败则显示离线状态并保留上一次界面。

异常处理

七、数据质量保障

时间一致传感器数据在同一 JSON 帧内传输,避免 pH 与温湿度来自不同采样时刻。
范围保护模拟数据使用 0–14、20–95%、18–32°C 边界;真实硬件需在固件端增加 ADC 越界检查。
对照可复现A/B 盆使用相同种子总数 20 颗,记录光照、浇水和 EM 菌用量后再比较。

实验记录建议

记录项频率用途
pH、土壤湿度、温度、空气湿度每 2 秒自动刷新,实验日志每日汇总观察环境变化趋势
出芽数每日固定时间计算出芽率并比较 A/B 组
浇水、EM 菌液、光照备注每次操作后解释异常波动,避免把操作差异误判为菌剂效果

八、软件基础设置信息

项目当前设置
后端框架Flask 3.x,Python 3.12 虚拟环境
串口依赖PySerial 3.5,9600,8N1
网页监听Windows 本机 0.0.0.0:5018;公网通过 HTTPS 反向代理访问
公网入口https://cdqtech.online/em-monitor/
数据接口GET /em-monitor/api/data
刷新周期前端 2000 ms;串口读取超时 0.5 s
断线策略连续 8 s 无有效数据切模拟;每 15 s 尝试重连

九、运行与部署

C:\em-monitor\
├─ backend\
│  ├─ app.py
│  ├─ serial_reader.py
│  └─ requirements.txt
├─ frontend\
│  ├─ index.html
│  └─ tech.html
└─ run_em_monitor.bat

服务通过 EM_WEB_PORT=5018 启动,nginx 将 /em-monitor/ 转发到 Windows 服务器的 5018 端口。接入真实硬件时,将 STM32 的串口接到服务器电脑;未接硬件时仍可打开页面查看模拟数据。

安全提示:pH 传感器输出若超过 3.3V,必须先经过分压再接入 STM32 ADC;任何接线调整都应先断电。