1. 项目概述
这个基于STM32的水资源监测系统是一个集成了多种水质参数检测功能的物联网解决方案。系统以STM32F103C8T6作为主控核心,通过各类传感器实时采集水温、pH值、溶解氧、水位和TDS电导率等关键水质指标,并通过4G模块将数据上传至华为云物联网平台,实现远程监控和数据可视化。
1.1 系统架构设计
整个系统采用模块化设计,主要分为以下几个部分:
- 传感器采集层:包括DS18B20温度传感器、pH传感器、溶解氧传感器、水位传感器和TDS传感器
- 主控处理层:STM32F103C8T6负责数据采集、处理和本地显示
- 通信传输层:Air780E 4G模块实现数据上传
- 云端平台层:华为云物联网平台进行数据存储和分析
- 应用展示层:Android APP和Windows上位机提供可视化界面
这种分层架构设计使得系统具有很好的扩展性和维护性,可以根据实际需求灵活增减传感器或调整功能。
2. 硬件设计与选型
2.1 主控芯片选择
STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,具有以下特点:
- 72MHz主频,64KB Flash,20KB SRAM
- 丰富的外设接口:ADC、USART、SPI、I2C等
- 低功耗设计,工作电压2.0-3.6V
- LQFP48封装,便于PCB设计和焊接
选择这款芯片主要基于以下考虑:
- 性能足够处理多传感器数据
- 外设资源丰富,可直接连接各类传感器
- 开发工具链成熟,资料丰富
- 性价比高,适合批量应用
2.2 传感器选型与接口设计
2.2.1 温度传感器 - DS18B20
选用DS18B20数字温度传感器,具有以下特点:
- 测量范围:-55°C至+125°C
- ±0.5°C精度
- 单总线接口,节省IO资源
- 防水封装,适合水下测量
硬件连接:
DS18B20 <---单总线---> STM32 GPIO2.2.2 pH传感器
选用模拟输出的pH传感器:
- 测量范围:0-14pH
- 输出信号:0-3V模拟电压
- 响应时间:<1分钟
硬件连接:
pH传感器 <---模拟信号---> STM32 ADC通道2.2.3 溶解氧传感器
选用RS485接口的溶解氧传感器:
- 测量范围:0-20mg/L
- 精度:±0.3mg/L
- 通信协议:Modbus-RTU
硬件连接:
溶解氧传感器 <---RS485---> 485转TTL模块 <---UART---> STM32 USART2.2.4 水位传感器
选用电阻式模拟水位传感器:
- 测量范围:0-1m
- 输出信号:0-3.3V模拟电压
- 防水等级:IP68
硬件连接:
水位传感器 <---模拟信号---> STM32 ADC通道2.2.5 TDS传感器
选用模拟输出的TDS传感器:
- 测量范围:0-1000ppm
- 输出信号:0-3.3V模拟电压
- 温度补偿:内置
硬件连接:
TDS传感器 <---模拟信号---> STM32 ADC通道2.3 通信模块选型
选用Air780E 4G通信模块,主要考虑:
- 支持中国三大运营商4G网络
- 内置TCP/IP协议栈
- 支持MQTT、HTTP等协议
- 低功耗设计
硬件连接:
Air780E <---UART---> STM32 USART3. 软件设计与实现
3.1 主程序设计
主程序采用轮询方式采集各传感器数据,主要流程如下:
- 初始化所有硬件外设
- 进入主循环:
- 读取各传感器数据
- 数据处理和校准
- OLED显示更新
- 检查报警条件
- 定时上传数据到云端
while(1) { // 读取各传感器数据 waterTemp = DS18B20_Read(); phValue = PH_Read(); dissolvedOxygen = DO_Read(); waterLevel = WaterLevel_Read(); tdsValue = TDS_Read(); // 数据处理 processData(); // 显示更新 OLED_Update(); // 报警检查 checkAlarm(); // 定时上传 if(needUpload()) { uploadToCloud(); } // 延时 HAL_Delay(100); }3.2 传感器驱动开发
3.2.1 DS18B20驱动
DS18B20采用单总线协议,关键操作包括:
- 初始化序列
- ROM命令(跳过ROM)
- 功能命令(启动转换、读取暂存器)
float DS18B20_ReadTemp(void) { uint8_t tempL, tempH; uint16_t temp; DS18B20_Reset(); DS18B20_WriteByte(0xCC); // Skip ROM DS18B20_WriteByte(0x44); // Convert T HAL_Delay(750); // 等待转换完成 DS18B20_Reset(); DS18B20_WriteByte(0xCC); // Skip ROM DS18B20_WriteByte(0xBE); // Read Scratchpad tempL = DS18B20_ReadByte(); tempH = DS18B20_ReadByte(); temp = (tempH << 8) | tempL; return temp * 0.0625; // 转换为实际温度 }3.2.2 pH传感器数据处理
pH传感器输出模拟电压,需要通过ADC采集并转换为pH值:
float PH_Read(void) { uint32_t adcValue = ADC_Read(PH_CHANNEL); float voltage = adcValue * 3.3 / 4095.0; // 12位ADC float phValue = 7.0 + (voltage - 1.5) / 0.18; // 根据传感器特性调整 // 温度补偿(可选) phValue += (25.0 - currentTemp) * 0.003; return phValue; }3.2.3 溶解氧传感器通信
溶解氧传感器采用Modbus-RTU协议,关键操作:
float DO_Read(void) { uint8_t cmd[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A}; uint8_t response[7]; float doValue; UART_Send(DO_UART, cmd, sizeof(cmd)); HAL_Delay(100); UART_Receive(DO_UART, response, sizeof(response)); // 解析响应 if(response[0] == 0x01 && response[1] == 0x03) { uint16_t raw = (response[3] << 8) | response[4]; doValue = raw / 10.0; // 根据传感器规格转换 } return doValue; }3.3 数据上传实现
3.3.1 MQTT协议接入
使用Air780E模块通过MQTT协议连接华为云:
void MQTT_Connect(void) { char cmd[256]; // 设置MQTT服务器 sprintf(cmd, "AT+MQTTSET=\"%s\",%d\r\n", MQTT_SERVER, MQTT_PORT); UART_Send(AT_UART, cmd, strlen(cmd)); // 设置客户端ID sprintf(cmd, "AT+MQTTCID=\"%s\"\r\n", MQTT_CLIENT_ID); UART_Send(AT_UART, cmd, strlen(cmd)); // 设置用户名密码 sprintf(cmd, "AT+MQTTUSER=\"%s\",\"%s\"\r\n", MQTT_USERNAME, MQTT_PASSWORD); UART_Send(AT_UART, cmd, strlen(cmd)); // 连接 UART_Send(AT_UART, "AT+MQTTCONN=1,60\r\n", strlen("AT+MQTTCONN=1,60\r\n")); }3.3.2 数据上传格式
数据采用JSON格式上传:
void uploadData(WaterData_t *data) { char json[256]; char cmd[300]; // 构造JSON数据 sprintf(json, "{\"services\":[{\"service_id\":\"stm32\",\"properties\":{" "\"waterTemp\":%.1f,\"phValue\":%.2f,\"dissolvedOxygen\":%.2f," "\"waterLevel\":%.1f,\"tdsValue\":%.0f,\"alarmStatus\":%d}}]}", >void MainWindow::getDeviceShadow() { QNetworkRequest request; request.setUrl(QUrl("https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/{project_id}/devices/{device_id}/shadow")); request.setRawHeader("Authorization", "Bearer {access_token}"); QNetworkAccessManager *manager = new QNetworkAccessManager(this); connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::handleShadowResponse); manager->get(request); } void MainWindow::handleShadowResponse(QNetworkReply *reply) { if(reply->error() == QNetworkReply::NoError) { QByteArray response = reply->readAll(); QJsonDocument jsonDoc = QJsonDocument::fromJson(response); QJsonObject jsonObj = jsonDoc.object(); // 解析数据并更新界面 updateUI(jsonObj); } reply->deleteLater(); }6. 系统调试与优化
6.1 传感器校准
pH传感器校准:
- 使用标准缓冲液(pH4.0、7.0、9.2)
- 两点或三点校准
- 记录校准参数到EEPROM
溶解氧传感器校准:
- 零点校准(无氧环境)
- 斜率校准(饱和溶解氧)
- 温度补偿校准
TDS传感器校准:
- 使用标准溶液校准
- 调整转换系数
6.2 通信稳定性优化
增加重试机制:
- 发送失败后自动重试
- 最大重试次数限制
数据缓存:
- 本地存储未发送成功的数据
- 网络恢复后重新发送
心跳检测:
- 定期发送心跳包
- 检测连接状态
6.3 低功耗设计
传感器电源管理:
- 不使用时关闭传感器电源
- 采用MOS管控制电源
MCU低功耗模式:
- 空闲时进入STOP模式
- 定时唤醒采集数据
通信模块节能:
- 数据上传后进入休眠
- 按需唤醒
7. 实际应用与扩展
7.1 典型应用场景
- 河流湖泊水质监测
- 水产养殖水质管理
- 饮用水源监测
- 污水处理厂监控
- 农业灌溉水质检测
7.2 系统扩展方向
增加更多水质参数:
- 浊度
- 氨氮含量
- COD/BOD
本地数据存储:
- 增加SD卡模块
- 存储历史数据
太阳能供电:
- 增加太阳能板
- 锂电池管理
边缘计算:
- 本地数据分析
- 异常检测算法
8. 常见问题与解决方案
8.1 传感器读数不稳定
可能原因:
- 电源噪声
- 信号干扰
- 传感器老化
解决方案:
- 增加电源滤波电容
- 使用屏蔽线连接传感器
- 软件滤波(移动平均、中值滤波)
- 定期校准传感器
8.2 4G模块连接失败
可能原因:
- SIM卡问题
- 网络信号弱
- APN设置错误
解决方案:
- 检查SIM卡是否正常
- 检查天线连接
- 确认APN设置
- 增加信号强度检测
8.3 数据上传延迟
可能原因:
- 网络状况差
- 云端服务繁忙
- 数据量过大
解决方案:
- 优化数据上传频率
- 压缩数据包
- 本地缓存数据
- 增加网络状态检测
8.4 功耗过高
可能原因:
- 传感器常开
- MCU未进入低功耗模式
- 通信模块未休眠
解决方案:
- 优化电源管理策略
- 合理设置采样间隔
- 使用硬件电源开关
- 优化软件架构
9. 项目总结与展望
这个基于STM32的水资源监测系统实现了多参数水质检测、本地显示和远程监控功能,具有以下特点:
- 多参数集成:同时监测多种关键水质指标
- 实时性强:数据采集和上传频率可调
- 远程监控:通过4G网络实现远程数据访问
- 报警功能:异常情况及时提醒
- 扩展性强:可方便增加新的传感器或功能
在实际应用中,系统表现稳定可靠,能够满足各类水质监测需求。未来可以考虑以下改进方向:
- 增加AI算法实现水质预测
- 优化硬件设计降低功耗
- 开发更友好的用户界面
- 支持更多通信协议(如NB-IoT)
- 增强边缘计算能力
这个项目不仅提供了一个实用的水质监测解决方案,也为类似物联网系统的开发提供了参考。通过不断优化和完善,可以将其应用到更广泛的环保和水资源管理领域。