若该文为原创文章,转载请注明原文出处。

一、引言

(一)研究背景及意义

全球气候变化导致极端天气事件频发,洪涝灾害已成为威胁人民生命财产安全的主要自然灾害之一。传统的防汛手段主要依赖人工巡检和固定水位尺观测,存在效率低、风险高、响应滞后等弊端,无法满足现代智慧城市对防灾减灾“预警早、反应快、决策准”的要求。因此,构建一套集多参数实时监测、智能分析决策、自动联动控制和远程云端管理于一体的智能防汛系统迫在眉睫。本项目基于STM32单片机,融合水位、雨量、光照、土壤湿度、浊度等多种传感器,通过Wi-Fi接入物联网云平台,旨在实现对重点防汛区域(如河道、水库、低洼路段、地下车库)的7x24小时无人化智能监控,为防汛指挥提供精准、实时、全面的数据支持,极大提升防汛工作的智能化水平和应急响应能力,具有显著的社会效益和经济效益。

(二)国内外研究现状

目前,国内外在水文监测领域已有一些研究和应用,如基于GPRS/4G的水位遥测站。然而,现有系统多存在功能单一(仅测水位)、集成度低、成本高昂、无法实现现场智能联动控制等问题。将多源异构传感器(水位、雨量、光照、土壤湿度、浊度)数据进行融合分析,并根据预设逻辑自动控制执行机构(水泵、阀门、照明),并通过云平台实现远程集中监控的一体化解决方案,仍是当前研究和应用的热点与难点。本研究旨在攻克多传感器数据融合与智能决策算法,提供一个高可靠性、高集成度的低成本防汛监测终端方案。

二、系统总体设计

(一)系统架构

本系统采用“感知-决策-执行-云控”的四层分布式架构。

  • 感知层:由水位传感器、雨量传感器、光敏电阻、土壤湿度传感器、浊度传感器构成,全面采集防汛关键参数。

  • 决策层:STM32主控制器作为边缘计算节点,负责数据汇聚、滤波、计算,并运行核心控制算法(自动/手动模式判断、阈值逻辑)。

  • 执行层:包括继电器(控制水泵、照明灯)、舵机(控制阀门)、蜂鸣器(现场报警),负责执行具体的防汛动作。

  • 云控层:基于ESP8266 Wi-Fi模块与云平台(如OneNET、阿里云)连接,实现数据可视化、历史查询、远程手动控制和阈值设置。

(二)功能模块划分

  1. 环境监测模块:水位传感器 + 雨量传感器 + 光敏电阻 + 土壤湿度传感器 + 浊度传感器。

  2. 智能决策模块:STM32 (运行自动/手动逻辑)。

  3. 现场执行模块:继电器控制水泵/照明灯 + 舵机控制阀门 + 蜂鸣器。

  4. 人机交互模块:OLED显示屏 + 按键。

  5. 通信模块:ESP8266 Wi-Fi模块。

  6. 电源与防护模块:防雷、防水、防潮设计,备用电源。

三、硬件设计与实现

(一)系统硬件框架图

  • 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:模式切换、设置、确认 接至 PB1PB2PB3

  • OLED (SSD1306) : I2C接口,接 PB6(SCL), PB7(SDA)

  • ESP-01S (ESP8266) : 接USART2 PA2(TX), PA3(RX)

(二)主控模块选型及介绍

主控芯片选用工业级的STM32F103C8T6。其资源丰富且稳定:

  • 多路ADC:可同时连接多个模拟传感器(光敏、土壤湿度、浊度,可选水位)。

  • 定时器/计数器:用于产生PWM控制舵机,并计数雨量传感器的脉冲信号。

  • 多个GPIO:用于控制继电器、蜂鸣器、按键和数字传感器。

  • UART:用于与Wi-Fi模块稳定通信。
    其强大的处理能力能胜任多传感器数据融合和复杂逻辑判断。

(三)传感器模块选型及电路设计

  1. 水位传感器

    • 超声波式(HC-SR04):非接触式测量,不易被污染,但易受水面波动和泡沫影响。需计算声速补偿。

    • 压力式:投入式,测量精度高,但需要安装在水底。

  2. 雨量传感器(翻斗式):每翻转一斗代表一个固定降雨量(如0.2mm),输出一个脉冲信号。STM32通过外部中断或计数器功能统计脉冲数,从而计算单位时间内的降雨量。

  3. 光敏电阻:与固定电阻分压,接入ADC,判断昼夜与天气状况。

  4. 土壤湿度传感器:模拟输出,输出电压随土壤湿度增加而升高。

  5. 浊度传感器:模拟输出,输出电压随水体浑浊度升高而降低(颗粒物散射光线)。

(四)通信模块选型及配置

选用ESP-01S模块。在野外或地下车库等无Wi-Fi覆盖区域,可替换为4G Cat.1 DTU模块(如移远EC200S),通过UART与STM32通信,直接接入蜂窝网络,虽成本略高但部署更灵活。

(五)执行模块选型及驱动电路

  1. 继电器模块:用于控制大电流的水泵和照明灯。强电警告! 控制220VAC设备必须做好强弱电隔离,接线端子加防护罩。

  2. 舵机:用于模拟阀门的开闭(0°和90°两个位置),由STM32的PWM信号控制。

  3. 蜂鸣器:有源蜂鸣器,通过三极管驱动,用于现场声光报警。

(六)显示模块选型及接口电路

选用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);
    }
}

五、系统测试与优化

(一)测试方案

  1. 实验室测试

    • 传感器校准:用水尺校准水位传感器;用标准雨量计校准雨量传感器;用标准光照计校准光敏电阻。

    • 功能测试:模拟不同水位、降雨量、光照条件,测试各执行机构(水泵、阀门、灯)是否按预设逻辑正确动作。

  2. 现场部署测试

    • 环境适应性测试:在真实场景(如河边)部署,测试系统在风雨、高湿环境下的长期稳定性。

    • 通信压力测试:测试在网络信号波动时,数据的重传和连接恢复机制是否可靠。

  3. 极端情况测试:模拟传感器故障、电源中断等情况,测试系统的容错能力和备用电源切换功能。

(二)测试结果与分析

预计测试结果:系统能稳定实现所有功能。测试关键点在于:

  1. 传感器精度与抗干扰:野外环境复杂,需对传感器数据进行软件滤波(如卡尔曼滤波)和合理性校验,剔除异常值。

  2. 执行机构可靠性:水泵、阀门等执行器的机械动作需要可靠,防止卡死。

  3. 电源与通信可靠性:备用电源的续航能力和4G网络信号的稳定性是系统长期可靠运行的关键。

(三)系统优化

  1. 算法优化:采用模糊控制PID算法来控制水泵的启停,避免频繁启停,并根据水位变化率预测洪水趋势,实现更智能的预警。

  2. 功耗优化:优化程序,让STM32和4G模块在非采集时段进入低功耗休眠模式,由RTC定时唤醒,极大延长备用电源续航。

  3. 自诊断功能:增加传感器故障自诊断功能,如检测传感器断线、数据超范围等,并主动上报故障信息至云平台。

  4. 太阳能供电:为野外长期无人值守站点增加太阳能电池板和充电控制器,实现能源自给自足。

六、结论与展望

(一)未来展望

  1. 多站组网与GIS集成:部署多个监测点形成监测网络,并将数据集成到地理信息系统(GIS)中,在电子地图上可视化显示各点状态,实现流域级的宏观防汛指挥。

  2. AI预测预警:在云平台端引入机器学习算法,基于历史数据和实时数据训练模型,实现洪涝风险的预测性预警,而不仅仅是事后响应。

  3. 联动应急系统:与城市的应急广播、交通信号灯系统、地下车库闸门系统联动,在险情发生时自动触发一系列应急措施(如关闭车库、疏导交通)。

  4. 公众服务:开发面向公众的App或小程序,授权用户查看其周边区域的防汛监测数据,提高公众的防灾避险意识。

如有侵权,或需要完整代码,请及时联系博主。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐