Arduino、ESP32驱动STCC4二氧化碳传感器(气体传感器)

2026-10-172

STCC4是一款颠覆传统的新一代CO₂传感器,采用Sensirion STCC4高性能气体传感芯片,基于热导(TC)测量原理,能够对空气中的二氧化碳(CO₂)浓度进行稳定、精准的测量。并直接输出ppm单位的二氧化碳浓度数据。该传感器具有出色的长期稳定性和抗干扰能力,适合在复杂环境下持续运行。

图1

1、传感器特性

  • 供电电压:3.3~5V
  • 通信接口:I2C
  • 测量气体:二氧化碳(CO₂)
  • 测量范围:400~5000ppm(理论测量范围可达380~32000ppm)
  • 测量精度:±(100 ppm+10%读数) @400~5000ppm, SHT4x温湿度补偿
  • 响应时间:20s (Typ.)
  • 工作温度:10~40 ℃
  • 工作湿度:20~80% R.H(无凝结)
  • 工作电流:4.2mA@Peak, 950μA@持续测量,100μA@单次测量,10秒采样,1μA@睡眠模式

2、硬件原理图

传感器原理图如下所示:

图2

3、控制器和传感器连线图

控制器和传感器连线图如下所示:

图3

4、驱动程序

4.1、连续测量

驱动程序如下所示:

/*!
 * 
 * @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);
  }
}

串口监视器输出二氧化碳浓度,温湿度数据。

向传感器哈气后,二氧化碳浓度明显上升。

运行效果如下所示:

图4

4.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);
    }
}

运行效果如下所示:

图5

创作许可协议

本项目采用 CC BY(署名) 进行许可。

评论(0)
- 没有更多了 -