1. 项目概述:STM32水质监测系统设计背景
水质监测是环境保护和饮用水安全的重要环节。传统人工采样实验室分析的方式存在时效性差、成本高等问题。我们团队基于STM32F103VET6单片机开发了一套实时水质监测系统,能够同时检测水的pH值、浑浊度和温度三个关键指标。
这个系统的核心优势在于:
- 实时性:每3分钟自动采集一次数据,比人工采样频率高数十倍
- 多参数集成:单台设备可同时监测三项关键指标
- 远程报警:通过GSM模块实现超标短信报警
- 低成本:整套硬件成本控制在200元以内,适合大面积布设
2. 硬件系统架构解析
2.1 主控芯片选型考量
选择STM32F103VET6主要基于以下考虑:
- 丰富的ADC资源:内置3个12位ADC,支持16个外部通道,满足多传感器并行采集需求
- 充足的IO接口:100引脚封装提供80个GPIO,便于连接各类外设
- 性价比优势:相比同性能ARM芯片价格低30%左右
- 成熟的生态:STM32CubeMX工具链完善,开发效率高
实际开发中发现,VET6型号的144KB Flash和20KB RAM完全满足系统需求,即使后期增加蓝牙传输功能也游刃有余。
2.2 传感器模块选型与接口设计
pH传感器模块
采用工业级pH电极+信号调理电路方案:
- 测量范围:0-14pH
- 精度:±0.1pH
- 输出信号:0-3V模拟量
- 接口:STM32的PA0(ADC1_IN0)
校准要点:
- 使用标准缓冲液(pH4.01/pH6.86/pH9.18)进行三点校准
- 每次使用前需用去离子水清洗电极
- 长期不用时应浸泡在3mol/L KCl溶液中保存
浑浊度传感器
选用TSW-30模块:
- 测量范围:0-1000NTU
- 分辨率:0.1NTU
- 工作电压:5V DC
- 接口:STM32的PA1(ADC1_IN1)
使用注意事项:
- 避免强光直射影响测量精度
- 定期用标准浊度液校准
- 测量时需保持水流稳定
DS18B20温度传感器
单总线数字传感器优势:
- 测量范围:-55℃~+125℃
- 精度:±0.5℃
- 接口:STM32的PB5
- 无需额外ADC资源
3. 软件系统实现细节
3.1 主程序流程设计
c复制int main(void)
{
Hardware_Init(); // 硬件初始化
Sensor_Calibration(); // 传感器校准
while(1)
{
if(PH_time_3min_flag) {
Read_PH_Value();
PH_time_3min_flag = 0;
}
if(hzd_time_3min_flag) {
Read_Turbidity();
hzd_time_3min_flag = 0;
}
if(temp_time_3min_flag) {
DS18B20_ReadTemp();
temp_time_3min_flag = 0;
}
Display_Update();
Alarm_Check();
}
}
3.2 定时中断服务程序优化
原始代码中三个定时标志位使用同一个定时器中断,存在以下优化空间:
- 中断服务程序执行时间优化:
c复制void TIM2_IRQHandler(void)
{
static uint16_t counter = 0;
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(++counter >= 18000) { // 3分钟到达
counter = 0;
PH_time_3min_flag = 1;
hzd_time_3min_flag = 1;
temp_time_3min_flag = 1;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
- 使用硬件定时器级联方案:
- TIM2作为主定时器(10ms)
- TIM3/TIM4作为从定时器,实现多时间基准
3.3 ADC采样算法优化
针对水质信号特点,采用复合滤波算法:
- 硬件滤波:RC低通滤波(截止频率10Hz)
- 软件滤波:
- 中值滤波:连续采样5次取中间值
- 滑动平均:窗口大小8
- 异常值剔除:±3σ原则
c复制float Get_Filtered_ADC(uint8_t channel)
{
uint16_t raw[8];
float sum = 0, avg, std_dev = 0;
// 采样8次
for(int i=0; i<8; i++){
raw[i] = ADC_Read(channel);
Delay_ms(10);
}
// 计算平均值和标准差
for(int i=0; i<8; i++) sum += raw[i];
avg = sum/8;
for(int i=0; i<8; i++)
std_dev += pow(raw[i]-avg, 2);
std_dev = sqrt(std_dev/8);
// 剔除异常值后重新计算
sum = 0;
uint8_t valid_cnt = 0;
for(int i=0; i<8; i++){
if(fabs(raw[i]-avg) < 3*std_dev){
sum += raw[i];
valid_cnt++;
}
}
return sum/valid_cnt;
}
4. 系统调试与优化经验
4.1 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| pH值读数漂移 | 电极老化/污染 | 更换电极或进行专业清洗 |
| 浊度值异常 | 气泡干扰 | 增加消泡装置或静置测量 |
| GSM模块不工作 | SIM卡接触不良 | 重新插拔SIM卡 |
| LCD显示乱码 | 排线接触不良 | 检查连接或更换排线 |
4.2 功耗优化技巧
- 外设分时供电控制:
c复制void Sensor_PowerCtrl(uint8_t state)
{
if(state) {
GPIO_SetBits(GPIOC, GPIO_Pin_12); // 开启传感器电源
Delay_ms(100); // 等待稳定
} else {
GPIO_ResetBits(GPIOC, GPIO_Pin_12);
}
}
- 低功耗模式配置:
- 采样间隔进入Stop模式
- RTC唤醒定时器控制采样周期
- 外设时钟动态开关
4.3 抗干扰设计要点
- PCB布局原则:
- 模拟与数字地分割
- 传感器信号走线避开高频区域
- 电源增加π型滤波
- 软件容错机制:
- 数据校验(CRC16)
- 看门狗定时器
- 异常状态自动恢复
5. 系统扩展与改进方向
- 物联网升级方案:
- 增加NB-IoT模块替代GSM
- 对接云平台实现数据可视化
- 支持远程参数配置
- 功能扩展建议:
- 增加TDS(总溶解固体)检测
- 集成GPS定位功能
- 添加SD卡本地存储
- 算法优化空间:
- 引入机器学习算法识别水质异常
- 实现传感器故障自诊断
- 动态调整采样频率
在实际部署中,我们发现系统的稳定性与传感器维护周期密切相关。建议每三个月进行一次现场校准,每半年更换pH电极的电解液。通过持续优化,该系统已在水产养殖、污水处理等多个场景得到成功应用。