1. GY-SHT31-D 温湿度传感器 🌡
I²C 数字温湿度传感器,典型精度 ±0.3°C / ±2%RH。SCL/SDA 接入 STM32 后持续采集环境温湿度,并通过串口 JSON 上传到网页。当前 EM 项目使用 PB8/PB9 作为 SHT31 总线。
基于 STM32F103C8T6、pH/湿度/温度传感器与 Flask Web 仪表盘的双盆对照实验系统,用连续数据记录 EM 菌对土壤环境和白菜出芽情况的影响。
系统以两个盆栽为实验对象:A 盆加入 EM 菌液,B 盆作为不加菌液的对照组。STM32 采集土壤 pH、土壤湿度、空气温度和空气湿度,串口以 JSON 发送到 Flask,浏览器每 2 秒读取一次并更新仪表盘。
土壤 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 |
以下照片按参考页面的硬件展示流程完整保留,图片已经纳入本项目静态资源,不依赖外部图片站。









I²C 数字温湿度传感器,典型精度 ±0.3°C / ±2%RH。SCL/SDA 接入 STM32 后持续采集环境温湿度,并通过串口 JSON 上传到网页。当前 EM 项目使用 PB8/PB9 作为 SHT31 总线。
模拟量探头经 STM32 ADC 采样后可换算为电导率/ppm,用于扩展营养液或土壤溶液监测。当前 EM 项目 PA0 的主配置为 pH 模拟传感器;若替换为 TDS,需同步修改固件标定公式和前端字段。
USB 转 TTL 串口模块,将 STM32 的 UART 数据送入电脑。当前系统采用 9600 bps、8N1;接线时 TX 与对端 RX 交叉,GND 必须共地。
通过 SWD 接口(SWCLK、SWDIO、GND、3.3V)给 STM32 烧录和调试固件,支持 Keil MDK 编译、下载、断点和变量查看。
SSD1306、128×64 分辨率、I²C 地址 0x3C,用于在不打开网页时查看温度、湿度、pH/扩展传感器读数和连接状态,是远程仪表盘之外的现场校验屏。
MB-102 面包板、面包板跳线、杜邦线(母对母)和飞线用于搭建传感器与 STM32 的原型电路。无须焊接即可快速替换模块;正式实验前应固定电源轨并检查每个 GND。
| 外设 | STM32 引脚 | 协议 | 注意事项 |
|---|---|---|---|
| OLED 0.96 | PB6=SCL,PB7=SDA | 软件 I²C | VCC 接 3.3V,地址 0x3C |
| SHT31-D | PB8=SCL,PB9=SDA | I²C | 独立总线,地址 0x44 |
| pH 模拟输出 | PA0 / ADC1_CH0 | ADC | 5V 输出先经过 1kΩ + 2kΩ 分压,STM32 ADC 不超过 3.3V |
| 土壤湿度 | PA1 / ADC1_CH1 | ADC | 确认传感器输出范围为 0–3.3V |
| 旋钮编码器 | PB12=CLK,PB13=DT | GPIO | 用于调节实验参数 |
| 按键/蜂鸣器 | PB5、PB14 / PA1 | GPIO | 上电前检查是否与模拟输入复用冲突 |
| 串口输出 | PA9 / USART1_TX | UART | USB 转串口接电脑,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。 |
| 字段 | 默认值 | 模拟模式边界/变化 |
|---|---|---|
| ph | 7.0 | 目标 6.8,限制在 0–14,随机扰动 ±0.2。 |
| moisture | 65 | 每次 ±3,限制在 20–95。 |
| temperature | 25.0°C | 每次 ±0.3°C,限制在 18–32°C。 |
| sprout / total | 0 / 20 | 发芽数按采集数据展示,前端计算 sprout / total × 100%。 |
页面通过 /em-monitor/api/data(本地运行时为 /api/data)发起 XMLHttpRequest;成功后更新所有仪表和图表,失败则显示离线状态并保留上一次界面。
| 记录项 | 频率 | 用途 |
|---|---|---|
| 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 的串口接到服务器电脑;未接硬件时仍可打开页面查看模拟数据。