这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 通讯及无线技术 » 带有ArduinoNano的SDS011构建空气质量分析仪

共1条 1/1 1 跳转至

带有ArduinoNano的SDS011构建空气质量分析仪

工程师
2022-08-20 23:47:10     打赏

 空气污染是许多城市的主要问题,空气质量指数每天都在恶化。根据世界卫生组织的报告,由于空气中存在的有害颗粒的影响而过早死亡的人比死于车祸的人多。根据环境保护署 (EPA) 的说法,室内空气的毒性可能是室外空气的 2 到 5 倍。因此,我们在这里构建了一个设备,通过测量空气中的 PM2.5 和 PM10 颗粒来监测空气质量。

  我们之前使用 MQ135 气体传感器进行空气质量监测,使用夏普 GP2Y1014AU0F 传感器测量空气中的灰尘密度。这次我们使用 带有 Arduino Nano 的 SDS011 传感器来构建空气质量分析仪。SDS011传感器可以计算空气中PM2.5和PM10颗粒物的浓度。在这里,实时 PM2.5 和 PM 10 值将显示在OLED 显示屏上。

  所需组件

  Arduino纳米

  Nova PM 传感器 SDS011

  0.96‘ SPI OLED显示模块

  跳线

  Nova PM 传感器 SDS011

poYBAGLwxYuAHtMWAASkZ43LViA861.png

  SDS011 传感器是 Nova Fitness 开发的最新空气质量传感器。它利用激光散射原理工作,可以得到空气中0.3~10μm的颗粒浓度。该传感器由小风扇、进气阀、激光二极管和光电二极管组成。空气通过进气口进入,光源(激光)照亮颗粒,散射光通过光电探测器转换为信号。然后对这些信号进行放大处理,得到 PM2.5 和 PM10 的颗粒物浓度。

pYYBAGLwxYWAELDkAABj2XCKAe0367.png

  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(有机发光二极管)是一种自发光技术,通过在两个导体之间放置一系列有机薄膜构成。当向这些薄膜施加电流时会产生明亮的光。OLED 使用与电视相同的技术,但像素比我们的大多数电视少。

poYBAGLwxYGAOKIKAAI1SgYl8_I417.png

  对于这个项目,我们使用单色 7 针 SSD1306 0.96” OLED 显示屏。它可以在三种不同的通信协议上工作:SPI 3 线模式、SPI 四线模式和 I2C 模式。下表对引脚及其功能进行了说明:

poYBAGLwxXyAXNnLAABmqGhaxkw862.png

  通过以下链接了解有关 OLED 及其与不同微控制器接口的更多信息。

  空气质量分析仪电路图

  使用 Arduino 测量 PM2.5 和 PM10 颗粒的电路图非常简单,如下所示。

pYYBAGLwxXiAWinMAAF2AMgWTLg167.png

poYBAGLwxXSAAd4UAAcd-JX6pJI649.png

  SDS011 传感器和 OLED 显示模块均采用 +5V 和 GND 供电。SDS011 的发送器和接收器引脚连接到 Arduino Nano 的 D3 和 D4 引脚。由于 OLED Display 模块使用SPI 通信,我们在 OLED 模块和 Arduino Nano 之间建立了 SPI 通信。连接如下表所示:

pYYBAGLwxXCAa11vAAA5Y9_Dp78442.png

  在性能板上构建电路

  我还焊接了性能板上的所有组件,使其看起来整洁。但你也可以在面包板上制作它们。我做的板子如下。焊接时,请确保不要对电线进行分类。我焊接的性能板如下图所示:

poYBAGLwxWyAQAWsAARTT2OMUXI476.png

  空气质量监测仪代码说明

  该项目的完整代码在文档末尾给出。在这里,我们将解释代码的一些重要部分。

  该代码使用SDS011、Adafruit_GFX和Adafruit_SSD1306 库。这些库可以从 Arduino IDE 中的库管理器下载,也可以从那里安装。为此,打开 Arduino IDE 并转到Sketch 》 Include Library 》 Manage Libraries。现在搜索 SDS011 并安装R. Zschiegner 的 SDS Sensor 库。

pYYBAGLwxWiATNadAAC4TWGRqd4224.png

  同样,安装 Adafruit 的Adafruit GFX和Adafruit SSD1306库。

将库安装到 Arduino IDE 后,通过包含所需的库文件来启动代码。

 

#include 
#include
#include
#include

 

在接下来的几行中,定义两个变量来存储 PM10 和 PM2.5 值。

 

浮动 p10,p25;

 

然后,定义 OLED 的宽度和高度。在这个项目中,我们使用的是128×64 SPI OLED 显示屏。您可以 根据您的显示更改SCREEN_WIDTH 和SCREEN_HEIGHT变量。

 

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

 

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

 

#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13

 

然后,使用之前使用 SPI 通信协议定义的宽度和高度创建一个 Adafruit 显示实例。

 

Adafruit_SSD1306 显示器(SCREEN_WIDTH、SCREEN_HEIGHT、OLED_MOSI、OLED_CLK、OLED_DC、OLED_RESET、OLED_CS);

 

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

 

my_sds.begin(3,4);
序列号.开始(9600);
display.begin(SSD1306_SWITCHCAPVCC);

 

在void loop() 中,从 SDS011 传感器读取 PM10 和 PM2.5 值,并在串行监视器上打印读数。

 

无效循环(){
 错误 = my_sds.read(&p25,&p10);
 如果(!错误){
   Serial.println("P2.5:"+String(p25));
   Serial.println("P10:"+String(p10));

 

之后,使用setTextSize()和setTextColor()设置文本大小和文本颜色。

 

display.setTextSize(2);
display.setTextColor(白色);

 

然后在下一行中,使用 setCursor(x,y)方法定义开始文本的位置。在这里,我们将在 OLED 显示屏上显示 PM2.5 和 PM10 值,因此第一行从 (0,15) 开始,而第二行从 (0, 40) 坐标开始。

 

display.setCursor(0,15);
display.println("PM2.5");
display.setCursor(67,15);
显示.println(p25);
display.setCursor(0,40);
display.println("PM10");
display.setCursor(67,40);
display.println(p10);

 

最后,调用display()方法在 OLED Display 上显示文本。

 

显示.显示();
display.clearDisplay();

 

  Arduino 空气质量监测仪测试

  硬件和代码准备就绪后,就可以测试设备了。为此,将 Arduino 连接到笔记本电脑,选择板和端口,然后点击上传按钮。如下图所示,它将在 OLED 显示屏上显示 PM2.5 和 PM10 值。

pYYBAGLwxWGAUzXfAAVfqhG4SC0085.png

#include
#include
#include
#include
浮动 p10,p25;
内部错误;
SDS011 my_sds;
#define SCREEN_WIDTH 128 // OLED 显示宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED 显示高度,以像素为单位
// 使用软件 SPI 连接的 SSD1306 显示器的声明(默认情况):
#define OLED_MOSI 9
#define OLED_CLK 10
#define OLED_DC 11
#define OLED_CS 12
#define OLED_RESET 13
Adafruit_SSD1306 显示(屏幕宽度,屏幕高度,
OLED_MOSI、OLED_CLK、OLED_DC、OLED_RESET、OLED_CS);
无效设置(){
my_sds.begin(3,4);
序列号.开始(9600);
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
显示.显示();
}
无效循环(){
错误 = my_sds.read(&p25,&p10);
如果(!错误){
Serial.println("P2.5:"+String(p25));
Serial.println("P10:"+String(p10));
display.setTextSize(2);
display.setTextColor(白色);
display.setCursor(0,15);
display.println("PM2.5");
display.setCursor(67,15);
显示.println(p25);
display.setCursor(0,40);
display.println("PM10");
display.setCursor(67,40);
display.println(p10);
显示.显示();
display.clearDisplay();
}
延迟(100);
}




共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]