1. 项目概述与核心功能解析
这个基于STM32的智能净水器监测系统,是我去年为一个家用净水设备厂商开发的定制方案。整套系统通过多传感器协同工作,实现了对净水器运行状态的全面监控。相比市面上常见的单一TDS检测方案,我们这个设计在成本增加不到30元的情况下,将监测维度扩展到了4个关键指标。
系统硬件架构非常清晰:STM32F103C8T6最小系统板作为主控,搭配四个功能模块:
- 液位检测:采用电容式液位传感器,测量范围0-50cm,精度±1cm
- 流量监测:使用霍尔效应水流量传感器,型号YF-S201,每升水输出约450个脉冲
- PH值检测:工业级PH-4502C传感器模块,测量范围0-14PH,精度±0.1PH
- TDS检测:基于电导率原理的TDS传感器,量程0-1000ppm
实际开发中发现,PH传感器需要每3个月进行一次校准,否则读数会漂移0.3PH左右。我们在程序中加入了校准提醒功能,当传感器连续工作90天后,LCD会显示"CAL"提示符。
2. 硬件电路设计详解
2.1 传感器接口电路设计
所有传感器都采用5V供电,通过电平转换电路与3.3V的STM32对接。特别要注意的是PH传感器的电极阻抗很高(约100MΩ),我们在输入端增加了TL082构成的电压跟随器,避免信号衰减。
流量传感器接口电路有个细节处理:
c复制// 外部中断配置代码示例
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == FLOW_SENSOR_Pin) {
flow_pulse_count++;
}
}
每检测到1个脉冲,计数器加1,当累计到450个脉冲时,用水量增加1升。
2.2 抗干扰设计要点
在初期测试中,发现TDS读数会出现周期性波动。通过示波器抓取发现是LCD1602的背光PWM干扰导致的。解决方案有三:
- 在TDS传感器电源端增加π型滤波电路
- 将背光改为恒流驱动
- ADC采样时暂时关闭背光
最终我们采用方案1+3的组合,成本增加不到2元,但将TDS读数波动从±5ppm降低到了±1ppm。
3. 软件架构与关键算法
3.1 多任务调度设计
系统使用FreeRTOS实现多任务管理,任务优先级如下:
- 传感器数据采集(优先级3)
- 蓝牙数据传输(优先级2)
- LCD刷新显示(优先级1)
数据采集任务采用定时器触发,每200ms执行一次完整的传感器轮询。这里有个优化技巧:将四个传感器的启动时间错开,避免同时工作导致电源噪声增大。
3.2 数据滤波算法
传感器原始数据需要经过滤波处理。我们测试了三种算法:
- 滑动平均滤波 - 计算量小但响应慢
- 中值滤波 - 抗脉冲干扰好
- 卡尔曼滤波 - 效果最好但资源占用高
最终选择组合方案:流量用滑动平均(窗口大小5),PH值用中值滤波(窗口大小3),TDS用一阶滞后滤波(系数0.2)。实测显示,这种组合在STM32F103上仅占用不到5%的CPU资源。
4. 蓝牙通信协议设计
4.1 数据帧格式
使用HC-05蓝牙模块,自定义了简洁的通信协议:
code复制帧头(0xAA) | 数据长度(1字节) | 液位(2字节) | 流量(2字节) | PH值(1字节) | TDS(2字节) | 校验和(1字节)
每个字段都采用大端格式,校验和是前面所有字节的累加和取低8位。在安卓端我们测试过,这种格式在9600bps波特率下,每包数据传送时间约12ms,完全满足实时性要求。
4.2 低功耗优化
虽然系统需要持续监测,但我们通过以下措施将整机功耗控制在0.8W以内:
- 蓝牙模块在没有连接时自动进入休眠模式
- LCD背光在无操作30秒后亮度减半
- CPU主频降至36MHz运行(仍能满足需求)
5. 常见问题与解决方案
5.1 PH值读数不稳定
可能原因及对策:
- 电极老化 - 更换新电极
- 温度影响 - 增加DS18B20做温度补偿
- 接地不良 - 检查传感器接地线
我们最终在程序中加入了温度补偿算法:
c复制float get_ph_value() {
float raw_ph = read_ph_sensor();
float temp = read_temperature();
return raw_ph + (25.0 - temp) * 0.003; // 温度补偿系数
}
5.2 蓝牙连接频繁断开
这个问题困扰了我们很久,最终发现是电源问题。当水泵启动时,电源电压会有约0.3V的跌落。解决方案:
- 蓝牙模块单独供电
- 在主电源增加1000μF电容
- 软件上实现断线自动重连
6. 生产测试方案
量产时我们设计了专门的测试工装,主要测试项:
- 液位传感器线性度测试
- 流量传感器精度测试(使用标准量筒校准)
- PH传感器用标准缓冲液校准
- TDS传感器用标准溶液校准
测试过程中发现一个有趣的现象:不同品牌矿泉水显示的TDS值与官方标注差异很大。后来才明白,TDS检测的是溶解性固体总量,而矿泉水中的矿物质成分会影响读数。
这个项目从原型到量产用了4个月时间,期间最大的收获是:嵌入式系统设计必须考虑实际使用环境。比如我们最初没想到用户会安装在厨下潮湿环境,后来不得不对所有电路板做了三防漆处理。现在系统已经稳定运行超过1年,客户反馈故障率低于0.5%。