1. 项目概述:打造高精度水质检测终端
去年夏天,我在参与一个乡村饮用水安全项目时,发现基层水质监测存在两个痛点:现有设备要么价格昂贵(动辄上万元),要么精度不足(误差超过20%)。这促使我设计了一套基于STM32单片机的多参数水质检测装置,整套BOM成本控制在300元以内,实测pH值误差±0.2,浊度误差±5NTU,完全满足《GB/T 14848-2017地下水质量标准》的Ⅲ类水检测要求。
这套装置的核心创新在于三点:采用工业级传感器配合自适应滤波算法提升信噪比;独创的电导率温度补偿模型使测量稳定性提升40%;通过模块化设计实现传感器即插即用。目前该设计已成功应用于6个乡镇的水源监测点,最长连续运行记录达217天。
2. 系统架构设计解析
2.1 硬件拓扑设计
系统采用"一主多从"架构(如图1),STM32F103RCT6作为主控,通过以下接口与各模块交互:
- 模拟量输入:pH/浊度传感器→LM358信号调理→12位ADC
- 数字量输入:DS18B20温度传感器直连GPIO
- 通信接口:ESP-01S WiFi模块通过USART3连接
- 人机交互:1.44寸TFT屏(SPI接口)+3键键盘
关键设计决策:选择STM32F103系列因其具备3个USART和2个SPI接口,恰好满足多外设需求,且内置的12位ADC在10kHz采样率下仍能保持10.5位有效精度。
2.2 传感器选型对比
经过三个月实测对比,最终确定的传感器组合:
| 参数 | 型号 | 量程 | 精度 | 响应时间 |
|---|---|---|---|---|
| pH值 | SEN0161 | 0-14pH | ±0.1pH | <30s |
| 浊度 | TSW-20M | 0-1000NTU | ±3%FS | <15s |
| 电导率 | DFR0300 | 0-20ms/cm | ±5% | <60s |
| 温度 | DS18B20防水款 | -55~+125℃ | ±0.5℃ | <750ms |
实测发现浊度传感器在低浓度区间(<10NTU)线性度较差,为此开发了分段校准算法:
c复制// 浊度值分段处理算法
float get_turbidity(float raw_adc) {
if(raw_adc < 1.2) { // 0-10NTU区间
return 8.33 * raw_adc - 0.67;
} else { // 10-1000NTU区间
return 12.5 * pow(raw_adc, 1.45);
}
}
3. 核心电路实现细节
3.1 pH信号调理电路
pH传感器输出阻抗高达1GΩ,设计时需特别注意:
- 采用JFET输入型运放TL071构成电压跟随器
- 在输入端并联100MΩ电阻降低噪声影响
- 使用低漏电流电容(聚丙烯材质)做滤波

实测数据表明,该设计将输入偏置电流控制在0.1pA以下,比常规方案提升两个数量级。
3.2 抗干扰设计三要素
- 电源隔离:数字/模拟部分分别采用AMS1117-3.3和TL431基准源供电
- 信号隔离:关键模拟线路使用屏蔽线并单点接地
- 软件滤波:采用移动平均+中值滤波组合算法
c复制#define FILTER_WINDOW 5
float adc_filter(float new_val) {
static float buffer[FILTER_WINDOW];
static uint8_t index = 0;
buffer[index++] = new_val;
if(index >= FILTER_WINDOW) index = 0;
// 中值滤波
float temp[FILTER_WINDOW];
memcpy(temp, buffer, sizeof(temp));
bubble_sort(temp); // 实现略
// 取中值附近3个点做平均
return (temp[1] + temp[2] + temp[3]) / 3;
}
4. 软件架构与关键算法
4.1 主程序流程图
采用时间片轮询架构确保实时性:
code复制初始化→传感器校准→进入主循环
├─ 每100ms:读取传感器原始数据
├─ 每500ms:执行温度补偿算法
├─ 每1s:刷新显示屏数据
└─ 每5s:检查报警条件
4.2 电导率温度补偿模型
通过实验发现电导率(EC)与温度(T)的关系符合:
EC25 = ECt / [1 + α(T - 25)]
其中α不是固定值,而是与溶液成分相关。经过200组数据拟合得到修正公式:
matlab复制% MATLAB拟合结果
alpha = 0.019*(1 + 0.003*ECt); // 动态补偿系数
在STM32中实现为:
c复制float compensate_EC(float raw_EC, float temp) {
float alpha = 0.019f * (1.0f + 0.003f * raw_EC);
return raw_EC / (1.0f + alpha * (temp - 25.0f));
}
5. 生产测试与问题排查
5.1 出厂校准流程
- pH校准:依次浸入pH4.01、6.86、9.18标准缓冲液
- 浊度校准:使用Formazine标准液建立曲线
- 电导率校准:在25℃下测试1413μS/cm标准液
5.2 常见故障处理表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| pH值跳变严重 | 玻璃电极干燥或污染 | 用3mol/L KCl溶液浸泡24小时 |
| 浊度读数始终为0 | 传感器LED损坏 | 检查驱动电路MOS管(型号AO3400) |
| WiFi频繁断开 | 天线阻抗不匹配 | 在ESP-01S天线端并联1pF电容 |
| 温度显示-127℃ | DS18B20通信失败 | 检查上拉电阻(必须4.7kΩ) |
6. 实测性能数据
在本地水库连续监测7天的数据对比专业设备:
| 参数 | 本装置 | 哈希DR3900 | 误差 |
|---|---|---|---|
| pH | 7.82 | 7.85 | 0.03 |
| 浊度(NTU) | 12.3 | 12.1 | 0.2 |
| 电导率 | 356μS/cm | 362μS/cm | 1.6% |
功耗表现:采用18650电池供电时,默认1分钟采样间隔下可连续工作83天。通过优化ADC采样时间(从默认239.5周期降至55周期),功耗再降低22%。
这套设计最让我自豪的是其扩展性——上周刚通过添加ORP传感器实现了氧化还原电位检测,只需在原有代码中添加50行配置即可支持新传感器。接下来计划移植到STM32U5系列,利用其内置的硬件CRC和AES加速器实现数据安全传输。
