环境监测解决方案
方案概述
环境监测是智慧城市的重要组成部分,通过部署分布式监测站,实时掌握城市空气质量、噪声、水质等环境数据。
空气质量监测
监测参数与传感器
| 参数 | 传感器 | 接口 | 精度 |
|---|---|---|---|
| PM2.5/PM10 | PMS5003 / SPS30 | UART | ±10μg/m³ |
| CO2 | SCD30 / MH-Z19 | I2C/UART | ±30ppm |
| NO2 | MICS-2714 | ADC | ±5ppb |
| O3 | MQ131 | ADC | ±5ppb |
| 温湿度 | SHT31 | I2C | ±0.3°C / ±2% |
| 气压 | BMP280 | I2C | ±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 网络
水质监测平台
↓
环保部门 / 水务公司