产品简介
一款基于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温湿度补偿功能,断电重启生效 |
使用教程
软硬件准备
硬件准备
- DFRduino UNO+IO扩展板 (SKU:DFR0216-2) ×1
- Gravity: STCC4 二氧化碳传感器(SKU:SEN0678)×1
软件准备
- 下载Arduino IDE: 点击下载Arduino IDE
- 下载DFRobot_STCC4库:DFRobot_STCC4库
- Arduino IDE V1.8.19(或以下)安装库文件: 如何加载库文件
接线图

| 传感器侧 | 引脚名称 | 主控侧 | 引脚名称 |
|---|---|---|---|
| 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左右
