水质监测一直是环境工程和物联网应用中的重要课题。传统人工采样检测方式效率低下且无法实现实时监控,而市面上的专业水质监测设备往往价格昂贵。这个基于STM32F103VET6单片机的水质监测系统,正是为解决这一痛点而设计的低成本、高可靠性解决方案。
我在环保设备研发领域工作多年,参与过多个水质监测项目。从实际经验来看,一套完整的监测系统需要兼顾硬件稳定性、传感器精度和软件算法的可靠性。这个开源项目提供了从原理图到源码的全套资料,特别适合电子爱好者、物联网开发者以及相关专业学生进行二次开发或直接应用。
STM32F103VET6作为主控芯片有几个明显优势:
提示:在PCB布局时,注意将模拟和数字电源分开布线,ADC参考电压引脚建议添加LC滤波电路,这是保证测量精度的关键。
典型的水质监测系统需要测量以下参数:
每路传感器信号都需要经过专门的处理电路:
野外监测设备对电源系统有特殊要求:
经过多个版本迭代,总结出以下PCB设计经验:
常见问题:
水质监测设备常面临以下干扰:
应对措施:
基于FreeRTOS实时操作系统,将功能划分为多个任务:
任务间通过消息队列交换数据,避免共享资源冲突。
水质传感器数据具有以下特点:
采用的复合滤波算法:
c复制// 递推中值滤波+一阶滞后滤波
float sensor_filter(float raw_value) {
static float buffer[5] = {0};
static int index = 0;
static float last_value = 0;
// 更新滑动窗口
buffer[index++] = raw_value;
if(index >= 5) index = 0;
// 中值滤波
float temp[5];
memcpy(temp, buffer, sizeof(temp));
bubble_sort(temp); // 简单的冒泡排序
float median = temp[2];
// 一阶滞后滤波
float alpha = 0.3; // 滤波系数
float result = alpha*median + (1-alpha)*last_value;
last_value = result;
return result;
}
水质传感器需要定期校准,系统支持三种校准模式:
校准数据保存在STM32的Flash最后一页(防止被程序擦除),结构体定义如下:
c复制typedef struct {
uint32_t magic; // 校验标志0xAA55A55A
float ph_offset;
float ph_slope;
float do_zero;
float do_sensitivity;
float ec_cell_constant;
uint32_t crc32; // 校验和
} SensorCalibData;
设备提供多种通信方式:
Modbus寄存器映射示例:
| 寄存器地址 | 参数 | 数据类型 | 单位 |
|---|---|---|---|
| 0x0000 | 温度 | float32 | °C |
| 0x0002 | pH值 | float32 | - |
| 0x0004 | 溶解氧 | float32 | mg/L |
| 0x0006 | 浊度 | float32 | NTU |
| 0x0008 | 电导率 | float32 | μS/cm |
根据应用场景不同,可采用以下模式:
为提高通信可靠性,实现了一套简单的重传机制:
pH传感器标定注意事项:
溶解氧传感器维护要点:
通过以下措施将待机功耗降至1.2mA:
关键代码实现:
c复制void enter_low_power_mode(void) {
// 关闭传感器电源
HAL_GPIO_WritePin(SENSOR_PWR_GPIO, SENSOR_PWR_PIN, GPIO_PIN_RESET);
// 配置唤醒源
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 300, RTC_WAKEUPCLOCK_RTCCLK_DIV16);
// 进入STOP模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后重新初始化
SystemClock_Config();
MX_GPIO_Init();
}
基于现有系统,可以进一步开发:
一个典型的LoRa组网方案:
在开发这类系统时,最深的体会是硬件可靠性和软件鲁棒性必须同步考虑。比如我们发现pH电极的输入阻抗高达10^12Ω,任何微小的漏电流都会导致测量漂移。这要求我们在PCB设计时就要特别注意绝缘处理和防护设计。