1. 项目概述与核心功能
这个基于STM32单片机的水质检测系统是我去年带队完成的一个实际工程项目,最初是为某水产养殖基地设计的,后来发现这套方案在家庭鱼缸、实验室水质监测等场景中同样适用。系统最核心的价值在于用低成本方案实现了传统水质监测设备80%的功能,整套硬件成本可以控制在300元以内。
系统架构上采用了经典的"传感器+主控+云平台"三层设计:
- 传感层:PH计、TDS电导率传感器、浊度传感器构成数据采集前端
- 控制层:STM32F103C8T6作为主控,负责数据处理和逻辑控制
- 云服务层:通过Air724UG 4G模块对接阿里云IoT平台
实测数据显示,系统在以下关键指标表现优异:
- PH值测量精度:±0.2(对比专业PH测试仪)
- TDS测量误差:<5%(在0-1000ppm范围内)
- 浊度检测响应时间:<3秒
- 数据上传间隔:可配置(默认30秒)
实际部署中发现,传感器的校准环节对测量精度影响最大。建议使用标准液进行三点校准(PH4.01/7.01/9.18),特别是PH计需要每月重新校准一次。
2. 硬件设计与选型解析
2.1 主控芯片选型对比
当时在选型时主要对比了三种方案:
-
STM32F103C8T6(最终选择)
- 优点:72MHz主频够用,内置12位ADC,价格<15元
- 缺点:RAM仅20KB,在同时处理多个传感器数据时略显紧张
-
GD32F303CCT6(国产替代)
- 优势:价格低10%,性能相当
- 痛点:开发环境兼容性问题较多
-
ESP32-WROOM(物联网方案)
- 亮点:自带WiFi/BLE
- 局限:ADC精度仅9-10位,不适合高精度测量
最终选择STM32主要考虑:
- 成熟的生态和资料
- 充足的GPIO资源(需要驱动多个外设)
- 硬件I2C接口(用于OLED驱动)
2.2 传感器模块详解
2.2.1 PH检测模块
采用工业级PH-4502C传感器,关键参数:
- 测量范围:0-14PH
- 响应时间:<1分钟
- 输出信号:0-3.3V模拟量
- 温度补偿:内置NTC热敏电阻
电路设计要点:
c复制// PH值计算公式(需校准)
float PH_value = 7.0 + (2.5 - adc_value) / 0.18;
2.2.2 TDS电导率模块
选用KM-TDS-01传感器:
- 量程:0-1000ppm
- 精度:±5%FS
- 工作电压:3.3-5V
特别注意:
- 测量时需要排除水温影响(建议增加DS18B20温度传感器)
- 探头不能长时间浸泡,每次使用后需清水冲洗
2.2.3 浊度传感器
使用TS-300B模块:
- 检测原理:90°散射光测量
- 量程:0-1000NTU
- 输出:0-4.5V模拟信号
使用技巧:
- 定期清洁光学窗口(每周至少一次)
- 避免强光直射影响测量
2.3 通信模块设计
采用Air724UG 4G模块的主要考虑:
- 支持TCP/IP协议栈
- 内置阿里云IoT SDK
- 低功耗设计(待机电流<2mA)
硬件连接示意图:
code复制 +---------------+
| STM32 |
| UART3 |
+-------+-------+
|
+-------+-------+
| Air724UG |
| (AT指令) |
+---------------+
3. 软件架构与关键代码
3.1 主程序流程图
mermaid复制graph TD
A[系统初始化] --> B[传感器校准]
B --> C[建立4G连接]
C --> D[主循环]
D --> E[读取传感器数据]
E --> F[阈值判断]
F -->|超限| G[触发报警]
F -->|正常| H[数据显示]
E --> I[数据上传云端]
D --> J[按键扫描]
3.2 多任务调度实现
由于需要同时处理传感器采集、数据显示、云端通信等任务,采用了时间片轮询方式:
c复制void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if(htim == &htim3) { // 10ms定时器中断
static uint8_t cnt = 0;
// 任务调度
if(cnt % 2 == 0) Key_Scan(); // 20ms执行一次
if(cnt % 5 == 0) Sensor_Read(); // 50ms执行一次
if(cnt == 100) {
Cloud_Update(); // 1s执行一次
cnt = 0;
}
cnt++;
}
}
3.3 阿里云IoT对接
核心通信协议采用MQTT,关键实现步骤:
- 设备三元组配置:
c复制#define PRODUCT_KEY "a1w***"
#define DEVICE_NAME "STM32_001"
#define DEVICE_SECRET "d8f7e***"
- Topic定义:
c复制// 属性上报
#define TOPIC_PROP_POST "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/event/property/post"
// 属性设置
#define TOPIC_PROP_SET "/sys/"PRODUCT_KEY"/"DEVICE_NAME"/thing/service/property/set"
- 数据格式示例:
json复制{
"id": "123",
"version": "1.0",
"params": {
"PH_value": 7.2,
"TDS_value": 150,
"Turbidity": 12,
"Alarm_status": 0
}
}
4. 制作与调试经验
4.1 PCB设计避坑指南
-
电源布局:
- 数字电路与模拟电路分区供电
- 每个传感器电源脚添加0.1μF去耦电容
- 关键位置预留测试点(如3.3V、GND)
-
信号走线:
- 模拟信号线尽量短
- 避免平行走线(特别是时钟线与传感器信号线)
- 浊度传感器信号线需包地处理
-
焊接顺序:
- 电源电路(先验证电压正常)
- 最小系统(烧录测试程序)
- 显示模块(确认显示正常)
- 传感器(逐个焊接测试)
4.2 常见问题排查
问题1:PH值读数漂移
- 可能原因:
- 参比电极失效
- 温度补偿未启用
- 电源噪声干扰
- 解决方案:
- 更换PH电极
- 启用温度补偿算法
- 检查电源滤波电容
问题2:4G模块频繁掉线
- 排查步骤:
- 检查SIM卡接触
- 测量模块供电电压(要求>3.6V)
- 测试天线信号强度(AT+CSQ)
- 检查APN设置
问题3:OLED显示花屏
- 典型原因:
- I2C上拉电阻未接(需4.7K)
- 电源电压不稳
- 初始化时序错误
- 快速验证:
c复制// 简单测试代码
HAL_I2C_IsDeviceReady(&hi2c1, 0x3C<<1, 3, 100);
5. 项目优化方向
在实际运行半年后,总结出以下改进点:
-
低功耗优化:
- 采用间歇工作模式(每小时唤醒检测5分钟)
- 选用低功耗传感器(如数字式PH计)
- 硬件上增加电源管理IC(如TPS63020)
-
数据可靠性提升:
- 增加SD卡本地存储
- 实现断网续传功能
- 采用卡尔曼滤波算法处理传感器数据
-
扩展功能:
- 增加ORP(氧化还原电位)检测
- 支持蓝牙近距离配置
- 开发微信小程序监控界面
这个项目最让我意外的是TDS传感器的稳定性表现,在持续监测鱼缸水质三个月后,与专业设备对比误差仍保持在3%以内。不过PH电极的维护确实比预期麻烦,后来我们改用了可更换电极头的工业级传感器,使用寿命延长到了6个月以上。