Gravity: PM2.5空气质量传感器

简介

随着科技的进步,人们对生活品质的追求越来越高了。空气作为生活中最基础的部分,是越来越受人们的关注,比如最常见PM2.5,PM1.0,PM10等空气中的颗粒物。所以能够实时检测身边的空气质量是多么幸福的一件事啊。根据这一需求,DFRobot推出了一款可以测量PM2.5,PM1.0,PM10等颗粒物的空气质量传感器,它采用了简单易用的Gravity接口,能兼容大部分的主控器,配上我们的样例代码,可快速搭建出自己的空气质量检测站。典型的使用场景:吸烟室、厨房、温泉、浴室等环境。

PM2.5空气质量传感器采用的是一款基于激光散射原理的数字式通用颗粒物传感器,可连续采集并计算单位体积内空气中不同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而换算成为质量浓度,并利用I2C接口输出相关数据。本传感器可嵌入各种与空气中悬浮颗粒物浓度相关的仪器仪表或环境改善设备,为其提供及时准确的浓度数据。

工作原理介绍: 本传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射,同时在某一特定角度收集散射光,得到散射光强度随时间变化的曲线。进而微处理器基于米氏(MIE)理论的算法,得出颗粒物的等效粒径及单位体积内不同粒径的颗粒物数量。传感器的各功能部分框图如图 1 所示。

主要特性

技术规格

注意事项

安装注意事项

  1. 金属外壳与内部电源地导通,注意不要和其他外部板组电路或机箱外壳短接。
  2. 进风口和出风口所在的平面紧贴用户机内壁与外界连通的气孔为最佳安装方式,如无法实现,则出风口周围 2cm 之内无遮挡。进风口和出风口之间应有结构使气流隔离,避免气流在用户机内部从出风口直接回流到进风口。
  3. 用户机内壁为进风口所开的通气孔不应小于进风口的尺寸。
  4. 应用于净化器类产品时,尽量避免将传感器直接置于净化器自身风道中,如果无法避免,应单独设置一个独立的结构空间,将传感器置于其中,使其与净化器自身风道隔离。
  5. 应用与净化器或固定检测设备时,传感器位置应高于地面 20cm 以上。否则有可能被近地面的大尘埃颗粒甚至絮状物污染导致风扇缠绕阻转。
  6. 传感器应用于户外固定设备时,对于沙尘暴、雨雪等天气以及杨柳絮等的防护,应由设备完成。
  7. 传感器是应该整体元件,用户切勿将其拆解,包括金属屏蔽壳,以防出现不可逆破坏。
  8. 传感器可用 M3 自攻螺钉固定。

其他注意事项

  1. 本传感器数据确保出厂个体之间的一致性,不以第三方检测仪器或数据作为对比标准,如用户希望最终测量结果和某第三方检测设备一致,可由用户根据实际采集结果进行数据拟合。
  2. 本传感器适用于普通室内环境。如用户设备在以下实际环境中使用,则应在传感器外加相应防护措施,否则可能因过度积尘、积油、进水导致数据一致性下降:
    i. 全年尘埃浓度大于 300 微克/立方米时间超过 50%,或大于 500 微克/立方米
    时间超过 20%,如吸烟室
    ii. 油烟环境,如厨房
    iii. 高水雾环境,如温泉、浴室
    iv. 户外

PM2.5空气质量国际标准表

国家/组织 年平均浓度
(μg/m³)
24h平均浓度
(μg/m³)
WHO准则值 10 25
WHO过渡期目标1 35 75
WHO过渡期目标2 25 50
WHO过渡期目标3 15 37.5
澳大利亚 8 25
美国 15 35
日本 15 35
欧盟 25
中国 35 75

空气污染指数(AQI)与PM1.0,PM2.5污染物浓度值对应表

AQI指数 空气质量等级 24小时PM1.0平均浓度
(μg/m³)
24小时PM2.5平均浓度
(μg/m³)
0~50 0~50 0~35
51~100 50~150 36~75
101~150 轻度污染 151~250 76~115
151~200 中度污染 251~350 116~150
201~300 重度污染 351~420 151~250
>300 严重污染 421~500 251~350

引脚说明

序号 丝印 功能描述
1 VCC/+ 电源正极
2 GND/- 电源负极
3 SCL/C I2C时钟线
4 SDA/D I2C数据线

Arduino使用教程

产品使用的是Gravity标准I2C接口,使用起来比较简单,按接线图所示将传感器与uno(或其它主板)相连接。

准备

关于如何安装库文件,点击链接


/*!
 *  @brief 获取指定颗粒物类型的浓度
 *  @param type:PARTICLE_PM1_0_STANDARD  标准颗粒物下PM1.0的颗粒物浓度
                      PARTICLE_PM2_5_STANDARD  标准颗粒物下PM2.5的颗粒物浓度
                      PARTICLE_PM10_STANDARD   标准颗粒物下PM10的颗粒物浓度
                      PARTICLE_PM1_0_ATMOSPHERE 大气环境下PM1.0的颗粒物浓度
                      PARTICLE_PM2_5_ATMOSPHERE 大气环境下PM2.5的颗粒物浓度
                      PARTICLE_PM10_ATMOSPHERE  大气环境下PM10的颗粒物浓度
 *  @return 浓度(ug/m3)
 */
    uint16_t gainParticleConcentration_ugm3(uint8_t type);
/*!
 *  @brief 获取在0.1升空气中的颗粒物的个数
 *  @param type:PARTICLENUM_0_3_UM_EVERY0_1L_AIR
                      PARTICLENUM_0_5_UM_EVERY0_1L_AIR
                      PARTICLENUM_1_0_UM_EVERY0_1L_AIR
                      PARTICLENUM_2_5_UM_EVERY0_1L_AIR
                      PARTICLENUM_5_0_UM_EVERY0_1L_AIR
                      PARTICLENUM_10_UM_EVERY0_1L_AIR 
 *  @return 个数
 */
    uint16_t gainParticleNum_Every0_1L(uint8_t type);

/*!
 *  @brief 向传感器的指定寄存器写入数据
 *  @param NULL
 *  @return 没有返回值
 */
    uint8_t gainVersion();

样例代码 - 标准颗粒物浓度

功能描述: 获取PM2.5,PM1.0,PM10的标准颗粒物浓度。

#include "DFRobot_AirQualitySensor.h"

#define I2C_ADDRESS    0x19
  DFRobot_AirQualitySensor particle(&Wire ,I2C_ADDRESS);

void setup() {
  Serial.begin(115200);
/**
  传感器初始化,用作初始化IIC,由此时使用的通信方式来决定
*/
  while(!particle.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("sensor begin success!");
  delay(1000);
/**
  获取传感器版本号
*/
  uint8_t version = particle.gainVersion();
  Serial.print("version is : ");
  Serial.println(version);
  delay(1000);
}

void loop() {
/**
 *@brief : 获取PM1.0  PM2.5  PM10浓度
 *@param :PARTICLE_PM1_0_STANDARD  标准颗粒物  
          PARTICLE_PM2_5_STANDARD  标准颗粒物  
          PARTICLE_PM10_STANDARD   标准颗粒物  
          PARTICLE_PM1_0_ATMOSPHERE  大气环境下
          PARTICLE_PM2_5_ATMOSPHERE  大气环境下
          PARTICLE_PM10_ATMOSPHERE   大气环境下
*/  
  uint16_t PM2_5 = particle.gainParticleConcentration_ugm3(PARTICLE_PM2_5_STANDARD);
  uint16_t PM1_0 = particle.gainParticleConcentration_ugm3(PARTICLE_PM1_0_STANDARD);
  uint16_t PM10 = particle.gainParticleConcentration_ugm3(PARTICLE_PM10_STANDARD);
  Serial.print("PM2.5 concentration:");
  Serial.print(PM2_5);
  Serial.println(" ug/m3");
  Serial.print("PM1.0 concentration:");
  Serial.print(PM1_0);
  Serial.println(" ug/m3");
  Serial.print("PM10 concentration:");
  Serial.print(PM10);
  Serial.println(" ug/m3");
  Serial.println();
  delay(1000);
}

结果

标准颗粒物的状态下,读取到的PM2.5,PM1.0,PM10的浓度为:45ug/m3,31ug/m3,49ug/m3.

样例代码 - 大气环境下的颗粒物浓度

功能描述:获取PM2.5,PM1.0,PM10大气环境下的颗粒物浓度。

#include "DFRobot_AirQualitySensor.h"

#define I2C_ADDRESS    0x19
  DFRobot_AirQualitySensor particle(&Wire ,I2C_ADDRESS);

void setup() {
  Serial.begin(115200);
/**
  传感器初始化,用作初始化IIC,由此时使用的通信方式来决定
*/
  while(!particle.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("sensor begin success!");
  delay(1000);
/**
  获取传感器版本号
*/
  uint8_t version = particle.gainVersion();
  Serial.print("version is : ");
  Serial.println(version);
  delay(1000);
}

void loop() {
/**
 *@brief : 获取PM1.0浓度
 *@param :PARTICLE_PM1_0_STANDARD  标准颗粒物  
          PARTICLE_PM2_5_STANDARD  标准颗粒物  
          PARTICLE_PM10_STANDARD   标准颗粒物  
          PARTICLE_PM1_0_ATMOSPHERE  大气环境下
          PARTICLE_PM2_5_ATMOSPHERE  大气环境下
          PARTICLE_PM10_ATMOSPHERE   大气环境下
*/  
  uint16_t PM2_5 = particle.gainParticleConcentration_ugm3(PARTICLE_PM2_5_ATMOSPHERE );
  uint16_t PM1_0 = particle.gainParticleConcentration_ugm3(PARTICLE_PM1_0_ATMOSPHERE );
  uint16_t PM10 = particle.gainParticleConcentration_ugm3(PARTICLE_PM10_ATMOSPHERE);
  Serial.print("PM2.5 concentration:");
  Serial.print(PM2_5);
  Serial.println(" ug/m3");
  Serial.print("PM1.0 concentration:");
  Serial.print(PM1_0);
  Serial.println(" ug/m3");
  Serial.print("PM10 concentration:");
  Serial.print(PM10);
  Serial.println(" ug/m3");
  Serial.println();
  delay(1000);
}

结果

在大气环境下,PM2.5/PM1.0/PM10的颗粒物浓度约为:38ug/m3,23ug/m3,46ug/m3。

样例代码 - 每0.1升空气中的颗粒物个数

功能描述:读取每0.1升空气中0.3um/0.5um/1.0um/2.5um/5.0um/10um以上的颗粒物个数。


#include "DFRobot_AirQualitySensor.h"

#define I2C_ADDRESS    0x19
  DFRobot_AirQualitySensor particle(&Wire ,I2C_ADDRESS);

void setup() {
  Serial.begin(115200);
/**
  传感器初始化,用作初始化IIC,由此时使用的通信方式来决定
*/
  while(!particle.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("sensor begin success!");
  delay(1000);
/**
  获取传感器版本号
*/
  uint8_t version = particle.gainVersion();
  Serial.print("version is : ");
  Serial.println(version);
  delay(1000);
}

void loop() {
/**
 *@brief : 获取每0.1升空气中0.3um/0.5um/1.0um/2.5um/5.0um/10um颗粒物个数
 *@param :PARTICLENUM_0_3_UM_EVERY0_1L_AIR 
          PARTICLENUM_0_5_UM_EVERY0_1L_AIR 
          PARTICLENUM_1_0_UM_EVERY0_1L_AIR 
          PARTICLENUM_2_5_UM_EVERY0_1L_AIR 
          PARTICLENUM_5_0_UM_EVERY0_1L_AIR 
          PARTICLENUM_10_UM_EVERY0_1L_AIR   
*/  
  uint16_t um0_3 = particle.gainParticleNum_Every0_1L(PARTICLENUM_0_3_UM_EVERY0_1L_AIR);
  uint16_t um0_5= particle.gainParticleNum_Every0_1L(PARTICLENUM_0_5_UM_EVERY0_1L_AIR);
  uint16_t um1_0= particle.gainParticleNum_Every0_1L(PARTICLENUM_1_0_UM_EVERY0_1L_AIR);
  uint16_t um2_5= particle.gainParticleNum_Every0_1L(PARTICLENUM_2_5_UM_EVERY0_1L_AIR);
  uint16_t um5_0= particle.gainParticleNum_Every0_1L(PARTICLENUM_5_0_UM_EVERY0_1L_AIR);
  uint16_t um10= particle.gainParticleNum_Every0_1L(PARTICLENUM_10_UM_EVERY0_1L_AIR);
  Serial.print("The number of particles with a diameter of 0.3um per 0.1 in lift-off is: ");
  Serial.println(um0_3);
   Serial.print("The number of particles with a diameter of 0.5um per 0.1 in lift-off is: ");
  Serial.println(um0_5);
   Serial.print("The number of particles with a diameter of 1.0um per 0.1 in lift-off is: ");
  Serial.println(um1_0);
   Serial.print("The number of particles with a diameter of 2.5um per 0.1 in lift-off is: ");
  Serial.println(um2_5);
   Serial.print("The number of particles with a diameter of 5.0um per 0.1 in lift-off is: ");
  Serial.println(um5_0);
    Serial.print("The number of particles with a diameter of 10um per 0.1 in lift-off is: ");
  Serial.println(um10);
  Serial.println("");
  delay(1000);
}

结果

读取到每0.1升空气中0.3um/0.5um/1.0um/2.5um/5.0um/10um颗粒物个数分别约为:1615个,1356个,233个,0个,0个,0个。

样例代码 -自动与手动进入低功耗模式

自动进入低功耗

/*!
 * @file lowPower.ino
 * @brief 周期性打开或者关闭传感器
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author      PengKaixing(kaixing.peng@dfrobot.com)
 * @version  V1.0
 * @date  2021-11-23
 * @url https://github.com/dfrobot/DFRobot_AirQualitySensor
 */
#include "DFRobot_AirQualitySensor.h"
#include "GravityRtc.h"//时钟传感器库
#include "Wire.h"
#define I2C_ADDRESS 0x19

DFRobot_AirQualitySensor particle(&Wire, I2C_ADDRESS);
GravityRtc rtc;//创建对象名称

void setup(){
  Serial.begin(115200);
  //传感器初始化,用作初始化IIC,由此时使用的通信方式来决定
  while (!particle.begin())
  rtc.setup();
  //自动设置RTC时钟:通过获取电脑时间校准RTC模块,首先需要保证电脑时间正确
  rtc.adjustRtc(F(__DATE__), F(__TIME__));

  //手动设置RTC时钟
  //rtc.adjustRtc(2017,6,19,1,12,7,0);  //设置时间:2017/6/19,周一,12点07分0秒
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  //获取传感器版本号
  uint8_t version = particle.gainVersion();
  Serial.print("version is : ");
  Serial.println(version);
  delay(1000);
}
void loop(){
 uint16_t PM2_5 = particle.gainParticleConcentration_ugm3(PARTICLE_PM2_5_ATMOSPHERE );
  Serial.print("PM2.5 concentration:");
  Serial.print(PM2_5);
  Serial.println(" ug/m3");
  rtc.read();
  Serial.print("   Year = ");//年
  Serial.print(rtc.year);
  Serial.print("   Month = ");//月
  Serial.print(rtc.month);
  Serial.print("   Day = ");//日
  Serial.print(rtc.day);
  Serial.print("   Hour = ");//小时
  Serial.print(rtc.hour);
  Serial.print("   Minute = ");//分钟
  Serial.print(rtc.minute);
  Serial.print("   Second = ");//秒
  Serial.println(rtc.second);
  delay(1000);
if ( rtc.hour >= 9 & rtc.hour <= 10 ) {
     particle.awake(); //正常工作
     Serial.print("正常工作");
    }
else {
    particle.setLowpower(); //进入低功耗
    Serial.print("进入低功耗");
     }
 delay(1000);
}

结果

自动:在9与10之间,传感器进入正常工作,其它时候则是进入低功耗状态

手动进入低功耗

/*!
 * @file lowPower.ino
 * @brief 周期性打开或者关闭传感器
 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license     The MIT License (MIT)
 * @author      PengKaixing(kaixing.peng@dfrobot.com)
 * @version  V1.0
 * @date  2021-11-23
 * @url https://github.com/dfrobot/DFRobot_AirQualitySensor
 */
#include "DFRobot_AirQualitySensor.h"

#define I2C_ADDRESS 0x19
DFRobot_AirQualitySensor particle(&Wire, I2C_ADDRESS);
int inputPin = 2;               // 传感器连接引脚2
void setup()
{
  Serial.begin(9600);
  //传感器初始化,用作初始化IIC,由此时使用的通信方式来决定
  while (!particle.begin())
  {
    Serial.println("NO Deivces !");
    delay(1000);
  }
  Serial.println("sensor begin success!");
  delay(1000);

  //获取传感器版本号
  uint8_t version = particle.gainVersion();
  Serial.print("version is : ");
  Serial.println(version);
  delay(1000);

  pinMode(inputPin, INPUT);     // 定义按键引脚为输入引脚
}
void loop()
{
/**
 *@brief : 获取PM1.0浓度
 *@param :PARTICLE_PM1_0_STANDARD  标准颗粒物
          PARTICLE_PM2_5_STANDARD  标准颗粒物
          PARTICLE_PM10_STANDARD   标准颗粒物
          PARTICLE_PM1_0_ATMOSPHERE  大气环境下
          PARTICLE_PM2_5_ATMOSPHERE  大气环境下
          PARTICLE_PM10_ATMOSPHERE   大气环境下
*/
  uint16_t PM2_5 = particle.gainParticleConcentration_ugm3(PARTICLE_PM2_5_ATMOSPHERE );
  Serial.print("PM2.5 concentration:");
  Serial.print(PM2_5);
  Serial.println(" ug/m3");
  int val = digitalRead(inputPin);  //读取输入值
if ( val == HIGH ) {
     particle.awake(); //启动
     Serial.println("正常工作 ");
    }
else {
    particle.setLowpower(); //进入低功耗
    Serial.println("进入低功耗");
     }
 delay(1000);
}

结果

micro:bit使用教程-makecode

产品使用的是Gravity标准I2C接口,使用起来比较简单,按接线图所示将传感器与micro:bit 相连接。

准备

关于如何使用makecode软件?MakeCode在线图形化编程基础操作教程 MakeCode基础操作教程

样例代码 - 标准颗粒物浓度

功能描述: 获取PM2.5,PM1.0,PM10的标准颗粒物浓度。 程序链接:https://makecode.microbit.org/_9HRJ7VTsDaM2

结果

标准颗粒物的状态下,读取到的PM2.5,PM1.0,PM10的浓度为:37ug/m3,26ug/m3,41ug/m3. 串口打印出来的数据如下:

样例代码 - 每0.1升空气中的颗粒物个数

功能描述:读取每0.1升空气中0.3um/1.0um/10um以上的颗粒物个数。 程序链接:https://makecode.microbit.org/_JMxHs15fK29r

结果

读取到每0.1升空气中0.3um/1.0um/10um颗粒物个数分别约为:1115个,160个,0个。

micro:bit使用教程- mind+

功能描述:获取PM2.5,PM1.0,PM10的标准颗粒物浓度。

结果

在程序当中,读取到的传感器的版本号为:16 在标准颗粒物的状态下,读取到的PM2.5,PM1.0,PM10的浓度分别为:74ug/m3,51ug/m3,80ug/m3. 串口打印出来的数据如下:

样例代码- 每0.1升空气中的颗粒物个数

功能描述:读取每0.1升空气中0.3um/1.0um/10um以上的颗粒物个数。

结果

在程序当中,读取到的传感器的版本号为:16 读取到每0.1升空气中0.3um/1.0um/10um颗粒物个数分别约为:2839个,553个,0个。

Mind+ Python模式编程(行空板)

Mind+Python模式为完整Python编程,因此需要能运行完整Python的主控板,此处以行空板为例说明

连接图

操作步骤

1、下载及安装官网最新软件。下载地址:https://www.mindplus.cc 详细教程:Mind+基础wiki教程-软件下载安装

2、切换到“Python模式”。“扩展”中选择“官方库”中的“行空板”和“pinpong库”中的”pinpong初始化“和“空气质量传感器”。切换模式和加载库的详细操作链接

3、进行编程

4、连接行空板,程序点击运行后,可在终端查看数据。行空板官方文档-行空板快速上手教程 (unihiker.com)

代码编程

以pinpong库为例,行空板官方文档-行空板快速上手教程 (unihiker.com)

#  -*- coding: UTF-8 -*-

# MindPlus
# Python
from pinpong.libs.dfrobot_gravity_pm25 import DFRobot_GravityPM25
from pinpong.board import Board
import time


Board().begin()
p_gravitypm25 = DFRobot_GravityPM25()
print(p_gravitypm25.gain_version())

while True:
    print((str("PM2.5:") + str(p_gravitypm25.gain_particle_concentration_ugm3(p_gravitypm25.PARTICLE_PM2_5_STANDARD))))
    print((str("PM1.0:") + str(p_gravitypm25.gain_particle_concentration_ugm3(p_gravitypm25.PARTICLE_PM1_0_STANDARD))))
    print((str("PM10:") + str(p_gravitypm25.gain_particle_concentration_ugm3(p_gravitypm25.PARTICLE_PM10_STANDARD))))
    time.sleep(1)

常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

PMS9103M 颗粒物传感器中文说明书V1.2.pdf

DFshopping_car1.png DFRobot商城购买链接