编写程序实现智能工地粉尘检测,超标提示“开启喷淋降尘”。

张开发
2026/4/18 5:22:57 15 分钟阅读

分享文章

编写程序实现智能工地粉尘检测,超标提示“开启喷淋降尘”。
项目名称DustGuardian (智能工地扬尘监测系统)一、 实际应用场景描述场景设定为城市建筑工地的围挡上方安装的扬尘在线监测站 (PM Monitor Station)。该站点集成了激光散射式 PM2.5/PM10 传感器、风速风向传感器和噪声传感器。系统通过 4G/LoRa 模块将数据上传至云端并在本地通过继电器控制喷淋系统高压水泵喷头。当监测到 PM10 浓度超过环保部门设定的阈值如 150μg/m³且风速低于扩散临界值如 3m/s时系统自动触发喷淋降尘并在现场 LED 屏显示告警。二、 引入痛点传统工地粉尘管理存在以下环保与安全痛点1. 被动执法往往是附近居民投诉或环保局抽查才发现扬尘超标面临高额罚款。2. 粗放喷洒不管有没有扬尘定时定点喷水造成水资源浪费且在干燥大风天无效。3. 数据造假部分低端设备缺乏校准数据漂移严重无法作为执法依据。4. 反应滞后人工巡查周期长无法应对突发的土方作业产生的高浓度粉尘。三、 核心逻辑讲解本系统的核心逻辑基于多因子决策矩阵 (Multi-factor Decision Matrix) 与执行器互锁 (Actuator Interlock)1. 数据采集与预处理* 激光粉尘传感器模拟输出原始粒子计数。* 卡尔曼滤波 (Kalman Filter) 或滑动平均滤波去除车辆经过造成的瞬间脉冲干扰。2. 多条件触发算法* 主条件PM10 THRESHOLD_HIGH (例如 150)。* 辅条件气象修正Wind_Speed THRESHOLD_LOW (例如 2.5 m/s)。风大了喷也没用还浪费水* 持续时间连续 3 次采样约 3 分钟均超标才触发防止误报。3. 执行器控制* 输出高电平信号给继电器模块启动水泵。* 设置最小运行时间如 5 分钟防止水泵频繁启停损坏电机。四、 代码模块化实现我们将代码分为四个模块config.py (环保标准)、sensors.py (大气传感器模拟)、controller.py (决策核心)、main.py (主循环与执行器)。1. 配置文件config.py配置文件环保标准与硬件参数参考《环境空气质量标准》(GB 3095-2012)# 颗粒物浓度阈值 (单位: μg/m³)DUST_THRESHOLDS {PM10_WARNING: 150, # 触发喷淋的阈值PM10_SAFE: 100 # 关闭喷淋的阈值 (回差控制)}# 气象条件阈值METEO_THRESHOLDS {MIN_WIND_SPEED_MPS: 2.5 # 最小风速 (m/s)低于此值认为空气不流通}# 系统参数SYSTEM_CONFIG {SAMPLE_INTERVAL_S: 10, # 采样间隔PERSISTENCE_COUNT: 3, # 持续超标次数才触发SPRAY_MIN_RUNTIME_S: 300 # 喷淋最短运行时间 (5分钟)}2. 传感器模拟模块sensors.py智能仪器课程相关大气环境监测传感器模拟模拟激光粉尘仪和超声波风速仪import randomimport mathclass AtmosphericSensorArray:虚拟大气传感器阵列模拟工地环境的复杂噪声def __init__(self, base_pm1050):self.base_pm10 base_pm10self.trend 1 # 模拟施工活动导致的趋势def read_pm10(self):读取 PM10 浓度加入周期性波动和突发峰值# 模拟土方作业带来的指数级增长self.base_pm10 self.trend * random.uniform(0, 5)# 模拟车辆经过的脉冲噪声spike 0 if random.random() 0.1 else random.uniform(50, 150)noise random.uniform(-10, 10)value max(0, self.base_pm10 noise spike)return round(value, 1)def read_wind_speed(self):读取风速# 工地通常有一定阵风return round(random.uniform(0.5, 5.0), 1)def simulate_dust_settling(self):模拟喷淋后的沉降效果self.base_pm10 * 0.7 # 喷淋后浓度下降self.trend -0.53. 决策与控制核心controller.py智能仪器核心基于规则的多因子决策控制器包含回差控制(Hysteresis)防止执行器抖动from collections import dequeclass DustControlController:def __init__(self, pm_threshold, wind_threshold, persistence):self.pm_threshold pm_thresholdself.wind_threshold wind_thresholdself.persistence persistence# 使用队列记录最近几次的超标状态self.recent_status deque(maxlenpersistence)self.spray_active Falsedef evaluate_conditions(self, pm10, wind_speed):评估是否应该开启喷淋返回 True 表示满足条件# 条件1: PM10超标condition_pm pm10 self.pm_threshold# 条件2: 风速较低 (不利于扩散)condition_wind wind_speed self.wind_thresholdprint(f [评估] PM10{pm10}μg/m³(阈值{self.pm_threshold}), 风速{wind_speed}m/s(阈值{self.wind_threshold}))print(f [评估] PM超标:{condition_pm}, 风速低:{condition_wind})return condition_pm and condition_winddef should_activate_spray(self, pm10, wind_speed):带持久性的激活判断status self.evaluate_conditions(pm10, wind_speed)self.recent_status.append(status)# 检查最近N次是否全部满足条件if len(self.recent_status) self.persistence:if all(self.recent_status) and not self.spray_active:return Truereturn Falsedef should_deactivate_spray(self, pm10):带回差的关闭判断只有PM10降到安全线以下才关闭if self.spray_active and pm10 DUST_THRESHOLDS[PM10_SAFE]:return Truereturn False4. 主程序逻辑main.pyDustGuardian - 主执行文件import timeimport datetimefrom config import DUST_THRESHOLDS, METEO_THRESHOLDS, SYSTEM_CONFIGfrom sensors import AtmosphericSensorArrayfrom controller import DustControlControllerclass DustMonitoringSystem:def __init__(self):self.sensors AtmosphericSensorArray()self.controller DustControlController(pm_thresholdDUST_THRESHOLDS[PM10_WARNING],wind_thresholdMETEO_THRESHOLDS[MIN_WIND_SPEED_MPS],persistenceSYSTEM_CONFIG[PERSISTENCE_COUNT])self.spray_runtime 0def activate_spray(self):开启喷淋print(\n * 30)print( 警报粉尘浓度超标开启喷淋降尘系统)print( * 30 \n)self.controller.spray_active Trueself.spray_runtime 0self.sensors.simulate_dust_settling() # 模拟物理效果def deactivate_spray(self):关闭喷淋print(\n✅ 粉尘浓度已降至安全水平关闭喷淋系统。)self.controller.spray_active Falsedef run(self):主运行循环print(️ 智能工地粉尘监测系统启动 ️)print(f监测参数: PM10 {DUST_THRESHOLDS[PM10_WARNING]} 且 风速 {METEO_THRESHOLDS[MIN_WIND_SPEED_MPS]}m/s 触发)print(- * 60)try:while True:# 1. 数据采集pm10 self.sensors.read_pm10()wind self.sensors.read_wind_speed()timestamp datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)print(f\n[{timestamp}] 采样:)# 2. 逻辑判断与执行if not self.controller.spray_active:if self.controller.should_activate_spray(pm10, wind):self.activate_spray()else:# 喷淋期间累计运行时间self.spray_runtime SYSTEM_CONFIG[SAMPLE_INTERVAL_S]print(f [状态] 喷淋中... 已运行 {self.spray_runtime}s)# 检查是否可以关闭 (同时满足时间和浓度条件)if (self.spray_runtime SYSTEM_CONFIG[SPRAY_MIN_RUNTIME_S] andself.controller.should_deactivate_spray(pm10)):self.deactivate_spray()time.sleep(SYSTEM_CONFIG[SAMPLE_INTERVAL_S])except KeyboardInterrupt:print(\n系统已手动停止。)if __name__ __main__:system DustMonitoringSystem()system.run()五、 README 文件# DustGuardian - 智能工地扬尘监测系统## 项目简介这是一个基于 Python 的工业物联网 (IIoT) 模拟项目。项目模拟了建筑工地扬尘监测站的完整工作流程包括激光粉尘传感器数据采集、气象条件辅助判断以及喷淋系统的智能联动控制。## 核心功能* **多因子决策**: 不仅看 PM10 浓度还结合风速判断是否开启喷淋节约用水。* **抗干扰算法**: 引入持续次数判断过滤掉车辆经过造成的瞬间粉尘脉冲。* **回差控制 (Hysteresis)**: 开启和关闭使用不同的阈值防止喷淋系统在临界点频繁启停。* **模拟物理效应**: 喷淋开启后模拟粉尘浓度的下降趋势。## 环境依赖* Python 3.8## 使用说明1. 确保 config.py, sensors.py, controller.py, main.py 在同一目录。2. 运行主程序bashpython main.py3. 观察控制台输出。系统会模拟粉尘逐渐升高 - 触发条件 - 开启喷淋 - 粉尘下降 - 关闭喷淋的完整周期。## 扩展建议* 接入真实的 PMS5003 (Plantower) 激光粉尘传感器。* 增加 GPRS/GSM 模块通过 AT 指令发送 SMS 报警短信。* 增加 Modbus RTU 协议输出对接工地现有的 PLC 系统。* 增加数据可视化面板 (Dashboard)使用 Matplotlib 实时绘图。六、 核心知识点卡片 (Key Takeaways)类别 知识点 说明智能仪器 多传感器融合 结合颗粒物传感器与气象传感器做出比单一传感器更科学的决策。控制理论 回差控制 (Hysteresis) 防止执行器在阈值边缘振荡Chattering保护硬件设备。信号处理 脉冲噪声抑制 通过deque 和persistence_count 实现简单的数字滤波。工业协议 执行器互锁 确保喷淋最短运行时间防止水泵电机烧毁。系统设计 IIoT 架构 模拟了从 Edge Node (边缘节点) 到 Actuator (执行器) 的完整链路。七、 总结在这个智能工地粉尘监测系统中我们完成了从“消费级 IoT”到“工业级 IIoT”的思维跨越。1. 工程严谨性不同于前几个项目这里引入了回差控制 (Hysteresis) 的概念。在工业控制中直接用 开启和 关闭是绝对禁止的因为机械振动或信号噪声会导致继电器疯狂跳动烧毁触点。我们通过WARNING 和SAFE 两个不同的阈值解决了这个问题。2. 环境感知加入了风速作为辅助判据这体现了智能仪器中“上下文感知 (Context Awareness)”的重要性——在刮大风时喷水不仅浪费还可能被吹得到处都是毫无意义。3. 模块化价值controller.py 中的逻辑完全独立于硬件。未来如果你把激光粉尘仪换成了更贵的 Beta 射线法仪器只需要改sensors.py核心控制算法无需变动。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

更多文章