如今,空气污染是全世界的一个大问题,在本文中,我们将探讨如何开发基于RaspberryPi的低成本自制空气质量监测器。如果您有兴趣了解更多关于空气质量的信息,请访问“世界空气质量指数”项目。需要零件:树莓派41SDS011-高精度激光pm2.5空气质量检测传感器塑料盒子第1步:微粒物质(PM):它是什么?它是如何进入空气的PM代表颗粒物(也称为颗粒污染):空气中固体颗粒和液滴混合物的术语。一些颗粒,如灰尘、污垢、煤烟或烟雾,大到足以用肉眼看到。其他的太小了,只能用电子显微镜检测到。颗粒有多种尺寸。直径小于或等于10微米的颗粒非常小,可以进入肺部,可能导致严重的健康问题。十微米比一根人类头发的宽度还小。颗粒污染包括粗尘颗粒(PM10):可吸入颗粒,直径通常为10微米或更小。来源包括破碎或研磨作业以及道路上车辆扬起的灰尘。细颗粒物(PM2.5):细小的可吸入颗粒物,直径通常为2.5微米或更小。所有类型的燃烧都会产生细颗粒,包括机动车辆、发电厂、住宅木材燃烧、森林火灾、农业燃烧和一些工业过程。第2步:粒子传感器—SDS011空气质量监测是众所周知的成熟科学,始于80年代。当时,技术相当有限,用于量化空气污染的解决方案复杂、繁琐且非常昂贵。幸运的是,如今,借助最新的现代技术,用于空气质量监测的解决方案不仅变得更加精确,而且测量速度也变得更快。设备变得越来越小,成本也比以往任何时候都低得多。在本文中,我们将重点介绍粒子传感器,它可以检测空气中的灰尘量。虽然第一代只能检测不透明度,但最新的传感器,如来自济南大学(山东)的INOVAFIT的SDS011,现在可以检测PM2.5和PM10。就其尺寸而言,SDS011可能是精度和价格(低于40.00美元)方面最好的传感器之一。规格测量值:PM2.5、PM10范围:0–999.9μg/m³电源电压:5V(4.7–5.3V)功耗(工作):70mA±10mA功耗(睡眠模式激光器和风扇):储存温度:-20至+60C工作温度:-10至+50C湿度(储存):最大90%湿度(工作):最大70%准确度:0.3μm为70%,0.5μm为98%尺寸:71x70x23毫米认证:CE、FCC、RoHSSD011使用PCB作为外壳的一侧,从而降低其成本。接收二极管安装在PCB侧(这是强制性的,因为应避免二极管和LNA之间的任何噪声)。发射器激光器安装在塑料盒上,并通过软线连接到PCB。总之,NovaFitnessSDS011是一款专业的激光粉尘传感器。安装在传感器上的风扇会自动吸入空气。该传感器使用激光散射原理*来测量悬浮在空气中的灰尘颗粒的值。该传感器提供PM2.5和PM10值的高精度和可靠读数。几乎可以立即观察到环境中的任何变化,响应时间不到10秒。标准模式下的传感器以1秒的间隔报告读数。第3步:但是SDS011如何捕获这些颗粒?如前所述,SDS011使用的原理是光散射或更好的动态光散射(DLS),这是一种物理学技术,可用于确定悬浮液中的小颗粒或溶液中聚合物的尺寸分布曲线。在DLS的范围内,通常通过强度或光子自相关函数(也称为光子相关光谱或准弹性光散射)来分析时间波动。在时域分析中,自相关函数(ACF)通常从零延迟时间开始衰减,并且由于较小的粒子导致更快的动力学导致散射强度轨迹的更快去相关。已经表明,强度ACF是功率谱的傅立叶变换。二极管上捕获的电信号进入低噪声放大器,然后通过ADC转换为数字信号,并通过UART传输到外部。要通过真实的科学经验了解更多关于SDS011的信息,请查看Konstantinos等人2018年的工作,开发和现场测试用于监测PM2.5浓度的低成本便携式系统。第4步:展示成果让我们暂时抛开所有这些理论,专注于如何使用RaspberryPi和SDS011传感器测量颗粒物硬件连接实际上非常简单。该传感器与USB适配器一起出售,以将其7针UART的输出数据与RPi的标准USB连接器之一连接起来。SDS011引脚排列:Pin1—notconnectedPin2—PM2.5:0–999μg/m³;PWMoutputPin3–5VPin4—PM10:0–999μg/m³;PWMoutputPin5—GNDPin6—RXUART(TTL)3.3VPin7—TXUART(TTL)3.3V在本教程中,我使用全新的Raspberry-Pi4。当然,任何以前的型号也可以正常工作。传感器和RPi之间的通信将通过串行协议进行。可在此处找到有关此协议的详细信息:激光粉尘传感器控制协议V1.3。但是对于这个项目,最好是使用python接口来简化需要开发的代码。您可以创建自己的界面或使用互联网上可用的界面,如FrankHeuer或IvanKalchev的界面。我们将使用最后一个,它非常简单且运行良好。文件sds011.py必须位于您创建脚本的同一目录中。在开发阶段,我使用JupyterNotebook,您可以使用任何您喜欢的IDE(例如,作为RaspberryPiDebian包的一部分的Thonny或Geany都非常好)。开始导入sds011,并创建您的传感器实例。SDS011提供了一种使用UART从传感器读取数据的方法。第5步:空气质量指数——AQIAQI是报告每日空气质量的指标。它会告诉您空气的清洁程度或污染程度,以及您可能担心的相关健康影响。AQI侧重于您在呼吸受污染的空气后几小时或几天内可能会经历的健康影响。例如,EPA(美国环境保护署)不仅计算颗粒污染(PM2.5和PM10)的AQI,还计算清洁空气法案规定的其他主要空气污染物:地面臭氧、一氧化碳、二氧化硫和二氧化氮。对于这些污染物中的每一种,EPA都制定了国家空气质量标准来保护公众健康。请参阅上图,其中包含相关的AQI值、颜色和健康信息。如前所述,这些AQI值和颜色与每种污染物有关,但如何将传感器生成的值与它们相关联?一个附加表将它们全部连接起来,如上所示。但是当然,使用这样的表是没有意义的。最后,它是一个简单的数学算法进行计算。为此,我们将导入库以在AQI值和污染物浓度(µg/m³)之间进行转换:python-aqi。使用PIP安装库并进行测试(见上面的代码)第6步:在本地记录数据在这一点上,我们拥有从传感器捕获数据并将它们转换为更具“可读性”的所有工具,即AQI指数。让我们创建一个函数来捕获这些值。我们将依次捕获3个值,取其中的平均值:defget_data(n=3):sensor.sleep(sleep=False)pmt_2_5=0pmt_10=0time.sleep(10)foriinrange(n):x=sensor.query()pmt_2_5=pmt_2_5+x[0]pmt_10=pmt_10+x[1]time.sleep(2)pmt_2_5=round(pmt_2_5/n,1)pmt_10=round(pmt_10/n,1)sensor.sleep(sleep=True)time.sleep(2)returnpmt_2_5,pmt_10上面可以看到测试结果。我们也做一个函数来转换AQI指数中PM的数值:defconv_aqi(pmt_2_5,pmt_10):aqi_2_5=aqi.to_iaqi(aqi.POLLUTANT_PM25,str(pmt_2_5))aqi_10=aqi.to_iaqi(aqi.POLLUTANT_PM10,str(pmt_12_5),returnaqi_10在两个函数的测试结果之上。但是怎么处理它们呢?最简单的答案是创建一个函数来保存捕获的数据,将它们保存在本地文件中:defsave_log():withopen("YOURPATHHERE/air_quality.csv","a")aslog:dt=datetime.now()log.write("{},{},{},{},{}\n".format(dt,pmt_2_5,aqi_2_5,pmt_10,aqi_10))log.close()使用单个循环,您可以在本地文件中定期记录数据,例如,每分钟:while(True):pmt_2_5,pmt_10=get_data()aqi_2_5,aqi_10=conv_aqi(pmt_2_5,pmt_10)try:save_log()except:print("[INFO]记录数据失败")time.sleep(60)每60秒,时间戳加上数据将“附加”到这个文件中,正如我们在上面看到的。第7步:将数据发送到云服务我们已经学习了如何从传感器捕获数据,并将它们保存在本地CSV文件中。现在,是时候看看如何将这些数据发送到物联网平台了。在本教程中,我们将使用ThingSpeak.com。“ThingSpeak是一个开源物联网(IoT)应用程序,可使用REST和MQTTAPI存储和检索事物中的数据。ThingSpeak支持创建传感器记录应用程序、位置跟踪应用程序以及具有状态更新的社交网络。”首先,您必须在ThinkSpeak.com上拥有一个帐户。接下来,按照说明创建通道,记下其通道ID和写入API密钥。创建频道时,您还必须定义将上传到8个字段中的每一个的信息,如上所示(在我们的示例中,将只使用其中的4个)。第8步:MQTT协议和ThingSpeak连接MQTT是一种发布/订阅架构,主要开发用于通过无线网络连接带宽和功率受限的设备。它是运行在TCP/IP套接字或WebSockets上的简单轻量级协议。WebSocket上的MQTT可以使用SSL进行保护。发布/订阅架构允许将消息推送到客户端设备,而无需设备持续轮询服务器。MQTT代理是通信的中心点,它负责在发送方和合法接收方之间分发所有消息。客户端是连接到代理并可以发布或订阅主题以访问信息的任何设备。主题包含代理的路由信息。每个想要发送消息的客户端将消息发布到某个主题,每个想要接收消息的客户端订阅某个主题。代理将具有匹配主题的所有消息传递给适当的客户端。ThingSpeak™在URLmqtt.thingspeak.com和端口1883上有一个MQTT代理。ThingSpeak代理支持MQTT发布和MQTT订阅。在我们的例子中,我们将使用MQTT发布。第9步:MQTT发布首先,让我们安装EclipsePahoMQTTPython客户端库,它实现了MQTT协议的3.1和3.1.1版sudopipinstallpaho-mqttimportpaho.mqtt.publishaspublishchannelID="YOURCHANNELID"apiKey="YOURWRITEKEY"topic="channels/"+channelID+"/publish/"+apiKeymqttHost="mqtt.thingspeak.com"tPayload="field1="+str(pmt_2_5)+"&field2="+str(aqi_2_5)+"&field3="+str(pmt_10)+"&field4="+str(aqi_10)#SendingalldatatoThingSpeakevery1minutewhile(True):pmt_2_5,pmt_10=get_data()aqi_2_5,aqi_10=conv_aqi(pmt_2_5,pmt_10)tPayload="field1="+str(pmt_2_5)+"&field2="+str(aqi_2_5)+"&field3="+str(pmt_10)+"&field4="+str(aqi_10)try:publish.single(topic,payload=tPayload,hostname=mqttHost,port=tPort,tls=tTLS,transport=tTransport)save_log()except:print("[INFO]Failureinsendingdata")time.sleep(60)如果一切正常,您必须在thingspeak.com上看到您的频道上也出现数据,如上所示。第10步:最终脚本需要指出的是,JupyterNotebook是一个非常好的开发和报告工具,但不是创建代码以投入生产的工具。您现在应该做的是获取代码的相关部分并创建一个.py脚本并在您的终端上运行它。例如,“ts_air_quality_logger.py”,您应该使用以下命令运行:这个脚本以及JupyterNotebook和sds011.py可以在我的存储库中找到RPi_Air_Quality_Sensor。请注意,此脚本仅适用于测试。最好不要在最终循环中使用延迟(将代码置于“暂停”状态),而是使用计时器。或者对于真正的应用程序,最好不要使用循环,让Linux编程为使用crontab定期执行脚本。第11步:将显示器带到室外我的RaspberryPi空气质量监测器开始工作后,我将RPi组装在一个塑料盒中,将传感器放在外面,然后放在我家外面。做了两次实验。第12步:汽油发动机燃烧传感器被放置在距离Lambretta的煤气灶大约1m的地方,并且它的电机开启。电机运行了几分钟,然后关闭了。从上面的日志文件,我得到的结果。有趣的是确认PM2.5是由电机产生的最危险的颗粒物。第13步:木材燃烧我意识到传感器数据瞬间“超出范围”并且没有被AQI转换库很好地捕获,因此我更改了之前的代码来处理它:defconv_aqi(pmt_2_5,pmt_10):try:aqi_2_5=aqi.to_iaqi(aqi.POLLUTANT_PM25,str(pmt_2_5))aqi_10=aqi.to_iaqi(aqi.POLLUTANT_PM10,str(pmt_10))returnaqi_2_5,aqi_10except:return600,600您应该使用移动平均线来真正获得AQI(至少每小时一次,但通常每天一次)。第14步:结论有关详细信息和最终代码,请访问我的GitHub存储库:RPi_Air_Quality_Sensor。