- 所需组件
- Nova PM Sensor SDS011,用于测量PM2.5和PM10
- 0.96英寸OLED显示模块的基础
- 准备MQ-7传感器以测量一氧化碳(CO)
- 空气质量指数计算
- 电路原理图
- 在性能板上建立空气质量监测系统电路
- Adafruit IO设置
- 的代码说明
- 用于AQI监控系统的3D打印套管
- 测试AQI监控系统
随着冬天的来临,燃烧的田野,工厂和车辆通行时,散落在我们身上的空气中弥漫着浓烟和废气,遮挡了阳光,使人难以呼吸。专家说,高水平的空气污染和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上,以便我们可以从任何地方对其进行监视。以前,我们还使用Arduino测量了LPG,烟雾和氨气的浓度。
所需组件
- 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的颗粒浓度。我们之前使用Nova PM Sensor和Arduino来计算PM10和PM2.5的浓度。
SDS011传感器规格:
- 输出:PM2.5,PM10
- 测量范围:0.0-999.9μg/ m3
- 输入电压:4.7V至5.3V
- 最大电流:100mA
- 休眠电流:2mA
- 响应时间:1秒
- 串行数据输出频率:1次/秒
- 粒径分辨率≤0.3μm
- 相对误差:10%
- 温度范围:-20〜50°C
0.96英寸OLED显示模块的基础
OLED(有机发光二极管)是一种发光二极管,它是使用有机化合物制成的,当电流流过时,有机化合物会激发它们。这些有机化合物具有自己的光,因此不需要像普通LCD那样的任何背光电路。由于这个原因,OLED显示技术具有高能效,并广泛用于电视和其他显示产品中。
根据显示器的颜色,引脚数,尺寸和控制器IC,市场上可以使用各种类型的OLED。在本教程中,我们将使用单色蓝色7针SSD1306 0.96英寸OLED模块,该模块的宽度为128像素,长度为64像素。该7引脚OLED支持SPI协议,控制器IC SSD1306可帮助OLED显示接收到的字符。通过以下链接了解有关OLED及其与不同微控制器接口的更多信息。
准备MQ-7传感器以测量一氧化碳(CO)
MQ-7 CO一氧化碳气体传感器模块可检测空气中的CO浓度。传感器可测量10至10,000 ppm的浓度。 MQ-7传感器既可以作为模块购买,也可以单独购买。以前,我们使用过许多不同类型的气体传感器来检测和测量各种气体,如果您有兴趣,也可以检查一下。在该项目中,我们使用MQ-7传感器模块测量PPM中的一氧化碳浓度。 MQ-7板的电路图如下:
负载电阻RL在使传感器正常工作中起着非常重要的作用。该电阻器根据气体浓度改变其电阻值。MQ-7传感器板附带的1KΩ负载电阻是无用的,会影响传感器的读数。因此,要测量适当的CO浓度值,必须用10KΩ电阻代替1KΩ电阻。
空气质量指数计算
印度的AQI是根据在标准时间间隔(大多数污染物为24小时,一氧化碳和臭氧为8小时)内测得的特定污染物的平均浓度计算得出的。例如,PM2.5和PM10的AQI基于24小时平均浓度,一氧化碳的AQI基于8小时平均浓度。 AQI计算包括八种污染物,分别是PM10,PM2.5,二氧化氮(NO 2),二氧化硫(SO 2),一氧化碳(CO),地面臭氧(O 3),氨(NH 3),和铅(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通信。下表中显示了连接:
序号 |
OLED模块引脚 |
ESP32针 |
1个 |
地线 |
地面 |
2 |
VCC |
5伏 |
3 |
D0 |
18岁 |
4 |
D1 |
23 |
5 |
RES |
2 |
6 |
直流电 |
4 |
7 |
CS |
5 |
序号 |
SDS011针 |
ESP32针 |
1个 |
5伏 |
5伏 |
2 |
地线 |
地线 |
3 |
接收 |
17 |
4 |
德克萨斯州 |
16 |
序号 |
DHT引脚 |
ESP32针 |
1个 |
Vcc |
5伏 |
2 |
地线 |
地线 |
3 |
数据 |
27 |
序号 |
MQ-7销 |
ESP32针 |
1个 |
Vcc |
5伏 |
2 |
地线 |
地线 |
3 |
A0 |
25 |
在性能板上建立空气质量监测系统电路
从主图像可以看出,该想法是在3D打印外壳中使用此电路。因此,将上面显示的完整电路焊接到一块穿孔板上。确保使用电线留出足够的距离以安装OLED和传感器。我的穿孔板焊接到了OLED,传感器模块如下所示。
Adafruit IO设置
Adafruit IO是一个开放数据平台,可让您在云上聚合,可视化和分析实时数据。使用Adafruit IO,您可以通过Internet上传,显示和监视数据,并启用IoT项目。您可以使用Adafruit IO通过互联网控制电机,读取传感器数据并创建出色的IoT应用程序。
要使用Adafruit IO,请首先在Adafruit IO上创建一个帐户。为此,请访问Adafruit IO网站,然后点击屏幕右上方的“免费入门”。
完成帐户创建过程后,登录到帐户,然后单击右上角的“查看AIO密钥”以获取帐户用户名和AIO密钥。
当您单击“ AIO密钥”时,将弹出一个窗口,其中包含Adafruit IO AIO密钥和用户名。复制此密钥和用户名,它将在代码中使用。
现在,在获取AIO键之后,创建一个供稿来存储DHT传感器数据。要创建供稿,请点击“供稿”。然后点击“操作”,然后从可用选项中选择“创建新的供稿”。
之后,将打开一个新窗口,您需要在其中输入提要的名称和描述。编写描述是可选的。
然后点击“创建”;您将被重定向到新创建的提要。
在此项目中,我们针对PM10,PM2.5,CO,温度,湿度和AQI值总共创建了六个供稿。请按照与上述相同的步骤创建其余的提要。
创建提要之后,现在我们将创建Adafruit IO仪表板功能,以在单个页面上可视化传感器数据。为此,首先创建一个仪表板,然后将所有这些提要添加到该仪表板中。
要创建仪表盘,请单击“仪表盘”选项,然后单击“操作”,然后单击“创建新仪表盘”。
在下一个窗口中,输入仪表板的名称,然后单击“创建”。
创建仪表板后,现在我们将使用诸如Gauge和Slider之类的Adafruit IO块来可视化数据。要添加块,请单击右上角的“ +”。
然后选择“ Gauge”块。
在下一个窗口中,选择要可视化的提要数据。
在最后一步中,更改块设置以对其进行自定义。
现在,按照与上述相同的过程为其余的提要添加可视化块。我的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传感器库。
同样,通过Adafruit安装Adafruit GFX和Adafruit SSD1306库。可以从给定的链接下载Adafruit_MQTT.h和DHT11.h。
将库安装到Arduino IDE之后,通过包含所需的库文件来启动代码。
#包括
在接下来的几行中,定义OLED显示器的宽度和高度。在此项目中,我使用了128×64 SPI OLED显示器。您可以根据自己的显示更改 SCREEN_WIDTH 和 SCREEN_HEIGHT 变量。
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
然后定义连接OLED Display的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显示屏(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提要以存储传感器数据。就我而言,我定义了六个供稿来存储不同的传感器数据,即:空气质量,温度,湿度,PM10,PM25和CO。
Adafruit_MQTT_Client mqtt(&client,MQTT_SERV,MQTT_PORT,MQTT_NAME,MQTT_PASS); Adafruit_MQTT_Publish空气质量= Adafruit_MQTT_Publish(&mqtt,MQTT_NAME“ / f / AirQuality”); Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt,MQTT_NAME“ / f / Temperature”); Adafruit_MQTT_Publish湿度= 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);
在 for循环 内 设置 功能用于收集值高达规定数量,然后将计数器设置为零。
for(int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++){readingsPM10 = 0; }
读取传感器值:
现在,在循环函数中,使用 millis() 方法每隔一小时读取一次传感器值。每个气体传感器输出一个从0到4095的模拟值。要将这个值转换为电压,请使用以下公式: RvRo = MQ7Raw *(3.3 / 4095); 其中, MQ7Raw 是来自传感器模拟引脚的模拟值。同样,从SDS011传感器读取PM2.5和PM10读数。
如果((无符号长] [currentMillis-previousMillis)> =间隔){MQ7Raw = AnalogRead(iMQ7); RvRo = MQ7Raw *(3.3 / 4095); MQ7ppm = 3.027 * exp(1.0698 *(RvRo)); Serial.println(MQ7ppm); 错误= my_sds.read(&p25,&p10); 如果(!错误){Serial.println(“ P2.5:” + String(p25)); Serial.println(“ P10:” + String(p10)); }}
转换值:
PM2.5和PM10值已经以µg / m 3为单位,但是我们需要将一氧化碳值从PPM转换为mg / m 3。转换公式如下:
浓度(mg / m 3)=浓度(PPM)×(分子量(g / mol)/摩尔体积(L))
其中:在25 0 C时,CO的分子质量为28.06 g / mol,摩尔容量为24.45L
浓度INmgm3 = MQ7ppm *(28.06 / 24.45); Serial.println(ConcentrationINmgm3);
计算24小时平均值:
然后在下几行中,计算PM10,PM2.5读数的24小时平均值和一氧化碳读数的8小时平均值。在代码的第一行中,获取当前的总数并减去数组中的第一个元素,现在将其保存为新的总数。最初,它将为零。然后获取传感器值,并将当前读数添加到总数中,并增加数字索引。如果索引的值等于或大于numReadings,则将索引设置回零。
totalPM10 = totalPM10-读数PM10; 读数PM10 = p10; totalPM10 = totalPM10 +读数PM10; readIndexPM10 = readIndexPM10 +1; 如果(readIndexPM10> = numReadingsPM10){readIndexPM10 = 0; }
然后,最后在Adafruit IO上发布这些值。
if(!Temperature.publish(temperature)){delay(30000); } if(!Humidity.publish(湿度)){delay(30000); ……………………………………………………。……………………………………………………。
用于AQI监控系统的3D打印套管
接下来,我使用游标卡尺测量了安装尺寸,还测量了传感器和OLED的尺寸以设计外壳。完成后,我的设计如下所示。
对设计满意之后,我将其导出为STL文件,根据打印机设置对其进行了切片,最后进行了打印。同样,也可以从Thingiverse下载STL文件,您可以使用它打印外壳。
打印完成后,我将在永久性外壳中设置的项目进行组装,以将其安装在设施中。完成完整的连接后,我将电路组装到了机壳中,如您在此处所见,一切都非常合适。
测试AQI监控系统
一旦硬件和代码准备就绪,就可以测试设备了。我们使用外部12V 1A适配器为设备供电。如您所见,该设备将在OLED显示屏上显示PM10,PM2.5和一氧化碳的浓度。PM2.5和PM10的浓度为µg / m 3,而一氧化碳的浓度为mg / m 3。
这些读物也将发布在Adafruit IO仪表板上。所有参数(PM10,PM2.5和CO)的最大值将为AQI。
最近30天的AQI值将显示为图表。
这样便可以使用SDS011和MQ-7传感器计算空气质量指数。您也可以在下面的视频中找到该项目的完整工作。希望您喜欢这个项目,并发现构建自己的项目很有趣。如果您有任何疑问,请留在下面的评论部分。