Skip to content

环境监测解决方案

方案概述

环境监测是智慧城市的重要组成部分,通过部署分布式监测站,实时掌握城市空气质量、噪声、水质等环境数据。

空气质量监测

监测参数与传感器

参数传感器接口精度
PM2.5/PM10PMS5003 / SPS30UART±10μg/m³
CO2SCD30 / MH-Z19I2C/UART±30ppm
NO2MICS-2714ADC±5ppb
O3MQ131ADC±5ppb
温湿度SHT31I2C±0.3°C / ±2%
气压BMP280I2C±1hPa
噪声MEMS 麦克风ADC±1dB

监测站硬件设计

环境监测站组成:
  主控:STM32F4(高性能 MCU)
  通信:EC200U-CN(Cat.1,数据量较大)
  传感器:PM2.5 + CO2 + 温湿度 + 气压
  供电:太阳能 + 锂电池(户外无市电场景)
  外壳:IP65 防水防尘
  安装:路灯杆 / 专用立杆

数据采集代码

c
// 环境监测站数据采集
#include "pms5003.h"
#include "scd30.h"
#include "sht31.h"
#include "bmp280.h"

typedef struct {
    // 颗粒物
    uint16_t pm1_0;
    uint16_t pm2_5;
    uint16_t pm10;
    
    // 气体
    uint16_t co2_ppm;
    float no2_ppb;
    float o3_ppb;
    
    // 气象
    float temperature;
    float humidity;
    float pressure;
    
    // 噪声
    float noise_db;
    
    // 时间戳
    uint32_t timestamp;
} EnvData;

EnvData collect_env_data(void) {
    EnvData data = {0};
    
    // 读取 PM2.5(PMS5003,UART 接口)
    PMS5003_Data pms_data;
    if (pms5003_read(&pms_data) == 0) {
        data.pm1_0 = pms_data.pm1_0_standard;
        data.pm2_5 = pms_data.pm2_5_standard;
        data.pm10 = pms_data.pm10_standard;
    }
    
    // 读取 CO2(SCD30,I2C 接口)
    float co2, temp, hum;
    if (scd30_read_measurement(&co2, &temp, &hum) == 0) {
        data.co2_ppm = (uint16_t)co2;
    }
    
    // 读取温湿度(SHT31,I2C 接口)
    if (sht31_read(&data.temperature, &data.humidity) != 0) {
        // 使用 SCD30 的温湿度作为备用
        data.temperature = temp;
        data.humidity = hum;
    }
    
    // 读取气压(BMP280,I2C 接口)
    bmp280_read_pressure(&data.pressure);
    
    // 读取噪声(ADC + 计算 Leq)
    data.noise_db = calculate_noise_leq();
    
    data.timestamp = get_unix_timestamp();
    
    return data;
}

// 计算等效连续声级(Leq)
float calculate_noise_leq(void) {
    // 采样 1 秒,1000 个样本
    float sum_square = 0;
    for (int i = 0; i < 1000; i++) {
        uint16_t adc_val = read_adc();
        float voltage = adc_val * 3.3f / 4095.0f;
        float pressure = voltage / 0.01f;  // 传感器灵敏度 10mV/Pa
        sum_square += pressure * pressure;
        delay_us(1000);
    }
    
    float rms_pressure = sqrt(sum_square / 1000);
    float db = 20 * log10(rms_pressure / 20e-6f);  // 参考声压 20μPa
    
    return db;
}

AQI 计算

中国 AQI 计算标准(HJ 633-2012)

python
def calculate_aqi(pm25, pm10, so2, no2, co, o3_1h, o3_8h):
    """
    计算空气质量指数(AQI)
    按照 HJ 633-2012 标准
    """
    
    # 各污染物浓度限值(μg/m³)
    breakpoints = {
        'pm25': [
            (0, 35, 0, 50),
            (35, 75, 50, 100),
            (75, 115, 100, 150),
            (115, 150, 150, 200),
            (150, 250, 200, 300),
            (250, 350, 300, 400),
            (350, 500, 400, 500),
        ],
        'pm10': [
            (0, 50, 0, 50),
            (50, 150, 50, 100),
            (150, 250, 100, 150),
            (250, 350, 150, 200),
            (350, 420, 200, 300),
            (420, 500, 300, 400),
            (500, 600, 400, 500),
        ],
        # ... 其他污染物
    }
    
    def calc_iaqi(concentration, bp_list):
        """计算单项污染物 IAQI"""
        for bp_lo, bp_hi, iaqi_lo, iaqi_hi in bp_list:
            if bp_lo <= concentration <= bp_hi:
                iaqi = (iaqi_hi - iaqi_lo) / (bp_hi - bp_lo) * (concentration - bp_lo) + iaqi_lo
                return round(iaqi)
        return 500  # 超出最高限值
    
    # 计算各污染物 IAQI
    iaqi_pm25 = calc_iaqi(pm25, breakpoints['pm25'])
    iaqi_pm10 = calc_iaqi(pm10, breakpoints['pm10'])
    
    # AQI = 最大 IAQI
    aqi = max(iaqi_pm25, iaqi_pm10)
    
    # 确定首要污染物
    primary_pollutant = 'PM2.5' if iaqi_pm25 >= iaqi_pm10 else 'PM10'
    
    # AQI 等级
    if aqi <= 50:
        level = "优"
        color = "绿色"
    elif aqi <= 100:
        level = "良"
        color = "黄色"
    elif aqi <= 150:
        level = "轻度污染"
        color = "橙色"
    elif aqi <= 200:
        level = "中度污染"
        color = "红色"
    elif aqi <= 300:
        level = "重度污染"
        color = "紫色"
    else:
        level = "严重污染"
        color = "褐红色"
    
    return {
        "aqi": aqi,
        "level": level,
        "color": color,
        "primary_pollutant": primary_pollutant,
        "iaqi": {
            "pm25": iaqi_pm25,
            "pm10": iaqi_pm10
        }
    }

水质监测

水质监测参数

地表水监测参数:
  pH 值(酸碱度)
  溶解氧(DO)
  浊度(NTU)
  电导率(μS/cm)
  氨氮(mg/L)
  总磷(mg/L)
  化学需氧量(COD)
  水温(°C)
  水位(m)

通信方案:
  Cat.1(EC200U):数据量中等,需要实时性
  4G(EC25):高频采样场景

水质监测站架构

水质监测站:
  传感器探头(多参数水质仪)
    ↓ RS485 / SDI-12
  数据采集仪(MCU)
    ↓ UART
  Cat.1 模组(EC200U)
    ↓ 4G 网络
  水质监测平台

  环保部门 / 水务公司

褚成志的笔记