风筝
发表于: 2020-12-21 11:53:11 | 显示全部楼层

随着冬天的来临,秸秆焚烧、工厂废气以及车辆尾气等产生的烟雾和排放物,弥漫在空气中,遮挡了阳光,使人们难以呼吸。专家说,严重的空气污染加上COVID-19大流行可能是危险的混合物,有可能会造成严重后果。实时监测空气质量非常有必要。


因此,在本篇文章中,我们将使用Nova PM SDS011传感器、MQ-7传感器和DHT11传感器制作一个ESP32空气质量监测系统。我们还将使用OLED显示模块显示空气质量值。空气质量指数(AQI)基于八种污染物,即PM10、PM2.5、SO2和NO2、CO、臭氧、NH3和Pb。但是,没有必要测量所有污染物。因此,我们将测量PM2.5、PM10和一氧化碳的浓度来计算空气质量指数。 AQI值将发布在Adafruit IO网站上,以便我们可以从任何地方对其进行监测。


所需的组件

●    ESP32开发板

●    Nova PM传感器SDS011

●    0.96英寸SPI OLED显示模块

●    DHT11传感器

●    MQ-7传感器

●    跳线


Nova PM Sensor SDS011,用于测量PM2.5和PM10

Nova-PM-Sensor.jpg

SDS011传感器是Nova Fitness开发的最新空气质量传感器。它根据激光散射原理工作,可以测量空气中浓度在0.3至10μm之间的粒子。该传感器由一个小风扇、进气阀、激光二极管和光电二极管组成。空气通过进气口进入,激光照亮粒子,并且散射光被光电探测器转换为信号。然后将这些信号放大并进行处理,以获得PM2.5和PM10的颗粒浓度。


0.96英寸OLED显示模块

OLED是一种发光二极管,它是使用有机化合物制成的,当电流流过时,有机化合物会被点亮。这些有机化合物本身带光,因此不需要像普通LCD那样的背光电路。由于这个特性,OLED显示技术具有高能效,并广泛用于电视和其他显示产品中。


根据显示器的颜色、引脚数、尺寸和控制器IC,市场上可以使用各种类型的OLED。在本文中,我们将使用单色7针SSD1306 0.96英寸OLED模块,该模块的宽度为128像素,长度为64像素。该OLED支持SPI协议,控制器IC SSD1306可帮助OLED显示接收到的字符。


MQ-7传感器

MQ-7是一氧化碳气体传感器模块,可检测空气中的CO浓度。传感器可测量10至10,000 ppm的浓度。 MQ-7传感器既可以作为模块购买,也可以单独购买。MQ-7板的电路图如下:

MQ7-Circuit-Diagram.png


负载电阻RL在使传感器正常工作中起着非常重要的作用。该电阻器根据气体浓度改变其电阻值。 MQ-7传感器板附带的1KΩ负载电阻是没有起作用,会影响传感器的读数。因此,要测量适当的CO浓度值,必须用10KΩ电阻代替1KΩ电阻。

MQ-7-Sensor.jpg


空气质量指数计算

AQI是根据在标准时间间隔(大多数污染物为24小时,一氧化碳和臭氧为8小时)内测得的特定污染物的平均浓度计算得出的。例如,PM2.5和PM10的AQI基于24小时平均浓度,而一氧化碳的AQI基于8小时平均浓度。 AQI计算包括八种污染物,分别是PM10、PM2.5、二氧化氮(NO2)、二氧化硫(SO2)、一氧化碳(CO)、地表臭氧(O3)、氨(NH3)和铅(Pb) )。但是,并非在每个位置都测量所有污染物。


根据测得的污染物的24小时环境浓度,计算出一个子指数,该子指数是浓度的线性函数(例如,PM2.5的子指数在浓度为31 µg / m3时为51,在浓度为100时为100 60 µg / m3,浓度为45 µg / m3的75)。最差的子指数(或所有参数的最大值)确定总体AQI。


电路原理图

基于物联网的空气质量监测系统的电路图非常简单,如下所示:

Air-Quality-Monitoring-System-Circuit-Diagram.png


SDS011传感器、DHT11和MQ-7传感器由+ 5V供电,而OLED显示模块由3.3V供电。 SDS011的发送器和接收器引脚连接到ESP32的GPIO16和17。 MQ-7传感器的模拟输出引脚连接到GPIO 25,而DHT11传感器的数据引脚连接到GPIO27传感器。由于OLED显示模块使用SPI通信,因此我们在OLED模块和ESP32之间建立了SPI通信。


Adafruit IO设置

Adafruit IO是一个开放数据平台,可让您在云上聚合、可视化和分析实时数据。使用Adafruit IO,您可以通过Internet上传、显示和监视数据,并启用IoT项目。您可以使用Adafruit IO通过互联网控制电机、读取传感器数据并创建出色的IoT应用程序。


要使用Adafruit IO,请首先在Adafruit IO上创建一个帐户。为此,请访问Adafruit IO网站,然后点击屏幕右上方的“Get started for Free”。

Adafruit-IO.jpg

完成帐户创建过程后,登录到该帐户,然后单击右上角的“View AIO Key’”以获取帐户用户名和AIO密钥。

Adafruit-IO-AIO-Key.png

当您点击“AIO Key”时,将弹出一个窗口,其中包含Adafruit IO AIO密钥和用户名。复制此密钥和用户名,它将在代码中使用。

AIO-Key.png


现在,在获取AIO Key之后,创建一个feed来存储DHT传感器数据。要创建feed,请单击“Feed”。然后单击“Actions”,然后从可用选项中选择“Create a New Feed”。

Adafruit-IO-Feed.png

之后,将打开一个新窗口,您需要在其中输入feed的名称和描述。

Create-Feed-in-Adafruit-IO.png

然后点击“Create”;您将被重定向到新创建的feed。


对于该项目,我们总共创建了六个feed,分别用于PM10、PM2.5、CO、温度、湿度和AQI值。请按照与上述相同的步骤创建其余的feed。

Adafruit-IO-Feeds.png


创建提要之后,现在我们将创建Adafruit IO仪表板功能,以在单个页面上可视化传感器数据。为此,首先创建一个仪表板(Dashboard),然后将所有这些feed添加到该仪表板中。


要创建仪表板,请单击“Dashboard”选项,然后单击“Action”,然后单击“Create a New Dashboard”。


在接下来的窗口中,输入仪表板的名称,然后点击“Create”。

Adafruit-IO-Dashboard.png


创建仪表板后,现在我们将使用诸如Gauge和Slider之类的Adafruit IO块来可视化数据。要添加块,请点击右上角的“ +”。

Adafruit-IO-Blocks.png

然后选择“ Gauge”块。

Adafruit-Gauge-Block.png


在下一个窗口中,选择要可视化的feed数据。

Air-Quality-Monitoring-using-Adafruit-IO.png

在最后一步中,更改块设置以对其进行自定义。

Adafruit-IO-Block-Setting.png

现在,按照与上述相同的过程为其余的feed添加可视化块。最终的Adafruit IO仪表板如下所示:

Air-Quality-Monitoring-Dashboard.png


基于物联网的空气质量指数监测系统的代码说明

代码使用了SDS011、Adafruit_GFX、Adafruit_SSD1306、Adafruit_MQTT和DHT.h库。可以从Arduino IDE的库管理器中下载SDS011、Adafruit_GFX和Adafruit_SSD1306库,然后进行安装。打开Arduino IDE并转到Sketch <Include Library <Manage Libraries。搜索SDS011并安装由R. Zschiegner提供的SDS Sensor library 。

SDS-Sensor-library-by-R.-Zschiegner.png


同样,安装Adafruit GFX和Adafruit SSD1306库。可以从给定的链接下载Adafruit_MQTT.hDHT11.h


将库安装到Arduino IDE之后,在代码中包含所需的库文件。

  1. #include <SDS011.h>
  2. #include <SPI.h>
  3. #include <WiFi.h>
  4. #include "Adafruit_MQTT.h"
  5. #include "Adafruit_MQTT_Client.h"
  6. #include "DHT.h"
  7. #include <Adafruit_GFX.h>
  8. #include <Adafruit_SSD1306.h>
复制代码

在接下来的几行代码中,定义OLED显示屏的宽度和高度。在本文中,我使用了128×64 SPI OLED显示屏。您可以根据自己的显示更改SCREEN_WIDTH和SCREEN_HEIGHT变量。

  1. #define SCREEN_WIDTH 128
  2. #define SCREEN_HEIGHT 64
复制代码

然后定义连接OLED显示屏的SPI通信引脚。

  1. #define OLED_MOSI  23
  2. #define OLED_CLK   18
  3. #define OLED_DC    4
  4. #define OLED_CS    5
  5. #define OLED_RESET 2
复制代码

然后,使用前面定义的宽度和高度以及SPI通信协议为Adafruit显示创建实例。

  1. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  2.   OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
复制代码

然后包括从Adafruit IO服务器复制的WiFi和Adafruit IO凭据。这些将包括MQTT服务器、端口号、用户名和AIO密钥。

  1. const char *ssid =  "Galaxy-M20";   
  2. const char *pass =  "ac312124";
  3. #define MQTT_SERV "io.adafruit.com"
  4. #define MQTT_PORT 1883
  5. #define MQTT_NAME "choudharyas"
  6. #define MQTT_PASS "988c4e045ef64c1b9bc8b5bb7ef5f2d9"
复制代码

然后设置Adafruit IO feed以存储传感器数据。本文中定义了六个feed来存储不同的传感器数据,即:空气质量、温度、湿度、PM10、PM25和CO。

  1. Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS);
  2. Adafruit_MQTT_Publish AirQuality = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/AirQuality");
  3. Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/Temperature");
  4. Adafruit_MQTT_Publish Humidity = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/Humidity");
  5. Adafruit_MQTT_Publish PM10 = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/PM10");
  6. Adafruit_MQTT_Publish PM25 = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/PM25");
  7. Adafruit_MQTT_Publish CO = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/CO");
复制代码

现在,在setup()函数中,以9600的波特率初始化串口监视器,以进行调试。同时使用begin()函数初始化OLED显示屏、DHT传感器和SDS011传感器。

  1. void setup()
  2. {     
  3.        my_sds.begin(16,17);
  4.        Serial.begin(9600);
  5.        dht.begin();
  6.        display.begin(SSD1306_SWITCHCAPVCC);
复制代码

setup函数内部的for循环用于收集值直至定义的数字,然后将计数器设置为零。

  1. for (int thisReading1 = 0; thisReading1 < numReadingsPM10; thisReading1++) {
  2.         readingsPM10[thisReading1] = 0;
  3.       }
复制代码

现在,在loop函数中,使用millis()方法每隔一小时读取一次传感器值。每个气体传感器输出一个从0到4095的模拟值。要将该值转换为电压,请使用以下公式:RvRo = MQ7Raw *(3.3 / 4095);其中,MQ7Raw是来自传感器模拟引脚的模拟值。同样,从SDS011传感器读取PM2.5和PM10读数。

  1. if ((unsigned long)(currentMillis - previousMillis) >= interval) {
  2. MQ7Raw = analogRead( iMQ7 );
  3. RvRo = MQ7Raw * (3.3 / 4095);
  4. MQ7ppm = 3.027*exp(1.0698*( RvRo ));
  5. Serial.println(MQ7ppm);
  6. error = my_sds.read(&p25,&p10);
  7.      if (! error) {
  8.      Serial.println("P2.5: "+String(p25));
  9.      Serial.println("P10:  "+String(p10));
  10.      }
  11.            }
复制代码

PM2.5和PM10值以µg / m3为单位,但是我们需要将一氧化碳值从PPM转换为mg / m3。转换公式如下:

浓度(mg / m3)=浓度(PPM)×(分子量(g / mol)/摩尔体积(L))

其中:在25 0C时,CO的分子质量为28.06 g / mol,摩尔容量为24.45L

  1. ConcentrationINmgm3 = MQ7ppm* (28.06/24.45);
  2. Serial.println(ConcentrationINmgm3);
复制代码

然后在下几行代码中,计算24小时内PM10、PM2.5读数的平均值和8小时内一氧化碳读数的平均值。在代码的第一行中,获取当前的总数并减去数组中的第一个元素,现在将其保存为新的总数。最初,该值为零。然后获取传感器值,并将当前读数添加到总数中,并增加数字索引。如果索引的值等于或大于numReadings,则将索引设置回零。

  1.     totalPM10 = totalPM10 - readingsPM10[readIndexPM10];
  2.      readingsPM10[readIndexPM10] = p10;
  3.      totalPM10 = totalPM10 + readingsPM10[readIndexPM10];
  4.      readIndexPM10 = readIndexPM10 + 1;
  5.      if (readIndexPM10 >= numReadingsPM10) {
  6.       readIndexPM10 = 0;
  7.      }
复制代码

最后,在Adafruit IO上发布这些值。

  1. if (! Temperature.publish(temperature))
  2.        {                    
  3.          delay(30000);  
  4.           }   
  5.      if (! Humidity.publish(humidity))
  6.        {                    
  7.          delay(30000);  
  8. ……………………………………………………….
  9. ……………………………………………………….
复制代码

测试AQI监控系统

一旦硬件和代码准备就绪,就可以测试设备了。我们使用外部12V 1A适配器为设备供电。该设备将在OLED显示屏上显示PM10、PM2.5和一氧化碳的浓度。 PM2.5和PM10的浓度单位为µg / m3,而一氧化碳的浓度单位为mg / m3。

AQI-Monitoring-System.jpg


这些读数还将发布在Adafruit IO仪表板上。所有参数(PM10、PM2.5和CO)的最大值将为AQI。

Air-Quality-Index-Monitoring-Dashboard.png

最近30天的AQI值将显示为图表。

Air-Quality-Index-Monitoring.png


这样便可以使用SDS011和MQ-7传感器计算空气质量指数。希望您喜欢这个项目,如果有任何疑问,请随时在下面进行回复。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-3-29 06:50 , Processed in 0.141255 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表