1. 项目概述
作为一名从事嵌入式系统开发多年的工程师,我最近完成了一个基于STM32的水质监测系统项目。这个系统能够实时监测水温、PH值、浑浊度和TDS(总溶解固体)等关键水质参数,并通过WiFi将数据上传到云端平台。这个项目非常适合作为物联网入门实践,也适用于水质监测的实际应用场景。
在实际开发过程中,我发现水质监测系统有几个关键挑战:传感器数据的准确性、系统的稳定性以及远程监控的实时性。通过这个项目,我总结出了一套完整的解决方案,包括硬件选型、电路设计、程序开发和系统调试等方面的经验。
2. 系统整体设计
2.1 系统架构设计
水质监测系统的整体架构可以分为三层:感知层、控制层和应用层。
感知层由各种水质传感器组成,包括:
- DS18B20温度传感器
- TSW-30浑浊度传感器
- PH4502C PH值传感器
- TDS传感器
控制层以STM32F103C8T6单片机为核心,负责:
- 采集各传感器数据
- 处理和分析数据
- 控制OLED显示屏和报警模块
- 通过ESP8266 WiFi模块与云端通信
应用层包括:
- 本地显示和报警
- 手机APP远程监控
- 云端数据存储和分析
2.2 主控芯片选型
选择STM32F103C8T6作为主控芯片主要基于以下考虑:
- 性价比高:价格适中,性能足够
- 丰富的外设接口:多个ADC通道、UART、I2C等
- 开发资源丰富:有成熟的开发环境和大量参考资料
- 低功耗特性:适合长期运行的监测设备
注意:在实际采购时,要注意区分正版和山寨芯片。山寨芯片虽然便宜,但稳定性和性能可能无法保证。
2.3 传感器选型与比较
2.3.1 温度传感器
选用DS18B20的原因:
- 防水设计,可直接浸入水中
- 数字输出,抗干扰能力强
- 测量范围-55℃~+125℃,精度±0.5℃
- 单总线接口,节省IO资源
2.3.2 浑浊度传感器
TSW-30浑浊度传感器的特点:
- 测量范围0~1000NTU
- 输出0~4.5V模拟信号
- 需要定期清洁光学窗口以保证准确性
2.3.3 PH值传感器
PH4502C的优势:
- 测量范围0~14PH
- 温度补偿功能
- 响应时间快(<1分钟)
- 需要定期校准(建议每月一次)
2.3.4 TDS传感器
TDS传感器的关键参数:
- 测量范围0~1000ppm
- 需要配合温度补偿
- 电极寿命约1-2年
3. 硬件电路设计
3.1 单片机最小系统
STM32最小系统包括:
- 电源电路:3.3V稳压
- 复位电路:10K电阻+0.1uF电容
- 时钟电路:8MHz晶振+两个22pF电容
- 下载接口:SWD四线接口
经验分享:在PCB布局时,晶振要尽量靠近芯片,走线要短,避免干扰。
3.2 传感器接口电路
3.2.1 DS18B20接口
DS18B20采用单总线协议,接线简单:
- 数据线接4.7K上拉电阻
- 电源和地线要稳定
- 长距离传输时建议使用屏蔽线
3.2.2 模拟传感器接口
浑浊度、PH和TDS传感器都是模拟输出,需要注意:
- 每个传感器单独使用一个ADC通道
- 信号线要远离电源线等干扰源
- 必要时可增加RC滤波电路
3.3 显示与报警电路
3.3.1 OLED显示
使用0.96寸I2C接口OLED,接线简单:
- SCL接PB6
- SDA接PB7
- 注意上拉电阻(通常模块已内置)
3.3.2 声光报警
报警电路包括:
- 蜂鸣器:通过NPN三极管驱动
- LED:限流电阻选择1KΩ
- 可增加光耦隔离提高可靠性
3.4 WiFi模块电路
ESP8266-01模块连接要点:
- 使用3.3V供电,注意电流要足够(至少500mA)
- TX/RX交叉连接STM32的USART
- CH_PD引脚要上拉
- GPIO0在烧录时要接地,正常工作时上拉
4. 软件设计与实现
4.1 开发环境搭建
- 安装Keil MDK开发环境
- 配置STM32F1系列支持包
- 安装ST-Link驱动
- 准备串口调试工具(如SSCOM)
4.2 主程序设计
系统主程序流程:
- 初始化各外设
- 读取传感器数据
- 数据处理和判断
- 显示更新
- 数据上传
- 报警检查
c复制int main(void)
{
// 硬件初始化
System_Init();
while(1)
{
// 读取所有传感器
Read_Sensors();
// 数据处理
Process_Data();
// 显示更新
Update_Display();
// 数据上传
WiFi_Send_Data();
// 报警检查
Check_Alarm();
// 延时
HAL_Delay(1000);
}
}
4.3 传感器驱动开发
4.3.1 DS18B20驱动
DS18B20的读写时序要求严格,需要精确的延时。以下是温度读取的关键代码:
c复制float DS18B20_ReadTemp(void)
{
uint8_t tempL, tempH;
uint16_t temp;
float temperature;
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0x44); // 开始转换
Delay_ms(750); // 等待转换完成
DS18B20_Reset();
DS18B20_WriteByte(0xCC); // 跳过ROM
DS18B20_WriteByte(0xBE); // 读取暂存器
tempL = DS18B20_ReadByte();
tempH = DS18B20_ReadByte();
temp = (tempH << 8) | tempL;
temperature = temp * 0.0625;
return temperature;
}
4.3.2 模拟传感器读取
使用STM32的ADC读取模拟传感器:
c复制uint16_t Read_ADC(ADC_HandleTypeDef* hadc, uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = Channel;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
HAL_ADC_ConfigChannel(hadc, &sConfig);
HAL_ADC_Start(hadc);
HAL_ADC_PollForConversion(hadc, 10);
return HAL_ADC_GetValue(hadc);
}
4.4 WiFi通信实现
ESP8266使用AT指令进行通信,主要流程:
- 发送AT测试指令
- 设置WiFi模式(STA)
- 连接路由器
- 建立TCP连接
- 发送数据
c复制void WiFi_Send_Data(void)
{
char cmd[128];
// 连接路由器
UART_SendString("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n");
Delay_ms(5000);
// 建立TCP连接
UART_SendString("AT+CIPSTART=\"TCP\",\"192.168.1.100\",8080\r\n");
Delay_ms(2000);
// 准备数据
sprintf(cmd, "temp=%.2f&ph=%.2f&tds=%d&turb=%d",
temp_value, ph_value, tds_value, turb_value);
// 发送数据
UART_SendString("AT+CIPSEND=");
UART_SendString(itoa(strlen(cmd), 10));
UART_SendString("\r\n");
Delay_ms(500);
UART_SendString(cmd);
UART_SendString("\r\n");
// 关闭连接
UART_SendString("AT+CIPCLOSE\r\n");
}
5. 系统调试与优化
5.1 传感器校准
5.1.1 PH传感器校准
PH传感器需要两点校准:
- 使用PH4.01标准缓冲液
- 使用PH6.86标准缓冲液
- 记录两个点的ADC值
- 计算斜率和偏移量
5.1.2 TDS传感器校准
TDS校准步骤:
- 准备已知浓度的标准溶液(如342ppm)
- 测量并记录ADC值
- 计算转换系数
5.2 通信稳定性优化
WiFi通信常见问题及解决方案:
- 连接不稳定:增加重试机制,最多重试3次
- 数据丢失:添加校验和重传机制
- 功耗高:降低发送频率(如每5分钟发送一次)
5.3 低功耗设计
为延长电池供电时间,可采取以下措施:
- 使用STM32的低功耗模式
- 传感器间歇工作
- 关闭不必要的外设
- 降低主频
6. 实际应用与扩展
6.1 部署注意事项
- 传感器安装位置要代表水体整体状况
- 避免阳光直射影响温度测量
- 定期维护(清洁、校准)
- 防水处理要可靠
6.2 系统扩展方向
- 增加更多水质参数(如溶解氧、电导率)
- 太阳能供电系统
- 本地数据存储(SD卡)
- 多节点组网监测
6.3 云端平台对接
常见的物联网平台选择:
- 阿里云IoT
- 腾讯云IoT
- ThingsBoard开源平台
- 自建MQTT服务器
以阿里云为例,对接流程:
- 创建产品和设备
- 获取三元组信息
- 实现MQTT协议
- 定义数据格式
7. 常见问题与解决方案
7.1 传感器读数不稳定
可能原因及解决方法:
- 电源噪声:增加滤波电容
- 接线不良:检查连接器
- 传感器老化:更换传感器
- 环境干扰:改善屏蔽
7.2 WiFi连接失败
排查步骤:
- 检查SSID和密码是否正确
- 测试模块是否能响应AT指令
- 测量供电电压是否足够
- 检查天线是否连接良好
7.3 数据显示异常
处理流程:
- 检查传感器供电
- 测量原始信号是否正常
- 检查ADC参考电压
- 验证数据处理算法
在实际项目中,我发现PH传感器最容易出现问题,特别是在长期使用后。建议每月进行一次校准,并定期检查电极状态。另外,WiFi模块的供电一定要稳定,最好单独使用一个LDO稳压器,避免因电压波动导致模块重启。
