Arduino、ESP32驱动STCC4二氧化碳传感器(气体传感器)
2026-10-172
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 <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);
}
}
运行效果如下所示:




