Gravity STCC4 CO2 Sensor

产品简介

一款基于Sensirion STCC4芯片的二氧化碳传感器。传感器基于热导原理,可直接测量CO2浓度而非通过其他气体估算其eCO2浓度,大大增加读数的可靠性。
板载同样是Sensirion的SHT40温湿度传感器进行温湿度补偿,并且可在同一个模块上同时获取,温湿度和二氧化碳数据。
非常适合空间有限的项目部署,以及环境检测类项目制作。

注: STCC4芯片上黄色透气膜不能接触有机溶剂,或者被尖锐物体损坏。

产品特性

  • 直接测量CO2浓度,而非间接测量eCO2浓度
  • 板载温湿度补偿
  • 0x64/0x65地址可切换
  • 传感器周围镂空PCB,防止其他元器件发热干扰热导效应的STCC4进行测量

技术规格

供电电压:3.3~5V
工作温度:10~40℃
工作湿度:20~80%R.H
工作电流:4.2mA(峰值);950μA(连续测量);100μA(单次测量,10秒间隔)
量程:400 ~ 5000ppm
精度:±100.0 ppm ±10.0 %m.v. (@400 ~ 5000ppm range)
响应时间:20s

引脚说明

引脚 说明
VCC 供电正极,3.3~5V DC输入
GND 供电地
SCL I2C时钟线,直连板载STCC4
SDA I2C数据线,直连板载STCC4
0x64/0x65拨码 传感器地址选择,断电重启生效
Enable/Disable 开启/关闭板载SHT40温湿度补偿功能,断电重启生效

使用教程

软硬件准备

硬件准备

软件准备

接线图

传感器侧 引脚名称 主控侧 引脚名称
Gravity STCC4 二氧化碳传感器 VCC DFRduino UNO 5V
Gravity STCC4 二氧化碳传感器 GND DFRduino UNO GND
Gravity STCC4 二氧化碳传感器 SCL DFRduino UNO SCL
Gravity STCC4 二氧化碳传感器 SDA DFRduino UNO SDA

示例代码1-连续测量

确保Gravity STCC4二氧化碳传感器板载拨码在0x64/Enable上,上传代码后打开串口监视器并等待20秒。

/*!
 * 
 * @copyright Copyright (c) 2025 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author [lbx](liubx8023@gmail.com)
 * @version V1.0
 * @date 2025-08-14
 * @url https://github.com/DFRobot/DFRobot_STCC4
 */

#include "DFRobot_STCC4.h"

/**
 * 手动设置温度补偿
 * 范围是 10 - 40℃.
 * 单位是摄氏度
 * 当且仅当板载拨码被设置为Disable处会生效
 */
const uint16_t tCompensation = 26;

/**
 * 手动设置湿度补偿
 * 范围是 20 - 80%RH.
 * 当且仅当板载拨码被设置为Disable处会生效
 */
const uint16_t hCompensation = 55;

/**
 * 手动设置气压补偿
 * 范围是 400 - 1100 hPa.
 * 单位是 hPa.
 */
const uint16_t pCompensation = 950;

/**
 * 从传感器处获取的环境温度
 * 如果拨码设置为Disable,即未连接温湿度传感器,该数值将采用默认值或设定值。
 */
float temperature;

/**
 * 从传感器处获取的环境湿度
 * 如果拨码设置为Disable,即未连接温湿度传感器,该数值将采用默认值或设定值。
 */
float humidity;

/* 从STCC4获得的二氧化碳浓度. */
uint16_t co2Concentration;

/* 传感器的状态. */
uint16_t sensorStatus;

/**
 * 该传感器可通过两个特定地址(0x64 和 0x65)进行通信。
 * 拨码开关(适用于 Gravity 版本):电路板上一个可手动拨动的小开关。
 */
const uint8_t ADDR = 0x64;

DFRobot_STCC4_I2C sensor(&Wire, ADDR); // 使用 I2C 地址 ADDR 创建 DFRobot_STCC4_I2C 类的实例。

void setup() {
  Serial.begin(115200);
  while(!Serial) delay(100); // 请等待串口就绪。
  Serial.println("This is a demo of continuous reading sensor data.\n");

  /* 初始化传感器 */
  while(!sensor.begin()){
    Serial.println("Init error!");
    delay(500);
  }

  /* 唤醒传感器 */
  sensor.wakeup();
  delay(10);

  /**
   * 获取传感器ID
   */
  Serial.print("ID: 0x");
  Serial.println(sensor.getID(), HEX);

  /**
    * @brief 设置温湿度补偿
    * @param 温度 温度补偿值
    * @param 湿度 湿度补偿值
    * @return 成功则为 true,否则为 false
    */
  if(sensor.setRHTcompensation(tCompensation, hCompensation)){
    Serial.println("Set RHT compensation successful.");
  }else{
    Serial.println("Set RHT compensation error!");
  }

  /**
    * @brief 设置压力补偿
    * @param 压力 压力补偿值
    * @return 成功则为 true,否则为 false
    */
  if(sensor.setPressureCompensation(pCompensation)){
    Serial.println("Set pressure compensation successful.");
  }else{
    Serial.println("Set pressure compensation error!");
  }

  sensor.startMeasurement(); // 开始测量
}

void loop() {
  delay(2000);
  /**
    * @brief 读取测量数据
    * @param co2Concentration Pointer 用于存储二氧化碳浓度
    * @param temperature Pointer 用于存放温度数据
    * @param humidity Pointer 用于存放湿度数据
    * @param sensorStatus Pointer 用于存储传感器状态,0 表示正常,否则表示错误。
    * @return  成功则为 true,否则为 false
    */
  if(sensor.measurement(&co2Concentration,&temperature,&humidity,&sensorStatus)){
    Serial.print("CO2:");
    Serial.print(co2Concentration);
    Serial.print(" ppm ");
    Serial.print(" temperature:");
    Serial.print(temperature);
    Serial.print(" ℃ ");
    Serial.print(" humidity:");
    Serial.print(humidity);
    Serial.print(" % ");
    Serial.print(" status:");
    Serial.println(sensorStatus);
  }
}

结果

串口监视器输出二氧化碳浓度,温湿度数据。
向传感器哈气后,二氧化碳浓度明显上升。

示例代码2-校准

该程序首先进行30次连续采样,然后进行校准,随后继续进行连续采样。
如果连接温湿度传感器,则可以获取二氧化碳浓度和温湿度。
如果未连接温湿度传感器,获取的温湿度值为默认值。

/*!
 * 
 * @copyright Copyright (c) 2025 DFRobot Co.Ltd (http://www.dfrobot.com)
 * @license The MIT License (MIT)
 * @author [lbx](liubx8023@gmail.com)
 * @version V1.0
 * @date 2025-08-14
 * @url https://github.com/DFRobot/DFRobot_STCC4
 */

#include "DFRobot_STCC4.h"
#include <string.h>

/**
 * 用于校准的目标二氧化碳浓度。
 * 允许二氧化碳浓度的输入范围为 0 至 32000 ppm。
 */
const uint16_t target = 600; 

/* 传感器返回的 frc 校正值,通常不被使用。 */
uint16_t frcCorrection;

/**
 * 从传感器处获取的环境温度
 * 如果拨码设置为Disable,即未连接温湿度传感器,该数值将采用默认值或设定值。
 */
float temperature;

/**
 * 从传感器处获取的环境湿度
 * 如果拨码设置为Disable,即未连接温湿度传感器,该数值将采用默认值或设定值。
 */
float humidity;

/* 从STCC4获得的二氧化碳浓度。 */
uint16_t co2Concentration;

/* 传感器的状态。 */
uint16_t sensorStatus;

/**
 * 手动设置温度补偿
 * 范围是 10 - 40℃.
 * 单位是摄氏度
 * 当且仅当板载拨码被设置为Disable处会生效
 */
const uint16_t tCompensation = 26;

/**
 * 手动设置湿度补偿
 * 范围是 20 - 80%RH.
 * 当且仅当板载拨码被设置为Disable处会生效
 */

const uint16_t hCompensation = 55;

/**
 * 手动设置压力补偿
 * 范围是 400 - 1100 hPa.
 * 单位是 hPa.
 */
const uint16_t pCompensation = 950;

/**
 * 该传感器可通过两个特定地址(0x64 和 0x65)进行通信。
 * 拨码开关(适用于 Gravity 版本):电路板上一个可手动拨动的小开关。
 */
const uint8_t ADDR = 0x64;

DFRobot_STCC4_I2C sensor(&Wire, ADDR); // 使用 I2C 地址 ADDR 创建 DFRobot_STCC4_I2C 类的实例。

void setup() {
  Serial.begin(115200);
  while(!Serial) delay(100); // 请等待串口就绪。
  Serial.println("This demo will force-calibrate the sensor based on the CO2 concentration you input.\n");

  /* 初始化传感器 */
  while(!sensor.begin()){
    Serial.println("Init error!");
    delay(500);
  }

  /* 唤醒传感器 */
  sensor.wakeup();
  delay(10);

  /**
   * 获取传感器的ID。
   */
  Serial.print("ID: 0x");
  Serial.println(sensor.getID(), HEX);
  
  /**
    * @brief 设置温湿度补偿
    * @param 温度 温度补偿值
    * @param 湿度 湿度补偿值
    * @return 成功则为 true,否则为 false
    */
  if(sensor.setRHTcompensation(tCompensation, hCompensation)){
    Serial.println("Set RHT compensation successful.");
  }else{
    Serial.println("Set RHT compensation error!");
  }

  /**
    * @brief 设置压力补偿
    * @param 压力 压力补偿值
    * @return 成功则为 true,否则为 false
    */
  if(sensor.setPressureCompensation(pCompensation)){
    Serial.println("Set pressure compensation successful.");
  }else{
    Serial.println("Set pressure compensation error!");
  }

  /* 开始连续采样30次 */
  sensor.startMeasurement();
  for(uint8_t i = 0; i < 30; i++){
    delay(2000);
    /**
    * @brief 读取测量数据
    * @param co2Concentration Pointer 用于存储二氧化碳浓度
    * @param temperature Pointer 用于存储温度
    * @param humidity Pointer 用于储存湿度
    * @param sensorStatus Pointer 用于储存传感器状态
    * @return  成功则为 true,否则为 false
    */
    if(sensor.measurement(&co2Concentration,&temperature,&humidity,&sensorStatus)){
      Serial.print("CO2:");
      Serial.print(co2Concentration);
      Serial.print(" ppm ");
      Serial.print(" temperature:");
      Serial.print(temperature);
      Serial.print(" ℃ ");
      Serial.print(" humidity:");
      Serial.print(humidity);
      Serial.print(" % ");
      Serial.print("status:");
      Serial.println(sensorStatus);
    }
  }

  /* 停止采样 */
  sensor.stopMeasurement();
  delay(1000);

  /* 开始校准 */
  /**
    * @brief 执行强制重新校准
    * @param targetPpm 重新校准的目标PPM值
    * @param frcCorrection Pointer to 用于存储修正值
    * @return 成功则为 true,否则为 false
    */
  sensor.forcedRecalibration(target, &frcCorrection);

  /**通过检查 frc 的值来判断校准是否有效。
    *如果 frc 等于 0xffff 或 0,则校准无效;否则,校准有效。
    */
  while(frcCorrection == 0xffff || frcCorrection == 0){
    Serial.println("Calibration failed!\n");
    delay(1000);
    sensor.forcedRecalibration(target, &frcCorrection);
  }
  Serial.print("CO2 concentration correction:");
  Serial.println(frcCorrection);

  /* 开始采样 */
  sensor.startMeasurement();
}

void loop() {
  delay(2000);
    if(sensor.measurement(&co2Concentration,&temperature,&humidity,&sensorStatus)){
      Serial.print("After correction, CO2:");
      Serial.print(co2Concentration);
      Serial.print(" ppm ");
      Serial.print(" temperature:");
      Serial.print(temperature);
      Serial.print(" ℃ ");
      Serial.print(" humidity:");
      Serial.print(humidity);
      Serial.print(" % ");
      Serial.print(" status:");
      Serial.println(sensorStatus);
    }
}

结果

常见问题

Q1:
为什么开始测量后数值一直是稳定的400ppm左右
A1:
传感器需要一定的启动/预热时间,每次上电后预热时间约为20S左右

更多资料