当前位置: 首页 > news >正文

用STM32F103C8T6和HX710做个低成本水质检测仪,附完整代码和校准心得

基于STM32F103C8T6与HX710的水质检测系统实战指南

1. 项目背景与核心设计思路

水质检测在环保监测、水产养殖、家庭用水安全等领域具有广泛需求。传统商用设备价格昂贵,而采用STM32F103C8T6(Blue Pill开发板核心芯片)搭配国产HX710 ADC的方案,成本可控制在50元以内。这个组合的优势在于:

  • STM32F103C8T6:72MHz主频的Cortex-M3内核,具备12位ADC、多个定时器和丰富外设接口
  • HX710:24位高精度ADC,专称重传感器设计,支持差分输入,成本仅为进口芯片的1/3
  • 系统架构:通过压力传感器测量水位,导电率探头检测TDS值,所有信号经HX710转换后由STM32处理

提示:实际测试表明,HX710在5V供电时信噪比优于STM32内置ADC,特别适合微小电压信号的采集。

2. 硬件搭建关键细节

2.1 元器件选型与成本控制

部件型号单价(元)采购渠道
主控板STM32F103C8T6最小系统12.8主流电商平台
ADC芯片HX710B3.5电子元器件商城
压力传感器MPX5010DP18.0工业传感器供应商
TDS探头石墨电极自制2.0实验室耗材
显示屏1.44寸TFT9.9模块经销商

特别说明:压力传感器需选择防水型,测量范围0-10kPa即可满足常规需求。TDS探头可用两个不锈钢螺丝替代,间距保持1cm效果最佳。

2.2 电路连接要点

核心电路连接示意图:

VCC 5V ────┬───────┬───────┬─────── │ │ │ [10kΩ] [HX710] [MPX5010] │ │ │ STM32 PB12 ─┘ PB13 ──────┘ GND

常见问题解决方案:

  1. 信号干扰:在HX710的VCC与GND间并联100μF电解电容+0.1μF陶瓷电容
  2. 导线电阻影响:采用三线制接法补偿长导线电阻
  3. 电源波动:建议使用LDO稳压而非开关电源

3. 软件实现深度解析

3.1 HX710驱动开发

HX710的通信时序需要精确控制,以下是经过优化的读取函数:

uint32_t HX710_Read(void) { uint32_t data = 0; GPIO_ResetBits(GPIOB, GPIO_Pin_12); // SCK低电平 while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)); // 等待DOUT变低 for(uint8_t i=0; i<24; i++) { GPIO_SetBits(GPIOB, GPIO_Pin_12); // SCK上升沿 delay_us(1); data <<= 1; if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13)) data |= 1; GPIO_ResetBits(GPIOB, GPIO_Pin_12); // SCK下降沿 delay_us(1); } // 第25个脉冲选择下次转换模式 GPIO_SetBits(GPIOB, GPIO_Pin_12); delay_us(1); GPIO_ResetBits(GPIOB, GPIO_Pin_12); return data ^ 0x800000; // 补码转原码 }

关键点说明

  • 时钟周期控制在2μs(实测稳定工作下限)
  • 必须执行完整的25个时钟周期
  • 返回值处理考虑了芯片输出的补码格式

3.2 校准算法实现

采用两点校准法建立水位-电压关系:

  1. 空载状态(水位0cm)读取原始值y₁
  2. 10cm水深状态读取原始值y₂
  3. 计算线性方程参数:
    float a = (y2 - y1) / 10.0f; float b = y1;
  4. 存储参数到Flash:
    void SaveParams(float a, float b) { uint8_t buf[20]; sprintf((char*)buf, "%.4f,%.4f", a, b); FLASH_Unlock(); FLASH_ErasePage(0x0800F000); for(uint8_t i=0; i<strlen((char*)buf); i++) { FLASH_ProgramHalfWord(0x0800F000+i*2, buf[i]); } FLASH_Lock(); }

注意:Flash写入前必须擦除整个页,建议保留至少10%的冗余空间防止写入失败。

4. 系统优化与实测数据

4.1 软件滤波方案对比

滤波方法实现复杂度实时性效果评分
滑动平均★★☆★★★★★☆
中值滤波★★★★★☆★★★
卡尔曼★★★★★★☆★★★★
复合滤波★★★★★☆★★★★

推荐采用改进型滑动平均:

#define FILTER_LEN 8 uint32_t filter_buf[FILTER_LEN]; uint32_t SmartFilter(uint32_t new_val) { static uint8_t index = 0; filter_buf[index++] = new_val; if(index >= FILTER_LEN) index = 0; uint32_t sum = 0, min = 0xFFFFFFFF, max = 0; for(uint8_t i=0; i<FILTER_LEN; i++) { sum += filter_buf[i]; if(filter_buf[i] < min) min = filter_buf[i]; if(filter_buf[i] > max) max = filter_buf[i]; } return (sum - min - max) / (FILTER_LEN - 2); }

4.2 实测性能数据

在25℃恒温环境下测试:

水深(cm)原始读数滤波后误差(mm)
0.0814592814601+0.1
5.016234561623472+0.3
10.024311042431089-0.2
15.032398083239821+0.2

系统表现出良好的线性特性,在10cm量程内误差小于0.3mm,完全满足日常检测需求。

5. 常见问题排查指南

问题1:HX710读数不稳定

  • 检查电源质量(纹波应<50mV)
  • 缩短传感器到ADC的导线长度
  • 在SCK和DOUT线上增加1kΩ上拉电阻

问题2:水位测量漂移

  • 确认压力传感器密封性
  • 重新执行两点校准
  • 检查温度补偿(每10℃变化约产生0.5%误差)

问题3:TDS值异常

  • 用标准溶液校准(如1413μS/cm的KCl溶液)
  • 清洁电极表面氧化物
  • 确保测量频率在1kHz左右

6. 扩展功能实现

通过添加蓝牙模块(如HC-05)可实现手机监控:

void BT_SendData(float level, float tds) { char msg[32]; sprintf(msg, "LV:%.1fcm,TDS:%.0fppm\r\n", level, tds); USART_SendString(USART1, msg); }

配套手机APP可采用MIT App Inventor快速开发,主要功能包括:

  • 实时数据曲线显示
  • 超标报警阈值设置
  • 历史数据记录

在完成基础功能后,尝试用不同水体样本测试系统响应,记录下各种水质对应的典型参数范围。这个过程中发现,电极间距的微小变化会对TDS读数产生显著影响,因此固定探头的机械结构设计同样重要。

http://www.jsqmd.com/news/587467/

相关文章:

  • 提升开发效率的超能力:Superpowers 开源项目介绍
  • ICCV2025 | 我在哪里?基于自然语言描述与卫星影像/OSM数据的跨视角地理定位 - MKT
  • 从调包到魔改:深入pytorch-grad-cam源码,定制你自己的CAM可视化方案(以EigenCAM和ScoreCAM为例)
  • 微信小程序用户信息获取新姿势:利用最新API实现一键获取昵称和头像
  • 5分钟掌握waifu2x-caffe:轻松实现动漫图像无损放大
  • ISPRS | ULSR-GS: 港科广等提出基于航空倾斜影像的多视角几何一致性高斯溅射城市重建方法 - MKT
  • 使用快马AI快速构建腾讯qclaw官网交互原型,验证产品设计
  • 效率倍增,使用快马生成ansible playbook自动化部署ubuntu生产服务器
  • 麦橘超然Flux图像生成控制台快速部署:一键启动你的AI绘画服务
  • 保姆级教程:MathWorks Matlab R2020a安装与破解全流程(附常见错误解决)
  • Ostrakon-VL-8B赋能微信小程序:开发餐饮AI点餐助手
  • VTJ.PRO 在线应用开发平台的核心模块(用户、认证、RBAC、缓存、设置)
  • 3步解决学术文档符号显示难题:STIX Two字体全场景应用指南
  • 大数据存储格式深度解析:Parquet、Avro与ORC的性能调优与选型指南
  • AI辅助开发:让快马智能生成最优openclaw工作流命令方案
  • ComfyUI-VideoHelperSuite视频处理全攻略:从基础操作到高级应用
  • 新手避坑指南:用C语言处理时间差,PTA‘计算火车运行时间’常见错误盘点
  • B站直播推流码获取技术解密:从认证到推流的全链路实现
  • Edge/Chrome登录谷歌账号报错?3种实测有效的解决方法(含插件冲突排查)
  • WarcraftHelper:让经典魔兽争霸3重获现代游戏体验的兼容性增强工具
  • 5个强力步骤掌握BilibiliDown:B站视频下载效率倍增指南
  • 成都别墅装修,如何挑选一家预算透明、施工靠谱的装修公司? - 成都人评鉴
  • 给MTK手机加个新传感器?手把手教你修改Sensor驱动与Overlay配置(以加速度计为例)
  • 保姆级教程:手把手教你用百度网盘下载并安装MATLAB R2024a(附详细步骤与激活文件替换指南)
  • 拆解分布式系统中常见问题及解决方案
  • Qwen3.5-9B Visio图表描述生成:从文本到系统架构图的自动构思
  • CVPR-2026 | 无 GNSS 也能飞!Bearing-UAV:实现非对齐空天视角的纯视觉无人机导航 - MKT
  • OpCore-Simplify:重构黑苹果配置的智能引擎与实践指南
  • 告别重复编码:用快马AI自动生成数据库增删改查代码,效率提升300%
  • 从IOU到mAP:解码YOLO模型评估指标背后的实战逻辑