基于STM32的智能防汛检测系统设计
本文设计了一种基于STM32单片机的智能防汛监测系统,整合水位、雨量、光照等多源传感器数据,通过Wi-Fi接入物联网云平台,实现对防汛区域的实时监控与智能预警。系统采用四层架构,具备自动控制水泵、阀门等执行机构的功能,并支持远程云端管理。硬件选用工业级芯片和防水设计,软件采用HAL库开发,实现数据采集、逻辑判断和云端通信。测试方案包括实验室校准和现场环境适应性验证,未来可扩展AI预测、多站组网等功
若该文为原创文章,转载请注明原文出处。
一、引言
(一)研究背景及意义
全球气候变化导致极端天气事件频发,洪涝灾害已成为威胁人民生命财产安全的主要自然灾害之一。传统的防汛手段主要依赖人工巡检和固定水位尺观测,存在效率低、风险高、响应滞后等弊端,无法满足现代智慧城市对防灾减灾“预警早、反应快、决策准”的要求。因此,构建一套集多参数实时监测、智能分析决策、自动联动控制和远程云端管理于一体的智能防汛系统迫在眉睫。本项目基于STM32单片机,融合水位、雨量、光照、土壤湿度、浊度等多种传感器,通过Wi-Fi接入物联网云平台,旨在实现对重点防汛区域(如河道、水库、低洼路段、地下车库)的7x24小时无人化智能监控,为防汛指挥提供精准、实时、全面的数据支持,极大提升防汛工作的智能化水平和应急响应能力,具有显著的社会效益和经济效益。
(二)国内外研究现状
目前,国内外在水文监测领域已有一些研究和应用,如基于GPRS/4G的水位遥测站。然而,现有系统多存在功能单一(仅测水位)、集成度低、成本高昂、无法实现现场智能联动控制等问题。将多源异构传感器(水位、雨量、光照、土壤湿度、浊度)数据进行融合分析,并根据预设逻辑自动控制执行机构(水泵、阀门、照明),并通过云平台实现远程集中监控的一体化解决方案,仍是当前研究和应用的热点与难点。本研究旨在攻克多传感器数据融合与智能决策算法,提供一个高可靠性、高集成度的低成本防汛监测终端方案。
二、系统总体设计
(一)系统架构
本系统采用“感知-决策-执行-云控”的四层分布式架构。
-
感知层:由水位传感器、雨量传感器、光敏电阻、土壤湿度传感器、浊度传感器构成,全面采集防汛关键参数。
-
决策层:STM32主控制器作为边缘计算节点,负责数据汇聚、滤波、计算,并运行核心控制算法(自动/手动模式判断、阈值逻辑)。
-
执行层:包括继电器(控制水泵、照明灯)、舵机(控制阀门)、蜂鸣器(现场报警),负责执行具体的防汛动作。
-
云控层:基于ESP8266 Wi-Fi模块与云平台(如OneNET、阿里云)连接,实现数据可视化、历史查询、远程手动控制和阈值设置。
(二)功能模块划分
-
环境监测模块:水位传感器 + 雨量传感器 + 光敏电阻 + 土壤湿度传感器 + 浊度传感器。
-
智能决策模块:STM32 (运行自动/手动逻辑)。
-
现场执行模块:继电器控制水泵/照明灯 + 舵机控制阀门 + 蜂鸣器。
-
人机交互模块:OLED显示屏 + 按键。
-
通信模块:ESP8266 Wi-Fi模块。
-
电源与防护模块:防雷、防水、防潮设计,备用电源。
三、硬件设计与实现
(一)系统硬件框架图
-
STM32F103C8T6 (主控核心,工业级)
-
水位传感器 (如超声波HC-SR04或压力式):Trig接
PA0
, Echo接PA1
或 模拟输出接PA0
(ADC_IN0) -
雨量传感器(翻斗式,输出脉冲):接
PA2
(外部中断引脚) -
光敏电阻:接
PA3
(ADC_IN3) -
土壤湿度传感器(模拟):接
PA4
(ADC_IN4) -
浊度传感器(模拟):接
PA5
(ADC_IN5) -
继电器模块 x 3:接
PC13
(照明灯),PC14
(水泵1),PC15
(水泵2) -
SG90舵机(模拟阀门):信号线接
PA6
(TIM3_CH1 PWM输出) -
蜂鸣器(有源):接
PB0
-
按键 x 3:模式切换、设置、确认 接至
PB1
,PB2
,PB3
-
OLED (SSD1306) : I2C接口,接
PB6
(SCL),PB7
(SDA) -
ESP-01S (ESP8266) : 接USART2
PA2
(TX),PA3
(RX)
(二)主控模块选型及介绍
主控芯片选用工业级的STM32F103C8T6。其资源丰富且稳定:
-
多路ADC:可同时连接多个模拟传感器(光敏、土壤湿度、浊度,可选水位)。
-
定时器/计数器:用于产生PWM控制舵机,并计数雨量传感器的脉冲信号。
-
多个GPIO:用于控制继电器、蜂鸣器、按键和数字传感器。
-
UART:用于与Wi-Fi模块稳定通信。
其强大的处理能力能胜任多传感器数据融合和复杂逻辑判断。
(三)传感器模块选型及电路设计
-
水位传感器:
-
超声波式(HC-SR04):非接触式测量,不易被污染,但易受水面波动和泡沫影响。需计算声速补偿。
-
压力式:投入式,测量精度高,但需要安装在水底。
-
-
雨量传感器(翻斗式):每翻转一斗代表一个固定降雨量(如0.2mm),输出一个脉冲信号。STM32通过外部中断或计数器功能统计脉冲数,从而计算单位时间内的降雨量。
-
光敏电阻:与固定电阻分压,接入ADC,判断昼夜与天气状况。
-
土壤湿度传感器:模拟输出,输出电压随土壤湿度增加而升高。
-
浊度传感器:模拟输出,输出电压随水体浑浊度升高而降低(颗粒物散射光线)。
(四)通信模块选型及配置
选用ESP-01S模块。在野外或地下车库等无Wi-Fi覆盖区域,可替换为4G Cat.1 DTU模块(如移远EC200S),通过UART与STM32通信,直接接入蜂窝网络,虽成本略高但部署更灵活。
(五)执行模块选型及驱动电路
-
继电器模块:用于控制大电流的水泵和照明灯。强电警告! 控制220VAC设备必须做好强弱电隔离,接线端子加防护罩。
-
舵机:用于模拟阀门的开闭(0°和90°两个位置),由STM32的PWM信号控制。
-
蜂鸣器:有源蜂鸣器,通过三极管驱动,用于现场声光报警。
(六)显示模块选型及接口电路
选用0.96寸I2C接口的OLED显示屏,用于在现场显示所有监测参数和系统状态,方便调试和维护。
(七)电源模块设计与防护
野外环境,电源与防护是重中之重!
-
电源:采用12V/2A直流电源适配器供电,通过DC-DC降压模块转换为5V和3.3V。必须配备12V蓄电池作为备用电源,市电中断时自动切换。
-
防护:
-
防雷:电源入口处安装防雷模块(浪涌保护器)。
-
防水:整个系统安装在防水仪表箱内,传感器引出线处做好防水密封。
-
防潮:箱体内放置干燥剂,PCB板喷涂三防漆。
-
四、软件设计与实现
(一)开发环境搭建
-
IDE: Keil uVision5
-
库: STM32HAL库
-
协议: cJSON库,MQTT协议(与云平台通信)
(二)系统软件流程图
(三)系统初始化(代码片段)
// main.c
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "i2c.h"
#include "ssd1306.h"
#include "esp8266_mqtt.h"
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3; // For Servo PWM
UART_HandleTypeDef huart2; // For ESP8266
I2C_HandleTypeDef hi2c1;
// 全局变量
SystemMode_TypeDef sys_mode = MODE_AUTO;
float water_level = 0;
float rainfall = 0;
int light_value = 0;
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
MX_USART2_UART_Init();
MX_I2C1_Init();
OLED_Init();
ESP8266_MQTT_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // Start PWM for servo
// Load thresholds from EEPROM
water_threshold_1 = 30.0;
water_threshold_2 = 50.0;
rain_threshold = 20.0; // mm/h
light_threshold_night = 25;
light_threshold_cloudy = 75;
while (1) {
Main_Task();
HAL_Delay(3000); // 主循环周期3秒,可根据需要调整
}
}
(四)传感器数据采集与处理(代码片段)
void Sensor_ReadTask(void) {
// 1. 读取水位 (以超声波为例)
water_level = ULTRASONIC_GetDistance();
// 注意: 需转换为实际水位高度,并做滤波处理
// 2. 读取雨量 (通过外部中断计数脉冲,在主循环中计算单位时间内的雨量)
rainfall = (pulse_count * 0.2) / (time_interval / 3600.0); // 计算为毫米每小时(mm/h)
pulse_count = 0; // 重置计数器
// 3. 读取光照 (ADC)
light_value = HAL_ADC_GetValue(&hadc1);
// 4. 读取土壤湿度 (ADC)
soil_moisture = HAL_ADC_GetValue(&hadc2);
// 5. 读取浊度 (ADC)
turbidity = HAL_ADC_GetValue(&hadc3);
}
(五)控制功能实现(代码片段)
void Auto_Control_Task(void) {
// 1. 光照与照明控制
if (light_value < light_threshold_night) {
weather_status = "Night";
Relay_Control(LIGHT_RELAY, ON);
} else if (light_value < light_threshold_cloudy) {
weather_status = "Cloudy";
Relay_Control(LIGHT_RELAY, OFF);
} else {
weather_status = "Sunny";
Relay_Control(LIGHT_RELAY, OFF);
}
// 2. 水位与水泵控制
if (water_level > water_threshold_2) {
Relay_Control(PUMP1_RELAY, ON);
Relay_Control(PUMP2_RELAY, ON);
water_alert = "Danger!";
} else if (water_level > water_threshold_1) {
Relay_Control(PUMP1_RELAY, ON);
Relay_Control(PUMP2_RELAY, OFF);
water_alert = "Warning!";
} else {
Relay_Control(PUMP1_RELAY, OFF);
Relay_Control(PUMP2_RELAY, OFF);
water_alert = "Normal";
}
// 3. 雨量与阀门控制
if (rainfall > rain_threshold) {
SERVO_SetAngle(0); // 关闭阀门
valve_status = "Closed";
} else {
SERVO_SetAngle(90); // 打开阀门
valve_status = "Open";
}
// 4. 其他报警
if (temperature > temp_threshold) {
Buzz_Enable(1);
} else {
Buzz_Enable(0);
}
}
(六)远程控制功能实现(代码片段)
// 数据上传函数
void Cloud_UploadTask(void) {
cJSON *root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "water_level", water_level);
cJSON_AddNumberToObject(root, "rainfall", rainfall);
cJSON_AddNumberToObject(root, "light", light_value);
cJSON_AddNumberToObject(root, "soil_moisture", soil_moisture);
cJSON_AddNumberToObject(root, "turbidity", turbidity);
cJSON_AddStringToObject(root, "weather", weather_status);
cJSON_AddStringToObject(root, "water_alert", water_alert);
cJSON_AddStringToObject(root, "valve_status", valve_status);
cJSON_AddStringToObject(root, "mode", (sys_mode == MODE_AUTO) ? "auto" : "manual");
char *json_str = cJSON_Print(root);
ESP8266_MQTT_Publish("flood/data", json_str);
cJSON_Delete(root);
free(json_str);
}
// 指令接收解析
void MQTT_Callback(char* topic, char* payload) {
cJSON *root = cJSON_Parse(payload);
if (root) {
cJSON *cmd = cJSON_GetObjectItem(root, "command");
if (cmd) {
if (strcmp(cmd->valuestring, "set_mode_manual") == 0) {
sys_mode = MODE_MANUAL;
} else if (strcmp(cmd->valuestring, "set_mode_auto") == 0) {
sys_mode = MODE_AUTO;
} else if (strcmp(cmd->valuestring, "control_pump1") == 0) {
cJSON *val = cJSON_GetObjectItem(root, "value");
Relay_Control(PUMP1_RELAY, val->valueint);
} // ... 其他控制指令
}
cJSON_Delete(root);
}
}
五、系统测试与优化
(一)测试方案
-
实验室测试:
-
传感器校准:用水尺校准水位传感器;用标准雨量计校准雨量传感器;用标准光照计校准光敏电阻。
-
功能测试:模拟不同水位、降雨量、光照条件,测试各执行机构(水泵、阀门、灯)是否按预设逻辑正确动作。
-
-
现场部署测试:
-
环境适应性测试:在真实场景(如河边)部署,测试系统在风雨、高湿环境下的长期稳定性。
-
通信压力测试:测试在网络信号波动时,数据的重传和连接恢复机制是否可靠。
-
-
极端情况测试:模拟传感器故障、电源中断等情况,测试系统的容错能力和备用电源切换功能。
(二)测试结果与分析
预计测试结果:系统能稳定实现所有功能。测试关键点在于:
-
传感器精度与抗干扰:野外环境复杂,需对传感器数据进行软件滤波(如卡尔曼滤波)和合理性校验,剔除异常值。
-
执行机构可靠性:水泵、阀门等执行器的机械动作需要可靠,防止卡死。
-
电源与通信可靠性:备用电源的续航能力和4G网络信号的稳定性是系统长期可靠运行的关键。
(三)系统优化
-
算法优化:采用模糊控制或PID算法来控制水泵的启停,避免频繁启停,并根据水位变化率预测洪水趋势,实现更智能的预警。
-
功耗优化:优化程序,让STM32和4G模块在非采集时段进入低功耗休眠模式,由RTC定时唤醒,极大延长备用电源续航。
-
自诊断功能:增加传感器故障自诊断功能,如检测传感器断线、数据超范围等,并主动上报故障信息至云平台。
-
太阳能供电:为野外长期无人值守站点增加太阳能电池板和充电控制器,实现能源自给自足。
六、结论与展望
(一)未来展望
-
多站组网与GIS集成:部署多个监测点形成监测网络,并将数据集成到地理信息系统(GIS)中,在电子地图上可视化显示各点状态,实现流域级的宏观防汛指挥。
-
AI预测预警:在云平台端引入机器学习算法,基于历史数据和实时数据训练模型,实现洪涝风险的预测性预警,而不仅仅是事后响应。
-
联动应急系统:与城市的应急广播、交通信号灯系统、地下车库闸门系统联动,在险情发生时自动触发一系列应急措施(如关闭车库、疏导交通)。
-
公众服务:开发面向公众的App或小程序,授权用户查看其周边区域的防汛监测数据,提高公众的防灾避险意识。
如有侵权,或需要完整代码,请及时联系博主。
更多推荐
所有评论(0)