亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于树莓派 4 的低成本物联网空气质量监测器

发布时间:2021-08-20
分享到:

基于树莓派 4 的低成本物联网空气质量监测器

发布时间:2021-08-20
分享到:

如今,空气污染是全世界的一个大问题,在本文中,我们将探讨如何开发基于 Raspberry Pi 的低成本自制空气质量监测器。如果您有兴趣了解更多关于空气质量的信息,请访问“世界空气质量指数”项目

需要零件:

  • 树莓派 4
  • 1SDS011 - 高精度激光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
  • 功耗(睡眠模式激光器和风扇):< 4mA
  • 储存温度:-20 至 +60C
  • 工作温度:-10 至 +50C
  • 湿度(储存):最大 90%
  • 湿度(工作):最大 70%
  • 准确度:0.3μm 为 70%,0.5μm 为 98%
  • 尺寸:71x70x23 毫米
  • 认证:CE、FCC、RoHS

SD011 使用 PCB 作为外壳的一侧,从而降低其成本。接收二极管安装在 PCB 侧(这是强制性的,因为应避免二极管和 LNA 之间的任何噪声)。发射器激光器安装在塑料盒上,并通过软线连接到 PCB。

总之,Nova Fitness SDS011 是一款专业的激光粉尘传感器。安装在传感器上的风扇会自动吸入空气。该传感器使用激光散射原理*来测量悬浮在空气中的灰尘颗粒的值。该传感器提供 PM2.5 和 PM10 值的高精度和可靠读数。几乎可以立即观察到环境中的任何变化,响应时间不到 10 秒。标准模式下的传感器以 1 秒的间隔报告读数。

第 3 步:但是 SDS011 如何捕获这些颗粒?

如前所述,SDS011 使用的原理是光散射或更好的动态光散射 (DLS),这是一种物理学技术,可用于确定悬浮液中的小颗粒或溶液中聚合物的尺寸分布曲线。在 DLS 的范围内,通常通过强度或光子自相关函数(也称为光子相关光谱或准弹性光散射)来分析时间波动。在时域分析中,自相关函数 (ACF) 通常从零延迟时间开始衰减,并且由于较小的粒子导致更快的动力学导致散射强度轨迹的更快去相关。已经表明,强度 ACF 是功率谱的傅立叶变换。

二极管上捕获的电信号进入低噪声放大器,然后通过 ADC 转换为数字信号,并通过 UART 传输到外部。

要通过真实的科学经验了解更多关于 SDS011 的信息,请查看 Konstantinos 等人 2018 年的工作,开发和现场测试用于监测 PM2.5 浓度的低成本便携式系统

第 4 步:展示成果

让我们暂时抛开所有这些理论,专注于如何使用 Raspberry Pi 和 SDS011 传感器测量颗粒物

硬件连接实际上非常简单。该传感器与 USB 适配器一起出售,以将其 7 针 UART 的输出数据与 RPi 的标准 USB 连接器之一连接起来。

SDS011 引脚排列:

Pin 1 — not connected
Pin 2 — PM2.5: 0–999μg/m³; PWM output
Pin 3–5V
Pin 4 — PM10: 0–999 μg/m³; PWM output
Pin 5 — GND
Pin 6 — RX UART (TTL) 3.3V
Pin 7 — TX UART (TTL) 3.3V

在本教程中,我使用全新的 Raspberry-Pi 4。当然,任何以前的型号也可以正常工作。

传感器和 RPi 之间的通信将通过串行协议进行。可在此处找到有关此协议的详细信息:激光粉尘传感器控制协议 V1.3。但是对于这个项目,最好是使用python接口来简化需要开发的代码。您可以创建自己的界面或使用互联网上可用的界面,如 Frank Heuer 或 Ivan Kalchev 的界面。我们将使用最后一个,它非常简单且运行良好。

文件 sds011.py 必须位于您创建脚本的同一目录中。

在开发阶段,我使用 Jupyter Notebook,您可以使用任何您喜欢的 IDE(例如,作为 Raspberry Pi Debian 包的一部分的 Thonny 或 Geany 都非常好)。

开始导入 sds011,并创建您的传感器实例。SDS011 提供了一种使用 UART 从传感器读取数据的方法。

第 5 步:空气质量指数——AQI

AQI 是报告每日空气质量的指标。它会告诉您空气的清洁程度或污染程度,以及您可能担心的相关健康影响。AQI 侧重于您在呼吸受污染的空气后几小时或几天内可能会经历的健康影响。

例如,EPA(美国环境保护署)不仅计算颗粒污染(PM2.5 和 PM10)的 AQI,还计算清洁空气法案规定的其他主要空气污染物:地面臭氧、一氧化碳、二氧化硫和二氧化氮。对于这些污染物中的每一种,EPA 都制定了国家空气质量标准来保护公众健康。请参阅上图,其中包含相关的 AQI 值、颜色和健康信息。

如前所述,这些 AQI 值和颜色与每种污染物有关,但如何将传感器生成的值与它们相关联?一个附加表将它们全部连接起来,如上所示。

但是当然,使用这样的表是没有意义的。最后,它是一个简单的数学算法进行计算。为此,我们将导入库以在 AQI 值和污染物浓度 (µg/m³) 之间进行转换:python-aqi
使用 PIP 安装库并进行测试(见上面的代码)

第 6 步:在本地记录数据

在这一点上,我们拥有从传感器捕获数据并将它们转换为更具“可读性”的所有工具,即 AQI 指数。

让我们创建一个函数来捕获这些值。我们将依次捕获 3 个值,取其中的平均值:

def get_data(n=3): 
    sensor.sleep(sleep=False) 
    pmt_2_5 = 0 pmt_10 = 0 
    time.sleep 
    (10) 
    for i in range (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) 
    return pmt_2_5, pmt_10

上面可以看到测试结果。我们也做一个函数来转换AQI指数中PM的数值:

def conv_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) 
    , return aqi_10

在两个函数的测试结果之上。但是怎么处理它们呢?最简单的答案是创建一个函数来保存捕获的数据,将它们保存在本地文件中:

def save_log(): 
    with open("YOUR PATH HERE/air_quality.csv", "a") as log: 
    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 和 MQTT API 存储和检索事物中的数据。ThingSpeak 支持创建传感器记录应用程序、位置跟踪应用程序以及具有状态更新的社交网络。”
首先,您必须在 ThinkSpeak.com 上拥有一个帐户。接下来,按照说明创建通道,记下其通道 ID 和写入 API 密钥。

创建频道时,您还必须定义将上传到 8 个字段中的每一个的信息,如上所示(在我们的示例中,将只使用其中的 4 个)。

第 8 步:MQTT 协议和 ThingSpeak 连接

MQTT 是一种发布/订阅架构,主要开发用于通过无线网络连接带宽和功率受限的设备。它是运行在 TCP/IP 套接字或 WebSockets 上的简单轻量级协议。WebSocket 上的 MQTT 可以使用 SSL 进行保护。发布/订阅架构允许将消息推送到客户端设备,而无需设备持续轮询服务器。

MQTT 代理是通信的中心点,它负责在发送方和合法接收方之间分发所有消息。客户端是连接到代理并可以发布或订阅主题以访问信息的任何设备。主题包含代理的路由信息​​。每个想要发送消息的客户端将消息发布到某个主题,每个想要接收消息的客户端订阅某个主题。代理将具有匹配主题的所有消息传递给适当的客户端。

ThingSpeak™ 在 URL mqtt.thingspeak.com 和端口 1883 上有一个 MQTT 代理。 ThingSpeak 代理支持 MQTT 发布和 MQTT 订阅。

在我们的例子中,我们将使用 MQTT 发布。 

第 9 步:MQTT 发布

首先,让我们安装 Eclipse Paho MQTT Python 客户端库,它实现了 MQTT 协议的 3.1 和 3.1.1 版

sudo pip install paho-mqtt

import paho.mqtt.publish as publish

channelID = "YOUR CHANNEL ID"
apiKey = "YOUR WRITE KEY"
topic = "channels/" + channelID + "/publish/" + apiKey
mqttHost = "mqtt.thingspeak.com"

tPayload = "field1=" + str(pmt_2_5)+ "&field2=" + str(aqi_2_5)+ "&field3=" + str(pmt_10)+ "&field4=" + str(aqi_10)

# Sending all data to ThingSpeak every 1 minute
while(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] Failure in sending data") 
    time.sleep(60)

如果一切正常,您必须在thingspeak.com 上看到您的频道上也出现数据,如上所示。

第 10 步:最终脚本

需要指出的是,Jupyter Notebook 是一个非常好的开发和报告工具,但不是创建代码以投入生产的工具。您现在应该做的是获取代码的相关部分并创建一个 .py 脚本并在您的终端上运行它。

例如,“ts_air_quality_logger.py”,您应该使用以下命令运行:

这个脚本以及 Jupyter Notebook 和 sds011.py 可以在我的存储库中找到RPi_Air_Quality_Sensor。
请注意,此脚本仅适用于测试。最好不要在最终循环中使用延迟(将代码置于“暂停”状态),而是使用计时器。或者对于真正的应用程序,最好不要使用循环,让 Linux 编程为使用crontab定期执行脚本。

第 11 步:将显示器带到室外

我的 Raspberry Pi 空气质量监测器开始工作后,我将 RPi 组装在一个塑料盒中,将传感器放在外面,然后放在我家外面。

做了两次实验。

第 12 步:汽油发动机燃烧

传感器被放置在距离 Lambretta 的煤气灶大约 1m 的地方,并且它的电机开启。电机运行了几分钟,然后关闭了。从上面的日志文件,我得到的结果。有趣的是确认 PM2.5 是由电机产生的最危险的颗粒物。

第 13 步:木材燃烧

我意识到传感器数据瞬间“超出范围”并且没有被 AQI 转换库很好地捕获,因此我更改了之前的代码来处理它:

def conv_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))
        return aqi_2_5, aqi_10
    except:
        return 600, 600

您应该使用移动平均线来真正获得 AQI(至少每小时一次,但通常每天一次)。

第 14 步:结论

有关详细信息和最终代码,请访问我的 GitHub 存储库:RPi_Air_Quality_Sensor

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论