(SKU:SEN0318)Gravity:CCS811数字空气质量传感器

来自DFRobot Product Wiki
跳转至: 导航搜索


目录

简介

这是一个用于测试eCO2(equivalent CO2)和TVOC(TotalVolatileOrganicCompounds)浓度的传感器,体积小,功耗低,精度高,预热时间短
这个传感器采用Gravity I2C接口,即插即用,连线简单方便
CO2(eCO2)测量浓度范围400-8000ppm(parts per million),TVOC测量范围为0-1100ppb(parts per billion)
这个传感器湿度敏感等级(MSL)为1级,可用于各种潮湿环境环境,并且可以通过输入环境参数校准输出的数据

下面是二氧化碳和TVOC对人体的影响

二氧化碳浓度参考
二氧化碳浓度(ppm) 人体反映
<500 正常
500-1000 感到空气污浊
1000-2500 感到困倦
2500-5000 对健康不利
大于5000 有中毒危险
TVOC浓度参考
TVOC浓度(ppb) 人体反应
<50 正常
50-750 可能会急躁不安和不舒服
750-6000 可能会急躁不安、不舒服和头疼
>6000 头痛和其他神经问题



技术规格

  • 供电电压:3.3 - 5.5 V
  • 睡眠模式:0.7uA
  • 工作温度:-40~85℃
  • 预热时间:<15s
  • 测量范围:400 - 8000ppm(CO2)
  • 分辨率: 1 ppm
  • 湿度敏感等级: 1级


引脚说明

  • 顶部示意图
  • 底部示意图
  • 尺寸图


引脚说明
序号 丝印 功能描述
1 +/VCC 电源正极
2 -/GND 电源负极
3 C/SCL IIC时钟线
4 D/SDA IIC数据线
5 3V3 3.3V电源正极
6 WAKE 模式选择引脚
7 INT 中断引脚
8 RST 复位引脚
9 ADDR_SEL IIC地址选择
  • WAKE=0:睡眠模式 ;WAKE=1: 唤醒状态





使用教程

该产品使用的是Gravity标准IIC接口,使用起来比较简单,按接线图所示将传感器与uno(或其它主板)相连接,
该产品预热时间短,在上电后很短时间就能有准确的读数,在设置环境基线后能够更快的有准确读数(下面会讲基线获取和设置方法)

注意:数据手册建议在第一次使用传感器时,先运行48小时


准备

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

  • API接口函数列表
  /**
   * @功能 初始化芯片
   * @返回 如果初始化成功,则返回0,否则返回非0
   */
  int begin(void);
  
  /**
   * @功能 判断是否可以读取数据
   * @返回 可以读取时为true,否则为false
   */
  bool checkDataReady();

  /**
   * @功能 软件重启,清除所有已配置的寄存器
   */
  void softReset();
  
    /**
   * @功能 设置环境参数 
   * @参数 温度输入温度值,单位:摄氏度,范围(-40-85℃)
   * @参数 湿度输入湿度值,单位:%RH,范围(0-100%RH)
   */
  void setInTemHum(float temperature, float humidity);
  
  /**
   * @功能 设置测量周期
   * @参数 cycle: eClosed      :空闲(在此模式下禁用测量)
   *              eCycle_1s    :每秒进行一次测量
   *              eCycle_10s   :每10秒进行一次测量
   *              eCycle_60s   :每60秒进行一次测量
   *              eCycle_250ms :每250ms进行一次测量
   */
  void setMeasCycle(eCycle_t cycle);
  
  /**
   * @功能 设置测量模式
   * @参数 thresh: 0:禁止报警中断
   *               1:启用报警中断
   * @参数 interrupt: 0:禁止采集中断
   *                  1:启用采集中断
   * @参数 mode: 在枚举 eDRIVE_MODE_t 中
   */
  void setMeasurementMode(uint8_t thresh, uint8_t interrupt, eDRIVE_MODE_t mode);
  
  /**
   * @功能 获取当前配置参数
   * @返回 参数配置代码,需要转换成二进制代码进行分析
   *       第2位: 0:禁止报警中断
   *              1:启用报警中断
   *       第3位: 0:禁止采集中断
   *              1:启用采集中断
   *       第4-6位: 000 空闲(在此模式下禁用测量)
   *                001 每秒进行一次测量
   *                010 每10秒进行一次测量
   *                011 每60秒进行一次测量
   *                100 每250ms进行一次测量
   */
  uint8_t getMeasurementMode();
  
  /**
   * @功能 获取当前的二氧化碳浓度
   * @返回 当前二氧化碳浓度,单位:ppm
   */
  uint16_t  getCO2PPM();

  /**
   * @功能 获取当前的TVOC浓度
   * @返回 返回当前的TVOC浓度,单位:ppb
   */
  uint16_t getTVOCPPB();
  
  /**
   *@功能 获取当前的基线值
   *@返回 当前基线值的十六进制数
   */
  uint16_t readBaseLine();
  
  /**
   *@功能 将基线编值写入寄存器
   *@参数 从getBaseLine.ino获取一个十六进制数
   */
  void writeBaseLine(uint16_t baseLine);
                 


接线图

SEN0318-CONNECT.jpg



样例代码1 - 获取基线

为什么要获取基线?

因为之后你可以写入获取的基线,这样可以让传感器预热后立即显示空气质量,否则在污染空气中启动时需要非常久的时间才有正确读数
数据手册对基线校准的建议:在运行传感器的第一周,建议每24小时保存一个新的基线,运行1周后,可以每1-28天保存一次

特别注意:请放在空气清新的环境中(20分钟以上)获取基线,不同传感器、不同测量周期基线不同

/*!
 * @file getBaseLine.ino
 * @brief Put the module in clear air and work a few minutes, wait for baseline doing not change 
 * @n Experiment phenomenon: get
 *
 * @copyright	Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [LuoYufeng](yufeng.luo@dfrobot.com)
 * @version  V0.1
 * @date  2019-07-19
 * @https://github.com/DFRobot/DFRobot_CCS811
 */
#include "DFRobot_CCS811.h"


/*
 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
 */
//DFRobot_CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
DFRobot_CCS811 sensor;

void setup(void)
{
    Serial.begin(115200);
    /*Wait for the chip to be initialized completely, and then exit*/
    while(sensor.begin() != 0){
        Serial.println("failed to init chip, please check if the chip connection is fine");
        delay(1000);
    }
    /**
     * @brief Set measurement cycle
     * @param cycle:in typedef enum{
     *                  eClosed,      //Idle (Measurements are disabled in this mode)
     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second
     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds
     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds
     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms
     *                  }eCycle_t;
     */
    sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
    if(sensor.checkDataReady() == true){
        /*!
         * @brief Set baseline
         * @return baseline in clear air
         */
        Serial.println(sensor.readBaseLine(), HEX);
        
    } else {
        Serial.println("Data is not ready!");
    }
    //delay cannot be less than measurement cycle
    delay(1000);
}


结果

基线结果.jpg


样例代码2 - 获取数据

将获取到的基线值填入到sensor.writeBaseLine();这个函数中。
上传到UNO后打开串口监视器我们可以的看到CO2和TVOC浓度。

/*!
 * @file readData.ino
 * @brief Read the concentration of carbon dioxide and TVOC
 * @n Experiment phenomenon: read data every 0.5s, and print it out on serial port. 
 *
 * @copyright	Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [LuoYufeng](yufeng.luo@dfrobot.com)
 * @version  V0.1
 * @date  2019-07-19
 * @https://github.com/DFRobot/DFRobot_CCS811
 */
#include "DFRobot_CCS811.h"

/*
 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
 */
//DFRobot_CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
DFRobot_CCS811 sensor;

void setup(void)
{
    Serial.begin(115200);
    /*Wait for the chip to be initialized completely, and then exit*/
    while(sensor.begin() != 0){
        Serial.println("failed to init chip, please check if the chip connection is fine");
        delay(1000);
    }
    /**
     * @brief Set measurement cycle
     * @param cycle:in typedef enum{
     *                  eClosed,      //Idle (Measurements are disabled in this mode)
     *                  eCycle_1s,    //Constant power mode, IAQ measurement every second
     *                  eCycle_10s,   //Pulse heating mode IAQ measurement every 10 seconds
     *                  eCycle_60s,   //Low power pulse heating mode IAQ measurement every 60 seconds
     *                  eCycle_250ms  //Constant power mode, sensor measurement every 250ms
     *                  }eCycle_t;
     */
    sensor.setMeasCycle(sensor.eCycle_250ms);
}
void loop() {
    if(sensor.checkDataReady() == true){
        Serial.print("CO2: ");
        Serial.print(sensor.getCO2PPM());
        Serial.print("ppm, TVOC: ");
        Serial.print(sensor.getTVOCPPB());
        Serial.println("ppb");
        
    } else {
        Serial.println("Data is not ready!");
    }
    /*!
     * @brief Set baseline
     * @param get from getBaseline.ino
     */
    sensor.writeBaseLine(0x847B);
    //delay cannot be less than measurement cycle
    delay(1000);
}


结果

CCS811数据结果.png

样例代码3 - 浓度报警

将获取到的基线值填入到sensor.writeBaseLine();这个函数中。
当CO2浓度从当前范围(低、中、高)移动到另一个范围(超过50ppm),则产生中断,并在打印当前CO2值。

本样例需要将传感器的INT引脚连接到主控板相应的中断引脚。

AVR中断引脚和中断号.png

/*!
 * @file setInterrupt.ino
 * @brief Set interrupt parameter, when CO2 concentration range changes, get an interrupt
 * @n Experiment phenomenon: read data every 1s, and print it out on serial port.
 *
 * @copyright	Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @licence     The MIT License (MIT)
 * @author [LuoYufeng](yufeng.luo@dfrobot.com)
 * @version  V1.0
 * @date  2019-07-13
 * @https://github.com/DFRobot/DFRobot_Sensor
 */
#include "DFRobot_CCS811.h"

volatile  int8_t GPIO1TRIG = 0;

/*
 * IIC address default 0x5A, the address becomes 0x5B if the ADDR_SEL is soldered.
 */
//DFRobot_CCS811 sensor(&Wire, /*IIC_ADDRESS=*/0x5A);
DFRobot_CCS811 sensor;

void setup(void)
{
    Serial.begin(115200);
    /*wait for the chip to be initialized completely, and then exit*/
    while(sensor.begin() != 0){
        Serial.println("failed to init chip, please check if the chip connection is fine");
        delay(1000);
    }
    attachInterrupt(0, interrupt, RISING);
    sensor.setMeasurementMode(1, 1, sensor.eMode4);
    /**
     * @brief Set interrupt thresholds 
     * @param lowToMed: interrupt triggered value in range low to middle 
     * @param medToHigh: interrupt triggered value in range middle to high 
     */
    sensor.setThresholds(1500,2500);
}
void loop() {
    if(GPIO1TRIG == 1){
        Serial.println("CO2 range has changed");
        Serial.print("CO2: ");
        Serial.print(sensor.getCO2PPM());
        Serial.print("ppm, TVOC: ");
        Serial.print(sensor.getTVOCPPB());
        Serial.println("ppb");
        delay(1000);
    }
    GPIO1TRIG = 0;
    Serial.print("CO2: ");
    Serial.print(sensor.getCO2PPM());
    Serial.print("ppm, TVOC: ");
    Serial.print(sensor.getTVOCPPB());
    Serial.println("ppb");
    sensor.writeBaseLine(0x847B);
    delay(1000);
}


void interrupt(){
  GPIO1TRIG = 1;
}


结果

当对传感器呼气,CO2浓度范围发生了变化,产生了一次中断;当气体浓度降下来时,也产生了一次中断
CCS811中断结果.png

常见问题

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


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


更多

  • 原理图
  • 尺寸图
  • CCS811数据手册


DFshopping car1.png [Link DFRobot商城购买链接]

个人工具
名字空间

变换
操作
导航
工具箱