|
随着冬天的来临,秸秆焚烧、工厂废气以及车辆尾气等产生的烟雾和排放物,弥漫在空气中,遮挡了阳光,使人们难以呼吸。专家说,严重的空气污染加上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
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板的电路图如下:
负载电阻RL在使传感器正常工作中起着非常重要的作用。该电阻器根据气体浓度改变其电阻值。 MQ-7传感器板附带的1KΩ负载电阻是没有起作用,会影响传感器的读数。因此,要测量适当的CO浓度值,必须用10KΩ电阻代替1KΩ电阻。
空气质量指数计算 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。
电路原理图 基于物联网的空气质量监测系统的电路图非常简单,如下所示:
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”。
完成帐户创建过程后,登录到该帐户,然后单击右上角的“View AIO Key’”以获取帐户用户名和AIO密钥。
当您点击“AIO Key”时,将弹出一个窗口,其中包含Adafruit IO AIO密钥和用户名。复制此密钥和用户名,它将在代码中使用。
现在,在获取AIO Key之后,创建一个feed来存储DHT传感器数据。要创建feed,请单击“Feed”。然后单击“Actions”,然后从可用选项中选择“Create a New Feed”。
之后,将打开一个新窗口,您需要在其中输入feed的名称和描述。
然后点击“Create”;您将被重定向到新创建的feed。
对于该项目,我们总共创建了六个feed,分别用于PM10、PM2.5、CO、温度、湿度和AQI值。请按照与上述相同的步骤创建其余的feed。
创建提要之后,现在我们将创建Adafruit IO仪表板功能,以在单个页面上可视化传感器数据。为此,首先创建一个仪表板(Dashboard),然后将所有这些feed添加到该仪表板中。
要创建仪表板,请单击“Dashboard”选项,然后单击“Action”,然后单击“Create a New Dashboard”。
在接下来的窗口中,输入仪表板的名称,然后点击“Create”。
创建仪表板后,现在我们将使用诸如Gauge和Slider之类的Adafruit IO块来可视化数据。要添加块,请点击右上角的“ +”。
然后选择“ Gauge”块。
在下一个窗口中,选择要可视化的feed数据。
在最后一步中,更改块设置以对其进行自定义。
现在,按照与上述相同的过程为其余的feed添加可视化块。最终的Adafruit IO仪表板如下所示:
基于物联网的空气质量指数监测系统的代码说明 代码使用了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 。
同样,安装Adafruit GFX和Adafruit SSD1306库。可以从给定的链接下载Adafruit_MQTT.h和DHT11.h。
将库安装到Arduino IDE之后,在代码中包含所需的库文件。 - #include <SDS011.h>
- #include <SPI.h>
- #include <WiFi.h>
- #include "Adafruit_MQTT.h"
- #include "Adafruit_MQTT_Client.h"
- #include "DHT.h"
- #include <Adafruit_GFX.h>
- #include <Adafruit_SSD1306.h>
复制代码在接下来的几行代码中,定义OLED显示屏的宽度和高度。在本文中,我使用了128×64 SPI OLED显示屏。您可以根据自己的显示更改SCREEN_WIDTH和SCREEN_HEIGHT变量。 - #define SCREEN_WIDTH 128
- #define SCREEN_HEIGHT 64
复制代码然后定义连接OLED显示屏的SPI通信引脚。 - #define OLED_MOSI 23
- #define OLED_CLK 18
- #define OLED_DC 4
- #define OLED_CS 5
- #define OLED_RESET 2
复制代码然后,使用前面定义的宽度和高度以及SPI通信协议为Adafruit显示创建实例。 - Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
- OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
复制代码
然后包括从Adafruit IO服务器复制的WiFi和Adafruit IO凭据。这些将包括MQTT服务器、端口号、用户名和AIO密钥。 - const char *ssid = "Galaxy-M20";
- const char *pass = "ac312124";
- #define MQTT_SERV "io.adafruit.com"
- #define MQTT_PORT 1883
- #define MQTT_NAME "choudharyas"
- #define MQTT_PASS "988c4e045ef64c1b9bc8b5bb7ef5f2d9"
复制代码然后设置Adafruit IO feed以存储传感器数据。本文中定义了六个feed来存储不同的传感器数据,即:空气质量、温度、湿度、PM10、PM25和CO。 - Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS);
- Adafruit_MQTT_Publish AirQuality = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/AirQuality");
- Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/Temperature");
- Adafruit_MQTT_Publish Humidity = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/Humidity");
- Adafruit_MQTT_Publish PM10 = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/PM10");
- Adafruit_MQTT_Publish PM25 = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/PM25");
- Adafruit_MQTT_Publish CO = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME "/f/CO");
复制代码
现在,在setup()函数中,以9600的波特率初始化串口监视器,以进行调试。同时使用begin()函数初始化OLED显示屏、DHT传感器和SDS011传感器。 - void setup()
- {
- my_sds.begin(16,17);
- Serial.begin(9600);
- dht.begin();
- display.begin(SSD1306_SWITCHCAPVCC);
复制代码setup函数内部的for循环用于收集值直至定义的数字,然后将计数器设置为零。 - for (int thisReading1 = 0; thisReading1 < numReadingsPM10; thisReading1++) {
- readingsPM10[thisReading1] = 0;
- }
复制代码
现在,在loop函数中,使用millis()方法每隔一小时读取一次传感器值。每个气体传感器输出一个从0到4095的模拟值。要将该值转换为电压,请使用以下公式:RvRo = MQ7Raw *(3.3 / 4095);其中,MQ7Raw是来自传感器模拟引脚的模拟值。同样,从SDS011传感器读取PM2.5和PM10读数。
- if ((unsigned long)(currentMillis - previousMillis) >= interval) {
- MQ7Raw = analogRead( iMQ7 );
- RvRo = MQ7Raw * (3.3 / 4095);
- MQ7ppm = 3.027*exp(1.0698*( RvRo ));
- Serial.println(MQ7ppm);
- error = my_sds.read(&p25,&p10);
- if (! error) {
- Serial.println("P2.5: "+String(p25));
- Serial.println("P10: "+String(p10));
- }
- }
复制代码
PM2.5和PM10值以µg / m3为单位,但是我们需要将一氧化碳值从PPM转换为mg / m3。转换公式如下: 浓度(mg / m3)=浓度(PPM)×(分子量(g / mol)/摩尔体积(L)) 其中:在25 0C时,CO的分子质量为28.06 g / mol,摩尔容量为24.45L - ConcentrationINmgm3 = MQ7ppm* (28.06/24.45);
- Serial.println(ConcentrationINmgm3);
复制代码
然后在下几行代码中,计算24小时内PM10、PM2.5读数的平均值和8小时内一氧化碳读数的平均值。在代码的第一行中,获取当前的总数并减去数组中的第一个元素,现在将其保存为新的总数。最初,该值为零。然后获取传感器值,并将当前读数添加到总数中,并增加数字索引。如果索引的值等于或大于numReadings,则将索引设置回零。 - totalPM10 = totalPM10 - readingsPM10[readIndexPM10];
- readingsPM10[readIndexPM10] = p10;
- totalPM10 = totalPM10 + readingsPM10[readIndexPM10];
- readIndexPM10 = readIndexPM10 + 1;
- if (readIndexPM10 >= numReadingsPM10) {
- readIndexPM10 = 0;
- }
复制代码最后,在Adafruit IO上发布这些值。 - if (! Temperature.publish(temperature))
- {
- delay(30000);
- }
- if (! Humidity.publish(humidity))
- {
- delay(30000);
- ……………………………………………………….
- ……………………………………………………….
复制代码
测试AQI监控系统 一旦硬件和代码准备就绪,就可以测试设备了。我们使用外部12V 1A适配器为设备供电。该设备将在OLED显示屏上显示PM10、PM2.5和一氧化碳的浓度。 PM2.5和PM10的浓度单位为µg / m3,而一氧化碳的浓度单位为mg / m3。
这些读数还将发布在Adafruit IO仪表板上。所有参数(PM10、PM2.5和CO)的最大值将为AQI。
最近30天的AQI值将显示为图表。
这样便可以使用SDS011和MQ-7传感器计算空气质量指数。希望您喜欢这个项目,如果有任何疑问,请随时在下面进行回复。
|