这个基于STM32的智能水质监测系统是我去年为一个水产养殖场设计的实用项目。当时养殖场老板正为频繁的水质问题头疼——鱼苗死亡率居高不下,却找不到明确原因。传统的人工检测方式不仅效率低,而且无法实时掌握水质变化。这套系统从需求分析到最终落地用了两个月时间,现在已经在三个养殖池稳定运行半年多,成功将鱼苗死亡率降低了40%。
系统核心功能包括五大水质参数检测(水温、浑浊度、电导率、PH值、水位)、阈值报警、水泵控制和远程监控。特别值得一提的是,我们在ESP01S WiFi模块的基础上开发了轻量级物联网协议,使得百元级的硬件也能实现稳定的远程数据传输。下面我会从硬件选型到软件实现的完整过程,分享这个项目的实战经验。
选择STM32F103C8T6作为主控主要基于三点考量:
注意:C8T6的Flash只有64KB,在添加OTA功能时需要特别注意空间占用。我们最终通过裁剪不必要的库函数,将固件控制在58KB以内。
| 传感器类型 | 型号 | 测量范围 | 精度 | 供电电压 | 接口方式 | 单价 |
|---|---|---|---|---|---|---|
| 水温 | DS18B20 | -55~125℃ | ±0.5℃ | 3-5.5V | 单总线 | 8元 |
| 浑浊度 | TSW-30 | 0-1000NTU | ±5% | 5V | 模拟量 | 35元 |
| TDS | 电导率模块 | 0-1000ppm | ±10% | 3.3-5V | 模拟量 | 25元 |
| PH | PH-4502C | 0-14PH | ±0.1 | 5V | 模拟量 | 50元 |
| 水位 | 压电式 | 0-5m | ±1cm | 5V | 模拟量 | 15元 |
实际使用中发现TSW-30在高温环境下读数会漂移,我们通过软件校准解决了这个问题——在固件中增加了温度补偿算法,根据DS18B20的读数动态调整浑浊度值。
系统采用12V/2A电源适配器供电,通过LM2596降压到5V给传感器,再经AMS1117-3.3转换给MCU。关键设计细节:
PH传感器接口是最容易出问题的部分。我们的设计方案:
c复制// 硬件电路
PH_Sensor -> 10KΩ分压 -> OP07运放(增益=3) -> 100nF电容滤波 -> STM32_ADC
// 软件校准公式
final_ph = (adc_value * 3.3 / 4096 - 1.024) * 3.5 + 7.0;
每周需要用标准PH缓冲液校准一次,校准数据保存在EEPROM中。
在水泵启停时曾出现传感器读数跳变,通过以下措施解决:
四层板堆叠方案:
特别将WiFi模块放置在板边,天线下方净空处理。晶振周围做包地,与高速信号线保持3mm以上间距。
采用时间片轮询架构,关键任务周期:
c复制void main() {
while(1) {
if(tick_1ms) {
key_scan(); // 1ms扫描
led_blink(); // 状态指示
}
if(tick_100ms) {
sensor_read(); // 100ms采样
alarm_check(); // 阈值判断
}
if(tick_1s) {
oled_refresh(); // 1s刷新
wifi_upload(); // 数据上报
}
}
}
采用三级滤波算法:
以TDS值为例的处理流程:
c复制float get_tds_value() {
static float buf[5];
float sum=0, avg, std=0;
// 采样
buf[4] = adc_read(ADC_CH_TDS) * 0.5; // 0.5为系数
// 滑动平均
for(int i=0; i<5; i++) sum += buf[i];
avg = sum / 5;
// 标准差计算
for(int i=0; i<5; i++) std += pow(buf[i]-avg, 2);
std = sqrt(std/5);
// 剔除异常值
if(fabs(buf[4]-avg) > 3*std)
return avg;
else
return buf[4];
}
自定义轻量级JSON协议:
json复制{
"dev":"WQ001",
"time":"2024-03-20 14:30",
"data":{
"temp":26.5,
"tds":320,
"ph":7.2,
"turb":15,
"level":80
},
"alarm":0
}
ESP01S通过AT指令连接MQTT服务器,设置15秒心跳包。实测在弱网环境下,通过以下策略保证通信可靠:
问题1:TDS值持续显示为0
问题2:WiFi频繁断开
通过以下改进将系统功耗从3.2W降至1.8W:
当前系统已经支持通过手机APP查看实时数据,后续计划增加:
我在调试过程中最大的体会是:水质监测系统的稳定性90%取决于抗干扰设计。特别是当水泵等大功率设备与传感器共处同一环境时,必须从电源隔离、信号调理、软件滤波多个层面综合处理。这个项目所有的电路设计和代码片段都已经过实际验证,读者可以直接参考使用。