1. 项目背景与核心功能解析
这个基于STM32的智能净水器检测系统,是我去年为一个家用净水设备厂商做的定制方案。传统净水器往往只具备基础过滤功能,用户无法实时掌握水质变化、滤芯寿命等关键数据。我们设计的这套系统,通过集成PH值、液位、水流量和TDS(总溶解固体)四项核心检测功能,让净水器真正实现了"可感知、可量化"的智能化升级。
系统采用STM32F103C8T6作为主控,这是我在工业控制项目中验证过数十次的经典型号。它具备72MHz主频和足够的ADC通道,能稳定处理多路传感器数据。实际测试中,系统可以做到:
- PH值检测精度±0.1
- 液位测量误差<3mm
- 水流速检测范围0.5-5L/min
- TDS检测分辨率1ppm
关键设计要点:所有传感器信号都经过硬件滤波电路处理,ADC采样率设置为1kHz。这是为了避免水泵启停时产生的电磁干扰影响测量精度。
2. 硬件系统架构设计
2.1 传感器选型与接口设计
PH检测采用工业级复合电极,搭配专用信号调理电路。这里有个细节:电极输出的是高阻抗微弱信号(约0.1mV/pH),我们使用了TI的LMP7721运放搭建阻抗变换电路,将输出转换为0-3.3V标准信号。
液位检测方案比较了超声波和电容式两种方案后,最终选择了性价比更高的电容式传感器。在PCB上设计了一组平行电极,通过测量介电常数变化来检测水位。实际调试时发现,水箱壁厚超过5mm会影响检测灵敏度,因此在水箱结构设计阶段就需要提前介入。
TDS检测使用了一对钛合金电极,通过测量水体的导电率来推算溶解固体含量。这里有个重要经验:电极间距需要根据水箱尺寸精确计算,我们最终采用的公式是:
code复制间距(mm) = 水箱宽度(mm) × 0.12 + 5
2.2 主控电路设计
STM32最小系统板外扩了以下关键电路:
- 4路精密运放电路(PH、TDS各1路,备用2路)
- 2路H桥驱动(控制进水阀和冲洗阀)
- 1路RS485接口(预留远程监控)
- 0.96寸OLED显示屏接口
电源部分特别设计了三级滤波:
- 输入端的π型滤波(10μF+100Ω+10μF)
- LDO前后的磁珠隔离
- 每个传感器供电端的LC滤波
3. 软件系统实现
3.1 传感器数据处理算法
PH值检测采用了动态校准算法:
c复制#define CALIBRATION_POINTS 3
float ph_calibration[CALIBRATION_POINTS][2] = {
{1.0, 0.35}, // pH4.01标准液对应电压
{7.0, 1.65}, // pH7.00标准液
{10.0, 2.85} // pH10.01标准液
};
float calculate_ph(float voltage) {
// 分段线性插值
for(int i=0; i<CALIBRATION_POINTS-1; i++){
if(voltage >= ph_calibration[i][1] &&
voltage <= ph_calibration[i+1][1]){
float slope = (ph_calibration[i+1][0] - ph_calibration[i][0]) /
(ph_calibration[i+1][1] - ph_calibration[i][1]);
return ph_calibration[i][0] + slope * (voltage - ph_calibration[i][1]);
}
}
return -1; // 超出量程
}
TDS值计算需要考虑温度补偿:
c复制float calculate_tds(float conductivity, float temp) {
// 25℃基准温度补偿
float compensation = 1.0 + 0.02 * (temp - 25.0);
return conductivity * compensation * 0.65; // 0.65为经验系数
}
3.2 多任务调度设计
使用FreeRTOS创建了4个任务:
- 传感器数据采集任务(优先级3)
- 用户界面刷新任务(优先级2)
- 设备控制任务(优先级2)
- 数据上传任务(优先级1)
关键之处在于数据采集任务的优先级设置。实测发现,当水泵启动时会产生约50ms的电压波动,如果此时正在进行ADC采样会导致数据异常。我们最终采用的解决方案是:
- 在水泵控制GPIO上添加中断
- 中断触发时挂起ADC采样任务
- 波动结束后通过信号量恢复任务
4. 系统校准与调试
4.1 PH传感器校准实操
需要准备三种标准缓冲液(pH4.01、7.00、10.01)。校准步骤:
- 将电极浸入pH7.00溶液,等待读数稳定(约2分钟)
- 记录ADC原始值,设为中点校准值
- 重复上述过程处理酸性和碱性溶液
- 将三组数据写入代码中的校准数组
常见错误:校准时未等待足够长时间,电极响应需要至少90秒才能稳定。我习惯用定时器设置120秒超时。
4.2 液位传感器标定
使用标准量筒进行标定的技巧:
- 从空箱开始,每加入50ml水记录一次ADC值
- 到达满量程后,绘制ADC-液位曲线
- 在程序中存储10个关键点的查表数据
- 实际运行时采用线性插值计算
我们发现一个有趣现象:当水面有泡沫时,电容值会比实际水位偏高约8%。因此在算法中添加了泡沫检测逻辑:
c复制if(current_adc > prev_adc + threshold && flow_rate > 0){
// 可能产生泡沫,启用滤波
apply_low_pass_filter();
}
5. 生产测试方案
为批量生产设计了自动化测试工装,包含:
- 模拟水源系统(可精确控制PH和TDS)
- 可编程负载(模拟不同水流量)
- 自动扫码枪(绑定测试数据与设备SN)
每个产品需要完成以下测试项:
- PH传感器线性度测试(4.0-10.0范围)
- TDS传感器阶跃响应测试(0-1000ppm)
- 液位传感器重复性测试(10次满量程循环)
- 阀门密封性测试(1.5倍工作压力)
测试数据通过Modbus协议上传至MES系统,我们开发了Python分析脚本自动生成测试报告:
python复制def generate_report(test_data):
fig, axs = plt.subplots(2, 2)
axs[0,0].plot(test_data['ph'], label='PH值')
axs[0,1].scatter(test_data['tds'], test_data['conductivity'])
# ...其他绘图代码
plt.savefig(f'report_{sn}.png')
6. 现场问题排查实录
6.1 TDS读数漂移问题
首批50台设备中有3台出现TDS值缓慢上升的现象。经过排查发现:
- 问题设备电极焊接使用了含铅焊锡
- 铅离子在水中缓慢溶解导致导电率上升
- 更换为无铅焊锡后问题解决
教训:与水接触的金属部件必须符合饮用水标准(NSF/ANSI 61认证)。
6.2 电磁干扰导致PH值跳变
某客户安装现场出现PH值随机跳变,最终定位原因:
- 净水器与微波炉共用插座
- 微波炉工作时产生2.4GHz辐射干扰
- 在传感器线缆上加装磁环后解决
改进措施:
- 所有信号线改用双绞屏蔽线
- 电源输入端增加EMI滤波器
- 软件添加突变值滤波算法
7. 系统优化与升级
7.1 低功耗优化
为电池供电版本开发的节能措施:
- 传感器供电改为PWM控制(10%占空比)
- STM32主频动态调整(72MHz↔8MHz)
- OLED刷新率从60Hz降至2Hz
实测待机电流从12mA降至0.8mA,CR2032电池可工作6个月。
7.2 云平台对接
通过ESP-01S模块增加WiFi功能,数据上传协议设计要点:
- 采用MQTT over TLS加密传输
- 数据包包含设备MAC地址和时间戳
- 异常数据立即触发推送通知
一个实用的重传机制实现:
c复制#define MAX_RETRY 3
void upload_data(float ph, float tds) {
int retry = 0;
while(retry < MAX_RETRY){
if(mqtt_publish(ph, tds) == SUCCESS){
break;
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
retry++;
}
if(retry == MAX_RETRY){
store_to_flash(); // 存储到本地闪存
}
}
这个项目最让我自豪的是其可靠性设计——在首批500台设备投放市场两年后,故障率低于0.4%。关键经验是:与水相关的电子设备必须考虑潮湿环境、温度变化和长期稳定性,所有接插件都采用了镀金工艺,PCB做了纳米涂层防护。