毕业设计|基于STM32的水质多参数智能监测与预警系统设计

发布时间:2026/7/15 16:40:48

毕业设计|基于STM32的水质多参数智能监测与预警系统设计 1. 系统设计背景与意义水质监测在环境保护、水产养殖和饮用水安全等领域扮演着关键角色。传统的水质检测方法往往需要人工采样和实验室分析不仅耗时耗力而且无法实现实时监测。随着物联网技术的发展基于嵌入式系统的智能监测方案逐渐成为主流。STM32作为一款高性能、低功耗的微控制器非常适合用于构建小型化、智能化的水质监测设备。我在实际项目中发现单纯的水位或浑浊度检测已经不能满足现代水质监测的需求。比如在水产养殖场养殖户不仅需要知道水位高低还需要掌握水温、pH值等多项指标。这就是为什么我们需要设计一个多参数的水质监测系统能够同时监测多种水质参数并通过智能算法进行预警。2. 系统整体架构设计2.1 硬件组成系统以STM32F103C8T6为核心控制器这是一款基于Cortex-M3内核的32位微控制器具有丰富的外设资源和较低的功耗。实测下来这款芯片在数据处理和功耗控制方面表现非常稳定。系统硬件主要包括以下几个部分主控模块STM32F103C8T6最小系统传感器模块水位传感器超声波或压力式浑浊度传感器TSW-30或TS-300B温度传感器DS18B20pH值传感器工业级模拟输出显示模块0.96寸OLED显示屏报警模块蜂鸣器LED指示灯通信模块ESP8266 WiFi模块用于数据上传电源模块锂电池供电充电管理2.2 软件架构软件部分采用模块化设计主要包括传感器驱动层负责各类传感器的数据采集数据处理层对原始数据进行滤波和校准业务逻辑层实现预警算法和系统控制人机交互层处理按键输入和显示输出通信层负责数据上传和远程控制我在实际开发中发现采用这种分层架构可以大大提高代码的可维护性。比如当需要更换传感器型号时只需要修改驱动层的代码其他部分基本不用改动。3. 关键硬件设计详解3.1 STM32最小系统设计STM32F103C8T6最小系统包括以下几个必要部分电源电路3.3V稳压建议使用AMS1117-3.3复位电路10k电阻0.1uF电容时钟电路8MHz晶振两个22pF负载电容调试接口SWD四线接口VCC、GND、SWDIO、SWCLK这里有个小技巧在设计PCB时最好在电源引脚附近放置一个0.1uF的去耦电容可以有效抑制电源噪声。我曾在项目中因为忽略这个细节导致ADC采样结果波动很大。3.2 传感器接口设计不同传感器需要不同的接口方式水位传感器超声波模块如HC-SR04需要5V供电使用GPIO触发和回波检测压力式传感器通常输出模拟信号需要接ADC引脚浑浊度传感器TSW-30输出模拟信号接ADCTS-300B支持数字和模拟输出建议使用模拟输出以获得更高精度温度传感器DS18B20单总线接口需要接上拉电阻模拟温度传感器如NTC热敏电阻需要分压电路pH传感器工业级pH传感器输出0-3V模拟信号需要高精度ADC需要设计信号调理电路通常包括运放和滤波电路3.3 显示与报警电路OLED显示采用I2C接口只需要4根线VCC、GND、SCL、SDA。蜂鸣器电路设计时要注意有源蜂鸣器直接接GPIO加限流电阻无源蜂鸣器需要PWM驱动建议使用NPN三极管驱动4. 软件设计与实现4.1 传感器数据采集以浑浊度传感器为例采集代码如下// 初始化ADC void ADC1_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); // 配置ADC引脚为模拟输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); // ADC配置 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode DISABLE; ADC_InitStructure.ADC_ContinuousConvMode DISABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_Init(ADC1, ADC_InitStructure); ADC_Cmd(ADC1, ENABLE); // ADC校准 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } // 获取ADC值 u16 Get_ADC_Value(u8 ch) { ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); }4.2 多任务调度设计由于系统需要同时处理多个传感器、显示和通信任务建议使用简单的任务调度机制typedef struct { void (*task_func)(void); // 任务函数指针 uint32_t interval; // 执行间隔(ms) uint32_t last_run; // 上次执行时间 } Task_t; Task_t task_list[] { {Sensor_Update, 100, 0}, {Display_Update, 500, 0}, {Comm_Update, 1000, 0}, {Alarm_Check, 200, 0} }; void Task_Scheduler(void) { uint32_t current_time HAL_GetTick(); for(int i0; isizeof(task_list)/sizeof(Task_t); i) { if(current_time - task_list[i].last_run task_list[i].interval) { task_list[i].task_func(); task_list[i].last_run current_time; } } }4.3 智能预警算法传统的固定阈值预警方式在实际应用中效果不佳。我设计了一种自适应预警算法主要思路是学习阶段系统运行初期记录正常范围值动态调整根据历史数据自动调整预警阈值趋势预测使用简单移动平均预测未来变化趋势算法实现代码片段#define SAMPLE_SIZE 20 typedef struct { float values[SAMPLE_SIZE]; uint8_t index; float sum; } MovingAverage_t; void MA_Init(MovingAverage_t *ma) { memset(ma-values, 0, sizeof(ma-values)); ma-index 0; ma-sum 0; } float MA_Update(MovingAverage_t *ma, float new_value) { ma-sum - ma-values[ma-index]; ma-values[ma-index] new_value; ma-sum new_value; ma-index (ma-index 1) % SAMPLE_SIZE; return ma-sum / SAMPLE_SIZE; } // 自适应阈值计算 float Calculate_Dynamic_Threshold(float current_value, float *history, int size) { float avg 0, std_dev 0; // 计算平均值 for(int i0; isize; i) { avg history[i]; } avg / size; // 计算标准差 for(int i0; isize; i) { std_dev (history[i] - avg) * (history[i] - avg); } std_dev sqrt(std_dev / size); // 动态阈值 平均值 ± 2倍标准差 return avg 2 * std_dev; }5. 系统优化与实测结果5.1 低功耗优化为了延长电池供电时间我做了以下优化传感器间歇工作非必要时不采集数据STM32睡眠模式在空闲时进入Stop模式显示控制无操作时降低刷新率或关闭显示无线通信采用定时上报而非持续连接实测下来优化后的系统在锂电池供电下可以连续工作2周以上。5.2 抗干扰设计在水产养殖场实测时发现以下干扰问题传感器信号受电磁干扰无线通信距离受限长期使用后传感器漂移解决方案信号线使用屏蔽线增加软件滤波算法定期自动校准5.3 实测数据对比在三个不同场景下测试系统性能测试场景水位误差浑浊度误差温度误差pH误差实验室标准溶液±0.5cm±2%±0.2℃±0.1养殖池塘±1.2cm±5%±0.5℃±0.3污水处理厂±2.0cm±8%±1.0℃±0.5从测试结果看系统在相对清洁的环境中表现更好这也符合传感器的工作特性。6. 扩展应用与改进方向6.1 物联网集成通过ESP8266模块可以将数据上传到云平台实现远程监控。我在项目中使用了MQTT协议代码示例如下void MQTT_Publish_Data(float water_level, float turbidity, float temp, float ph) { char payload[128]; snprintf(payload, sizeof(payload), {\water_level\:%.1f,\turbidity\:%.1f,\temperature\:%.1f,\ph\:%.1f}, water_level, turbidity, temp, ph); if(mqttClient.connected()) { mqttClient.publish(sensor/data, payload); } }6.2 移动端应用开发了配套的Android应用主要功能包括实时数据显示历史数据曲线阈值设置报警通知6.3 未来改进方向增加更多水质参数监测如溶解氧、电导率等采用机器学习算法进行水质评估设计防水外壳提高户外使用可靠性开发太阳能供电版本在实际部署过程中我发现防水设计尤为重要。有一次设备因为外壳密封不严导致进水损坏后来改用IP67等级的防水盒就再没出过问题。

相关新闻