基于esp32驱动CCS811模块监测eCO2/TVOC环境空气质量
一、CCS811简介
CCS811 是一款超低功耗数字气体传感器,集成了用于监测室内空气质量 (IAQ)(包括多种挥发性有机化合物 (VOC))的金属氧化物 (MOX) 气体传感器、微控制器单元 (MCU)、16 bit ADC 模数转换器和 I2C 接口。通过 I²C 接口实时输出等效(eCO₂)及总挥发性有机物(TVOC)浓度,并在片内完成算法处理,显著简化主控系统设计与功耗管理。


二、产品特性
- 等效气体输出:eCO₂ 范围 400 – 5000ppm,TVOC 范围 0 – 1000 ppb。
- 多种测量模式:支持 Idle(模式 0)、1 s(模式 1)、10 s(模式 2)、60 s(模式 3)及原始数据模式(模式 4),满足不同功耗与响应速率需求。
- 自动与手动基线校正:芯片内置自动基线校正算法(24 h 最小更新时间窗),也可通过 BASELINE 寄存器手动保存/恢复基线,加快算法收敛。
- 温湿度补偿:可写入外部温湿度数据至 ENV_DATA 寄存器,以补偿温湿度变化对气体测量的影响;若无外部传感器,可接入 NTC 热敏电阻获取本地环境温度。
- 阈值中断:在 MEAS_MODE 寄存器开启阈值中断后,传感器仅在 eCO₂ 跨越设定范围时通过 nINT 输出告警,降低主控轮询开销。
三、引脚说明
| SCL | I2C串行时钟线 |
|---|---|
| SDA | I2C串行数据线 |
| WAK | 使能,低电平有效,拉低后传感器才开始工作 |
| INT | 低电平有效,CCS811芯片内部程序跑飞后可以将该引脚接地复位 |
| RST | 低电平有效,默认上拉至VDD |
| ADD | 地址选择位,当I2C地址低时,7位器件地址为0x5A; 当I2C地址高时,7位器件地址为0x5B; |
四、启动与运行条件
早期老化:CCS811 在电阻水平和灵敏度方面的性能在早期使用过程中会发生变化。在此阶段,电阻变化在运行的前 24 至 48 小时内最为显著。老化过程旨在加速 CCS811 的这一阶段,从而最大限度地减少正常运行期间的变化。即新器件首次上电后,持续运行 ≥ 48 h 可稳定传感器电阻与灵敏度;若长期断电后重启,建议同样进行 48 h早期老化。
CCS 建议 CCS811 尽可能在所选模式 1-4 下连续运行至少 24 小时,以确保性能更稳定,并能够更准确地指示室内空气质量 (IAQ) 水平。每次切换测量模式后需持续运行 ≥ 20 min,待算法基线收敛后方可读取准确数据;切换至 Idle 模式时,需最少 10 min 稳定。
五、主要寄存器介绍
STATUS (0x00):状态寄存器,单字节只读,指示设备是否处于活动状态、是否有新数据可用或是否发生错误。

MEAS_MODE (0x01):设置驱动模式寄存器,单字节读写,用于启用传感器驱动模式和中断。

ALG_RESULT_DATA (0x02) :算法结果数据寄存器,多字节只读寄存器包含计算出的 eCO2 (ppm) 和 TVOC (ppb) 值,后跟 STATUS 寄存器、ERROR_ID 寄存器和 RAW_DATA 寄存器。
- 如果仅需要 eCO2,则只需读取前 2 个字节。
- 如果需要 TVOC,则需要读取 4 个字节。
- 在没有实现中断且主机需要轮询 STATUS 寄存器以确定是否有新数据的系统中,一种有效的替代方案是在单个事务中读取 5 个字节,并返回 eCO2、TVOC 和状态寄存器。
- 也可以在单个事务中读取所有 8 个字节。

ENV_DATA (0x05):环境补偿寄存器,4字节读写,按固定格式写入湿度(16 bit)与温度(16 bit)用于补偿。
- 湿度存储在字节 0 中,精确到 0.5%,其他小数部分可以存储在字节 1 中。默认值为 50% = 0x64, 0x00。例如,48.5% 的湿度存储为 0x61, 0x00。
- 温度存储在字节 2 中,精确到 0.5°C,并添加 25°C 作为偏移量(因此所有值均为正值)。其他小数部分可以存储在字节 3 中。默认值为 25°C = 0x64, 0x00。例如,23.5% 的温度存储为 0x61, 0x00。
内部算法使用这些值(如果应用程序未设置,则使用默认值)来补偿湿度和环境温度的变化。

NTC (0x06):NTC寄存器,四字节只读:返回 RREF 与 RNTC 两端电压(mV),主机据此计算环境温度并写入 ENV_DATA 。NTC 电阻的阻值可以通过所用参考电阻的比值和相关知识来确定。RNTC = VNTC x RREF / VREF。温度可以通过所用 NTC 电阻的数据表中的 NTC 电阻阻值来确定。

其中模块上预留有相应焊盘,方便NTC补偿。

BASELINE (0x11) :基线寄存器,双字节读写,其中包含算法计算中使用的当前基线的编码版本。先前存储的值可以写回此双字节寄存器,算法将在其计算中使用新值(直到其作为内部自动基线校正的一部分进行调整)。如果要保存基线并在稍后恢复,则必须将两个字节一起保存并一起写回。
HW_ID (0x20):设备ID寄存器,单字节只读,硬件标识,固定值 0x81 。
FW_Boot_Version (0x23) :固件引导加载程序版本寄存器,双字节只读,Bootloader 固件版本。
FW_App_Version (0x24):固件应用程序版本寄存器,双字节只读,Application 固件版本。
ERROR_ID (0xE0):错误标识符寄存器,单字节只读,如果设置状态寄存器的ERR位为0,则此字节只读寄存器指示错误的来源。

SW_RESET (0xFF):软复位寄存器,四字节写入(0x11,0xE5,0x72,0x8A)触发软件复位,重启至 Boot 模式 。
APP_START (0xF4):应用程序启动寄存器,单字节写入,将 CCS811 的模式从启动模式更改为运行应用程序,以选择“APP_START”寄存器,并开始运行已加载的应用程序软件。
六、ESP32驱动示例
- 引脚接线
| ESP32 | CCS811 |
|---|---|
| 3V3 | VCC |
| GND | GND |
| 21 | SDA |
| 22 | SCL |
| 23 | WAK |
- 代码示例
/*
ccs811basic.ino - Demo sketch printing results of the CCS811 digital gas sensor for monitoring indoor air quality from ams.
Created by Maarten Pennings 2017 Dec 11
*/
#include <Wire.h> // I2C library
#include "ccs811.h" // CCS811 library
// Wiring for ESP8266 NodeMCU boards: VDD to 3V3, GND to GND, SDA to D2, SCL to D1, nWAKE to D3 (or GND)
//CCS811 ccs811(D3); // nWAKE on D3
// Wiring for Nano: VDD to 3v3, GND to GND, SDA to A4, SCL to A5, nWAKE to 13
//CCS811 ccs811(13);
// nWAKE not controlled via Arduino host, so connect CCS811.nWAKE to GND
//CCS811 ccs811;
// Wiring for ESP32 NodeMCU boards: VDD to 3V3, GND to GND, SDA to 21, SCL to 22, nWAKE to D3 (or GND)
CCS811 ccs811(23); // nWAKE on 23
void setup() {
// Enable serial
Serial.begin(115200);
Serial.println("");
Serial.println("setup: Starting CCS811 basic demo");
Serial.print("setup: ccs811 lib version: "); Serial.println(CCS811_VERSION);
// Enable I2C
Wire.begin();
// Enable CCS811
ccs811.set_i2cdelay(50); // Needed for ESP8266 because it doesn't handle I2C clock stretch correctly
bool ok= ccs811.begin();
if( !ok ) Serial.println("setup: CCS811 begin FAILED");
// Print CCS811 versions
Serial.print("setup: hardware version: "); Serial.println(ccs811.hardware_version(),HEX);
Serial.print("setup: bootloader version: "); Serial.println(ccs811.bootloader_version(),HEX);
Serial.print("setup: application version: "); Serial.println(ccs811.application_version(),HEX);
// Start measuring
ok= ccs811.start(CCS811_MODE_1SEC);
if( !ok ) Serial.println("setup: CCS811 start FAILED");
}
void loop() {
// Read
uint16_t eco2, etvoc, errstat, raw;
ccs811.read(&eco2,&etvoc,&errstat,&raw);
// Print measurement results based on status
if( errstat==CCS811_ERRSTAT_OK ) {
Serial.print("CCS811: ");
Serial.print("eco2="); Serial.print(eco2); Serial.print(" ppm ");
Serial.print("etvoc="); Serial.print(etvoc); Serial.print(" ppb ");
//Serial.print("raw6="); Serial.print(raw/1024); Serial.print(" uA ");
//Serial.print("raw10="); Serial.print(raw%1024); Serial.print(" ADC ");
//Serial.print("R="); Serial.print((1650*1000L/1023)*(raw%1024)/(raw/1024)); Serial.print(" ohm");
Serial.println();
} else if( errstat==CCS811_ERRSTAT_OK_NODATA ) {
Serial.println("CCS811: waiting for (new) data");
} else if( errstat & CCS811_ERRSTAT_I2CFAIL ) {
Serial.println("CCS811: I2C error");
} else {
Serial.print("CCS811: errstat="); Serial.print(errstat,HEX);
Serial.print("="); Serial.println( ccs811.errstat_str(errstat) );
}
// Wait
delay(1000);
}
- 效果展示

总结
CCS811 是 AMS推出的一款超低功耗数字气体传感器,内置金属氧化物微加热线圈(micro‑hotplate)与片上 MCU/ADC,能够通过 I²C 接口直接输出等效 CO₂(eCO₂)和总挥发性有机物(TVOC)浓度,广泛用于室内空气质量监测与智能家居等场景。
更多推荐
所有评论(0)