1. 项目概述
这个基于STM32单片机的水质检测系统,是我去年为一个水产养殖场开发的实时监测方案。养殖场老板老张当时正面临一个棘手问题:由于水质波动导致鱼苗大面积死亡,传统的人工检测方式根本无法做到24小时监控。我们最终实现的这套系统,不仅能够实时监测PH值、浊度等关键参数,还能通过WiFi将数据上传到云平台,让他在手机上随时查看水质变化。
整套系统的核心在于三个部分:STM32F103C8T6作为主控芯片,负责传感器数据采集和逻辑控制;由PH电极和浊度传感器组成的检测模块;以及ESP8266 WiFi模块实现的数据上传功能。特别要说明的是,我们选用的PH电极是工业级的复合电极,相比实验室用的玻璃电极更耐腐蚀,适合长期浸泡在水中工作。
2. 硬件设计与选型
2.1 主控芯片选择
为什么选择STM32F103C8T6?这款芯片在成本和性能之间取得了完美平衡。它具备:
- 72MHz主频的Cortex-M3内核
- 64KB Flash + 20KB RAM
- 多达37个GPIO
- 内置12位ADC
在实际测试中,我们发现它的ADC采样速率完全能满足水质检测的需求。一个重要的经验是:一定要启用芯片内部的参考电压(VREFINT),这样可以显著提高ADC采样的稳定性。我们在初期调试时就遇到过因为电源波动导致PH值跳变的问题,后来通过软件校准VREFINT完美解决了。
2.2 传感器选型与接口设计
PH检测选用的是DFRobot的SEN0161模拟输出PH电极,它的特点包括:
- 测量范围0-14PH
- 响应时间<1分钟
- 自带温度补偿
- 模拟输出0-3V对应0-14PH
浊度传感器我们最终选用了TU-201A,主要考虑因素有:
- 红外LED光源,减少环境光干扰
- 0-1000NTU量程
- 4-20mA电流输出
- IP68防水等级
这里有个重要提示:PH电极需要定期校准!我们设计了三点校准法(PH4.0/7.0/9.2标准缓冲液),在校准程序中加入了温度补偿算法。校准数据保存在STM32的Flash中,即使断电也不会丢失。
2.3 WiFi模块集成
ESP8266-01S模块通过串口与STM32通信,采用AT指令集。我们在实际部署中发现几个关键点:
- 必须为ESP8266单独供电,STM32的3.3V输出电流可能不足
- 要添加电容滤波,防止WiFi工作时影响模拟电路
- AT指令需要超时重试机制,我们实现了三次重试+错误日志功能
3. 软件架构设计
3.1 主程序流程图
系统软件采用前后台架构:
code复制初始化 → 传感器校准检测 → 主循环
↑ ↓
└── WiFi连接状态监测
↑ ↓
└── 定时采集任务(PH/浊度)
↑ ↓
└── 数据打包上传
3.2 关键算法实现
PH值计算采用Nernst方程简化公式:
code复制PH = (Vout - Voffset) / (2.303 * RT/F)
其中:
- Vout是电极输出电压
- Voffset是中性点(PH7)时的电压
- RT/F是温度补偿系数
浊度转换公式:
code复制NTU = (Iout - 4mA) * (1000/16)
Iout是传感器输出的4-20mA电流值
3.3 云平台通信协议
我们设计了一个轻量级的JSON协议:
json复制{
"device_id": "WQ001",
"timestamp": 1625097600,
"ph": 7.2,
"turbidity": 15.6,
"temp": 25.3
}
数据通过MQTT协议上传到阿里云IoT平台,QoS设置为1(至少送达一次)。在实际部署中,我们添加了离线缓存功能,当网络中断时数据会暂存到STM32的Flash中,等网络恢复后重传。
4. 实际部署经验
4.1 防水处理要点
水产养殖环境湿度极高,我们采用了多层防护:
- 主控板喷涂三防漆
- 所有接口用热缩管密封
- 传感器电缆入口处灌封环氧树脂
- 外壳选用IP65防水盒
4.2 电源管理技巧
系统采用12V铅酸电池供电,通过DC-DC转换到5V和3.3V。我们实现了:
- 低功耗模式:采样间隔可配置(1-60分钟)
- 电压监测:当电池电压低于10.8V时发送告警
- 太阳能充电接口:支持20W太阳能板
4.3 现场校准方法
不同于实验室环境,现场校准需要特别注意:
- 校准前用去离子水清洗电极
- 标准缓冲液要现配现用
- 校准过程保持水温稳定
- 记录校准时的环境温度
5. 常见问题排查
5.1 PH值漂移问题
症状:读数缓慢变化或跳动
可能原因:
- 电极老化(使用寿命约1-2年)
- 参比电极液干涸
- 电路板受潮
解决方案:
- 重新校准
- 检查电极有效期
- 用酒精清洗电极头部
5.2 WiFi连接不稳定
典型表现:数据上传失败率高
排查步骤:
- 用AT+CWJAP?检查信号强度(RSSI>-65dBm)
- 测试PING云服务器延迟(应<200ms)
- 检查天线方向(最好垂直于地面)
5.3 浊度传感器误报
常见现象:无扰动时读数突变
可能原因:
- 传感器表面附着气泡
- 水中悬浮物沉积
- 电源纹波过大
处理方法:
- 定期人工清洁传感器
- 添加软件滤波算法(中值+均值)
- 检查电源滤波电容
6. 系统优化方向
在实际运行半年后,我们总结了几点改进空间:
- 增加ORP(氧化还原电位)检测,更全面评估水质
- 改用NB-IoT通信,解决偏远地区网络覆盖问题
- 开发预测算法,根据历史数据预警水质恶化趋势
- 采用双电极设计,实现自动清洗功能
这个项目给我最大的启示是:工业现场的环境远比实验室复杂,必须考虑防水、防腐蚀、电源波动等各种现实因素。我们现在正在开发的第二代产品,就特别加强了这些方面的设计。