ESP32驱动STCC4二氧化碳传感器,I2C读取与校准

2026-10-20 15:27:08 2阅读

[

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

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、硬件原理图

传感器原理图如下所示:

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.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 

/**
* 用于校准的目标二氧化碳浓度。
* 允许二氧化碳浓度的输入范围为 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);
}
}

运行效果如下所示:

]


作者:不脱发的程序猿
链接:https://www.aiddithome.com/p/ec874e2bd928e.html
本作遵循 [CC BY 4.0 署名] 许可,版权归作者所有。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
老张装机
1楼 · 1天前

CO2传感器终于看到热导原理的了,比NDIR便宜还稳,检测仪看好这类

拆机党
2楼 · 1天前

I2C接法简单,哈气测试浓度明显上升,照着跑通了

深圳打工人Alan
3楼 · 1天前

校准那段先采样30次再强校,适合首次上电标定,很实用

探头看一眼
4楼 · 1天前

带SHT4x温湿度补偿,读数更靠谱,做室内监测够用