Arduino空气质量监测仪

简介

随着科技的进步,人们对生活品质的追求越来越高。健康生活作为最基础的部分,越来越受到人们关注。雾霾,PM2.5,这是近几年来最热的几个关于空气质量的话题。能够实时地检测身边的空气质量成为了现代人们一种非常迫切的需求。 DFRobot新出空气质量监测仪,兼容Arduino,STM32等设备,可测量PM10、PM2.5、PM1.0数值,同时温湿度传感器,可实时监测室内空气质量和环境温湿度。其中颗粒(PM 10 & PM 2.5&PM1.0)浓度使用激光散射原理,能够连续采集并计算单位体积内空气中不同大小的悬浮颗粒物数目,即颗粒物浓度分布,可以通过该数值换算成质量浓度。同时传感器内嵌入了一个温/湿度一体检测芯片,能够精确的检测出温度值和湿度值。该传感器把颗粒物浓度数值、温度、湿度监测功能合并,利用UART接口输出相关数据帧。传感器能够嵌入各种与空气质量监测和环境空气改善相关的仪器设备,为其提供及时准确的环境参数。

技术规格

安装注意事项

引脚说明

引脚图

标号 名称 功能描述
PIN1 VCC 电源正(+5V)
PIN2 GND 电源负
PIN3 SET 设置管脚 /TTL电平@3.3V,高电平或悬空为正常工作状态,低电平为休眠状态
PIN4 RXD 串口接收管脚/TTL电平@3.3V
PIN5 TXD 串口发送管脚/TTL电平@3.3V
PIN6 RESET 模块复位信号/TTL电平@3.3V,低复位
PIN7 NC
PIN8 NC

使用教程

本教程会提供两个样例代码,意在提供一个简单的方法去读取PM2.5、温湿度数值。

准备

样例代码——Arduino Leonardo

/*!
 * @file  SEN0233.ino
 * @brief Air Quality Monitor (PM 2.5, HCHO, Temperature & Humidity)
 * @n Get the module here: https://www.dfrobot.com.cn/goods-1422.html
 * @n This example is to detect formaldehyde, PM2.5, temperature and humidity in the environment.
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license  The MIT License (MIT)
 * @author  [lijun](ju.li@dfrobot.com)
 * @version  V1.0
 * @date  2017-04-21
 */

char col;
unsigned int PMSa1 = 0, PMSa2_5 = 0, PMSa10 = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb1 = 0, PMSb2_5 = 0, PMSb10 = 0, FMHDSb = 0, TPSb = 0, HDSb = 0;
unsigned int PMS1 = 0,PMS2_5 = 0,PMS10 = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0;
unsigned char bufferRTT[32] = {}; //串口接收数据
char tempStr[15];

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(115200);

  //选择串口(Serial1,Serial2,Serial3)
  Serial1.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  while (!Serial1.available());
  while (Serial1.available() > 0) //检测是否有串口数据
  {
    for (int i = 0; i < 32; i++)
    {
      col = Serial1.read();
      bufferRTT[i] = (char)col;
      delay(2);
    }

    Serial1.flush();

    CR1 = (bufferRTT[30] << 8) + bufferRTT[31];
    CR2 = 0;
    for (int i = 0; i < 30; i++)
      CR2 += bufferRTT[i];
    if (CR1 == CR2)               //校验
    {
      PMSa1 = bufferRTT[10];      //读取PM1高八位数据
      PMSb1 = bufferRTT[11];      //读取PM1低八位数据
      PMS1 = (PMSa1 << 8) + PMSb1;   //PM1数据

      PMSa2_5 = bufferRTT[12];      //读取PM2.5高八位数据
      PMSb2_5 = bufferRTT[13];      //读取PM2.5低八位数据
      PMS2_5 = (PMSa2_5 << 8) + PMSb2_5;   //PM2.5数据

      PMSa10 = bufferRTT[14];      //读取PM10高八位数据
      PMSb10 = bufferRTT[15];      //读取PM10低八位数据
      PMS10 = (PMSa10 << 8) + PMSb10;   //PM10数据

      TPSa = bufferRTT[24];      //读取温度高八位数据
      TPSb = bufferRTT[25];      //读取温度低八位数据
      TPS = (TPSa << 8) + TPSb;   //温度数据

      HDSa = bufferRTT[26];      //读取湿度高八位数据
      HDSb = bufferRTT[27];      //读取湿度低八位数据
      HDS = (HDSa << 8) + HDSb;   //湿度数据
    }
    else
    {
      PMS1 = 0;
      PMS2_5 = 0;
      PMS10 = 0;
      TPS = 0;
      HDS = 0;
    }
  }

  Serial.println("-----------------------uart--------------------------");
  Serial.print("Temp : ");
  sprintf(tempStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10);
  Serial.print(tempStr);
  Serial.println(" C");              //显示温度
  Serial.print("RH   : ");
  sprintf(tempStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10);
  Serial.print(tempStr);            //显示湿度
  Serial.println(" %");               //%
  Serial.print("PM1.0: ");
  Serial.print(PMS1);
  Serial.println(" ug/m3"); //显示PM1.0 单位  ug/m³ 毫克每立方米
  Serial.print("PM2.5: ");
  Serial.print(PMS2_5);
  Serial.println(" ug/m3"); //显示PM2.5 单位  ug/m³ 毫克每立方米
  Serial.print("PM 10: ");
  Serial.print(PMS10);
  Serial.println(" ug/m3"); //显示PM 10 单位  ug/m³ 毫克每立方米

}

样例代码——Arduino UNO (软串口)

连接线路:

PM2.5 Sensor Adapter UNO
VCC 5v
GND GND
TX 10
RX 11
/*!
 * @file  SEN0233.ino
 * @brief Air Quality Monitor (PM 2.5, HCHO, Temperature & Humidity)
 * @n Get the module here: https://www.dfrobot.com.cn/goods-1422.html
 * @n This example is to detect formaldehyde, PM2.5, temperature and humidity in the environment.
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license  The MIT License (MIT)
 * @author  [lijun](ju.li@dfrobot.com)
 * @version  V1.0
 * @date  2017-03-01
 */

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
char col;
unsigned int PMSa1 = 0, PMSa2_5 = 0, PMSa10 = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb1 = 0, PMSb2_5 = 0, PMSb10 = 0, FMHDSb = 0, TPSb = 0, HDSb = 0;
unsigned int PMS1 = 0,PMS2_5 = 0,PMS10 = 0, FMHDS = 0, TPS = 0, HDS = 0, CR1 = 0, CR2 = 0;
unsigned char bufferRTT[32] = {}; //串口接收数据
char tempStr[15];
void setup()
{
  Serial.begin(115200);
  mySerial.begin(9600);

}

void loop()
{

  while (!mySerial.available());
  while (mySerial.available() > 0) //检测是否有串口数据
  {
    for (int i = 0; i < 32; i++)
    {
      col = mySerial.read();
      bufferRTT[i] = (char)col;
      delay(2);
    }

    mySerial.flush();

    CR1 = (bufferRTT[30] << 8) + bufferRTT[31];
    CR2 = 0;
    for (int i = 0; i < 30; i++)
      CR2 += bufferRTT[i];
    if (CR1 == CR2)               //校验
    {
      PMSa1 = bufferRTT[10];      //读取PM1高八位数据
      PMSb1 = bufferRTT[11];      //读取PM1低八位数据
      PMS1 = (PMSa1 << 8) + PMSb1;   //PM1数据

      PMSa2_5 = bufferRTT[12];      //读取PM2.5高八位数据
      PMSb2_5 = bufferRTT[13];      //读取PM2.5低八位数据
      PMS2_5 = (PMSa2_5 << 8) + PMSb2_5;   //PM2.5数据

      PMSa10 = bufferRTT[14];      //读取PM10高八位数据
      PMSb10 = bufferRTT[15];      //读取PM10低八位数据
      PMS10 = (PMSa10 << 8) + PMSb10;   //PM10数据

      TPSa = bufferRTT[24];      //读取温度高八位数据
      TPSb = bufferRTT[25];      //读取温度低八位数据
      TPS = (TPSa << 8) + TPSb;   //温度数据

      HDSa = bufferRTT[26];      //读取湿度高八位数据
      HDSb = bufferRTT[27];      //读取湿度低八位数据
      HDS = (HDSa << 8) + HDSb;   //湿度数据
    }
    else
    {
      PMS1 = 0;
      PMS2_5 = 0;
      PMS10 = 0;
      TPS = 0;
      HDS = 0;
    }
  }

  Serial.println("-----------------------uart--------------------------");
  Serial.print("Temp : ");
  sprintf(tempStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10);
  Serial.print(tempStr);
  Serial.println(" C");              //显示温度
  Serial.print("RH   : ");
  sprintf(tempStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10);
  Serial.print(tempStr);            //显示湿度
  Serial.println(" %");               //%
  Serial.print("PM1.0: ");
  Serial.print(PMS1);
  Serial.println(" ug/m3"); //显示PM1.0 单位  ug/m³ 毫克每立方米
  Serial.print("PM2.5: ");
  Serial.print(PMS2_5);
  Serial.println(" ug/m3"); //显示PM2.5 单位  ug/m³ 毫克每立方米
  Serial.print("PM 10: ");
  Serial.print(PMS10);
  Serial.println(" ug/m3"); //显示PM 10 单位  ug/m³ 毫克每立方米
}

运行结果示意图:
运行结果

Mind+图形化编程(arduino uno软串口)

  1. 下载及安装软件。下载地址:https://www.mindplus.cc
  2. 切换到“上传模式”。
  3. “扩展”中选择“主控板”中的“Arduino Uno”,选择"功能模块"中的"软串口"。
  4. 进行编程,程序如下图:
  5. 程序上传完毕后,点击打开串口即可看到数据输出。

项目程序文件下载点击下载

典型应用案例

准备

接线图

电路连接图

样例代码

/*!
 * @file  SEN0233.ino
 * @brief Air Quality Monitor (PM 2.5, HCHO, Temperature & Humidity)
 * @n Get the module here: https://www.dfrobot.com.cn/goods-1422.html
 * @n This example is to detect formaldehyde, PM2.5, temperature and humidity in the environment.
 * @copyright  Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license  The MIT License (MIT)
 * @author  [lijun](ju.li@dfrobot.com)
 * @version  V1.0
 * @date  2017-07-28
 */

#include <Wire.h>
#include <SoftwareSerial.h>
#include "DFRobot_RGBLCD1602.h"

char col;
unsigned int PMSa = 0, FMHDSa = 0, TPSa = 0, HDSa = 0, PMSb = 0, FMHDSb = 0, TPSb = 0,
             HDSb = 0, PMS = 0, TPS = 0,  HDS = 0, CR1 = 0, CR2 = 0, FMHDS = 0;
unsigned char bufferRTT[32] = {}; //串口接收数据
char tempStr[15];

SoftwareSerial mySerial(10, 11); // RX, TX
/*
Change the RGBaddr value based on the hardware version
-----------------------------------------
       Moudule        | Version| RGBAddr|
-----------------------------------------
  LCD1602 Module      |  V1.0  | 0x60   |
-----------------------------------------
  LCD1602 Module      |  V1.1  | 0x6B   |
-----------------------------------------
  LCD1602 RGB Module  |  V1.0  | 0x60   |
-----------------------------------------
  LCD1602 RGB Module  |  V1.1  | 0x2D   |
-----------------------------------------
*/
DFRobot_RGBLCD1602 lcd(/*RGBAddr*/0x60 ,/*lcdCols*/16,/*lcdRows*/2);  //16 characters and 2 lines of show

void setup()
{
  Serial.begin(115200);
  mySerial.begin(9600);
  lcd.init();//初始化LCD1602 RGB屏
  lcd.setRGB(0, 255, 0); //设置屏的初始背光颜色
  lcd.setCursor(0, 0 ); //设置从(0,0)开始显示
  lcd.print("T:");//显示T:
  lcd.setCursor(9, 0 );
  lcd.print("H:");
  lcd.setCursor(0, 1 );
  lcd.print("PM2.5:");
  lcd.setCursor(9, 1 );
  lcd.print("ug/m3");
}

void loop()
{
  while (mySerial.available() > 0) //检测是否有串口数据
  {
    for (int i = 0; i < 32; i++) //读取串口数据
    {
      col = mySerial.read();
      bufferRTT[i] = (char)col;
      delay(2);
    }

    mySerial.flush();
    CR1 = (bufferRTT[30] << 8) + bufferRTT[31];
    CR2 = 0;
    for (int i = 0; i < 30; i++)
      CR2 += bufferRTT[i];
    if (CR1 == CR2)               //校验
    {
      PMSa = bufferRTT[12];      //读取PM2.5高八位数据
      PMSb = bufferRTT[13];      //读取PM2.5低八位数据
      PMS = (PMSa << 8) + PMSb;   //PM2.5数据
      TPSa = bufferRTT[24];      //读取温度高八位数据
      TPSb = bufferRTT[25];      //读取温度低八位数据
      TPS = (TPSa << 8) + TPSb;   //温度数据
      HDSa = bufferRTT[26];      //读取湿度高八位数据
      HDSb = bufferRTT[27];      //读取湿度低八位数据
      HDS = (HDSa << 8) + HDSb;   //湿度数据
    }
    else
    {
      PMS = 0;
      FMHDS = 0;
      TPS = 0;
      HDS = 0;
    }
  }
  lcd.setCursor(2, 0 );
  sprintf(tempStr, "%d%d.%d", TPS / 100, (TPS / 10) % 10, TPS % 10); //显示温度
  lcd.print(tempStr);
  lcd.write(0xdf);              //显示°
  lcd.print('C');               //显示C
  lcd.setCursor(11, 0 );
  sprintf(tempStr, "%d%d.%d", HDS / 100, (HDS / 10) % 10, HDS % 10); //显示湿度
  lcd.print(tempStr);
  lcd.print('%');               //显示%
  lcd.setCursor(6, 1 );
  sprintf(tempStr, "%d%d%d", PMS / 100, (PMS / 10) % 10, PMS % 10); //显示PM2.5个、十、百位单位ug/m³ 微克每立方米
  lcd.print(tempStr);
}

结果

显示屏上显示当前检测出来的温度(T)、湿度(H)、PM2.5浓度 (PM2.5) 空气检测

常见问题

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

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

更多

DFshopping_car1.png DFRobot商城购买链接