1. 系统设计思路与硬件选型

做水质监测系统最头疼的就是数据不准,我之前用Arduino做过一版,传感器读数跳得跟心跳似的,根本没法用。后来换了STM32F103C8T6,这芯片的12位ADC和硬件滤波功能真是救星,实测数据稳定性提升了不止一个档次。

核心控制器我选的是STM32F103,主要看中三点:首先是性价比,一片才十来块钱;其次是ADC精度够用,12位分辨率对付水质传感器绰绰有余;最后是外设丰富,自带多个定时器和串口,扩展传感器毫无压力。

传感器选型这块我踩过不少坑。PH传感器建议用工业级的SEN0161,虽然比廉价的模拟传感器贵一点,但自带温度补偿和数字输出,稳定性好太多。TDS传感器选TDS-3就行,注意要买带防水探头版本的,不然长期浸泡容易损坏。温度传感器用DS18B20,一线总线架构节省IO口,精度也能达到±0.5℃。

电源设计特别重要,很多人在这一步翻车。我用的是AMS1117-3.3V稳压芯片,前后都加了滤波电容,实测纹波控制在10mV以内。模拟部分和数字部分用磁珠隔离,避免数字噪声影响传感器读数。

显示模块选了0.96寸OLED,I2C接口只用两根线,比并口LCD省事多了。显示内容包含PH值、TDS值、温度和状态提示,字体大小都调试过,在强光下也能看清。

2. 硬件电路设计详解

画电路板时最容易忽略的就是信号完整性。PH传感器的输出信号很微弱,只有毫伏级别,必须用运放做放大和调理。我用的LM358双运放,第一级放大100倍,第二级做电压偏移,把负电压转换到0-3.3V范围适合ADC采集。

ADC采样电路要加RC滤波,我在每个传感器接口都放了10k电阻和100nF电容组成低通滤波器,截止频率设定在160Hz,能有效抑制高频干扰。STM32的ADC采样率设置为1MHz,用定时器触发采样,避免软件触发的时间抖动。

PCB布局讲究很大。模拟部分和数字部分严格分开,中间用开槽隔离。晶振远离模拟信号线,时钟信号用包地处理。所有传感器接口都加了TVS二极管,防止插拔时的静电损坏。

供电设计我用了两路LDO,一路给数字部分,一路给模拟部分。模拟部分的LDO输出还加了π型滤波,进一步降低电源噪声。实测下来,模拟电源的噪声控制在20μV以内,完全满足高精度采集要求。

接口设计预留了足够余量。除了必备的传感器接口,还留了3个按键和蜂鸣器接口,方便后期扩展功能。所有IO口都加了220欧姆限流电阻,防止误操作烧芯片。

3. 传感器数据采集与处理

传感器读数不稳定是最大难题,我试过三种滤波算法,最后发现移动平均+卡尔曼滤波组合效果最好。移动平均窗口设为10个点,能快速消除毛刺;卡尔曼滤波则处理慢变信号,让读数平滑又灵敏。

PH值测量要注意温度补偿。纯水的PH值会随温度变化,我做了个温度补偿表,在不同温度下自动校正PH值。校准方法也简单,先用标准缓冲液校准两点,程序会自动生成校准曲线。

TDS测量原理是电导率换算,但温度影响很大。我实测发现水温每变化1℃,TDS值会漂移2%左右。所以在程序里做了温度补偿算法,先用DS18B20测水温,再根据温度系数修正TDS读数。

ADC采样的精度提升有技巧。我开启了STM32的ADC过采样功能,用16倍过采样把有效分辨率提升到14位。采样时机也很讲究,要避开数字电路开关噪声,我在定时器中断里采样,确保采样时刻的一致性。

数据校验机制必不可少。我给每个传感器读数都加了CRC校验,发现数据异常会自动重采。连续多次异常会触发报警,在OLED上显示传感器故障提示。

4. 软件架构与程序实现

程序用Keil5开发,基于HAL库编写,比标准库更易用。主循环采用事件驱动架构,低功耗模式下电流只有3mA,用500mAh的锂电池能撑一周。

任务调度用时间片轮询实现,每个任务都有独立的执行周期。数据采集任务100ms一次,显示更新任务500ms一次,数据上传任务1秒一次。关键任务用中断触发,确保实时性。

传感器驱动封装成独立模块。PH传感器驱动包含温度补偿和自动校准功能,TDS驱动包含温度补偿和单位换算,OLED驱动支持中文显示和自定义图形。这样写的好处是移植方便,换个主板改改硬件抽象层就行。

数据处理算法我优化了很久。最终版的卡尔曼滤波参数Q=0.01、R=0.1,这个参数对慢变信号效果很好。移动平均窗口大小根据传感器类型调整,PH传感器用10点窗口,TDS用5点窗口,响应速度更快。

异常处理机制很完善。传感器断开会在OLED显示图标提醒,数据超限会触发蜂鸣器报警。所有异常事件都记录在日志区,通过串口可以查看历史错误信息。

5. 系统校准与调试方法

校准PH传感器需要准备两种标准缓冲液,PH6.86和PH9.18的。先把探头放进PH6.86溶液,等待读数稳定后按设置键确认;再清洗探头放入PH9.18溶液,同样操作后程序会自动计算斜率参数。

TDS校准更简单,用1413μS/cm的标准液校准就行。注意校准时要记录水温,程序会根据温度自动换算到25℃的标准值。校准后误差能控制在±3%以内,够用了。

温度传感器DS18B18需要单独校准,我用高精度温度计做参考,在0℃和100℃两点校准。其实出厂精度已经不错,校准后也就提升0.1℃的精度。

整体调试建议分步进行。先调通OLED显示,确保硬件没问题;再逐个测试传感器,用串口打印原始数据;最后调试滤波算法,观察处理后的数据曲线。

串口调试工具我用的SecureCRT,能实时显示数据和波形。发现数据跳动大时,可以用示波器查电源纹波和信号噪声。我遇到过电源纹波大的问题,后来在LDO输出端加了个100μF钽电容就解决了。

6. 实际应用与效果验证

我在自家净水器上装了这套系统,持续监测了三个月。PH值读数稳定在7.2±0.1,TDS值在15-20之间波动,比净水器自带的指示灯准确多了。OLED屏幕实时显示数据,水质好坏一目了然。

工业场景测试是在朋友的小型锅炉房做的。监测冷却水的PH值和电导率,及时发现了一次水质恶化,避免了结垢问题。STM32在高温环境下工作稳定,加了散热片后连续运行一个月没重启。

功耗测试结果很惊喜。正常模式下电流8mA,睡眠模式下只有0.5mA。用2000mAh的锂电池供电,每小时采集一次数据的话,能坚持两个月不用充电。

数据准确性对比过专业仪器。PH值误差在0.1以内,TDS误差在±5%以内,温度误差±0.3℃,完全满足日常监测需求。成本算下来才70多块钱,只有商业设备的十分之一。

扩展功能也很实用。我加了蓝牙模块,可以用手机查看历史数据;又添了SD卡插座,能存储30天的监测数据。这些扩展都没改主板设计,直接用预留的IO口实现。

7. 源码解析与二次开发

工程源码用C++面向对象思想编写,每个传感器都是一个类。PHClass包含校准和补偿方法,TDSClass包含温度换算方法,显示类封装了图形绘制函数。代码风格清晰,注释详细,容易理解。

主程序逻辑简单明了。初始化硬件后进入主循环,检测按键事件,更新显示内容,处理传感器数据。中断服务程序处理定时采样和串口通信,不影响主循环运行。

二次开发建议从修改显示内容开始。比如添加水质评级功能,根据TDS值显示"优良中差";或者增加报警阈值设置,超过限值自动蜂鸣器提醒。所有参数都保存在Flash里,断电不丢失。

通信协议可以自己扩展。我预留了Modbus RTU协议接口,方便接入工业PLC系统。也写了简单的ASCII协议,用串口助手就能配置参数。

源码包里包含完整的设计资料:原理图、PCB文件、BOM清单、固件源码、使用说明。打样文件直接发嘉立创就能做板,元器件大部分都能在立创商城买到。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐