基于STM32F103C8T6与HX710的水质检测系统实战指南1. 项目背景与核心设计思路水质检测在环保监测、水产养殖、家庭用水安全等领域具有广泛需求。传统商用设备价格昂贵而采用STM32F103C8T6Blue Pill开发板核心芯片搭配国产HX710 ADC的方案成本可控制在50元以内。这个组合的优势在于STM32F103C8T672MHz主频的Cortex-M3内核具备12位ADC、多个定时器和丰富外设接口HX71024位高精度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常见问题解决方案信号干扰在HX710的VCC与GND间并联100μF电解电容0.1μF陶瓷电容导线电阻影响采用三线制接法补偿长导线电阻电源波动建议使用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 i0; i24; 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 校准算法实现采用两点校准法建立水位-电压关系空载状态水位0cm读取原始值y₁10cm水深状态读取原始值y₂计算线性方程参数float a (y2 - y1) / 10.0f; float b y1;存储参数到Flashvoid SaveParams(float a, float b) { uint8_t buf[20]; sprintf((char*)buf, %.4f,%.4f, a, b); FLASH_Unlock(); FLASH_ErasePage(0x0800F000); for(uint8_t i0; istrlen((char*)buf); i) { FLASH_ProgramHalfWord(0x0800F000i*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 i0; iFILTER_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.08145928146010.15.0162345616234720.310.024311042431089-0.215.0323980832398210.2系统表现出良好的线性特性在10cm量程内误差小于0.3mm完全满足日常检测需求。5. 常见问题排查指南问题1HX710读数不稳定检查电源质量纹波应50mV缩短传感器到ADC的导线长度在SCK和DOUT线上增加1kΩ上拉电阻问题2水位测量漂移确认压力传感器密封性重新执行两点校准检查温度补偿每10℃变化约产生0.5%误差问题3TDS值异常用标准溶液校准如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读数产生显著影响因此固定探头的机械结构设计同样重要。