电子说
在当今对空气质量关注度日益提升的时代,空气质量传感器成为众多应用的关键组件。今天我们要深入探讨的 CCS811 空气质量传感器,以其出色的性能和丰富的功能,在空气检测领域占据重要地位。
文件下载:SEN0339.pdf
CCS811 空气质量传感器能够精准测量 eCO2(等效二氧化碳)和 TVOC(总挥发性有机化合物)的密度。它采用了 AMS 独特的微热板技术,相比传统气体传感器,具有显著优势。功耗更低,加热速度更快,体积也更小。内部集成的 ADC 和 MCU 能够完成数据的采集、计算,并通过 IIC 接口返回结果。该传感器还支持浓度报警功能,当被测物质浓度超过用户设定的阈值时,会触发报警。
CCS811 支持多种工作模式,如每秒检测一次、每 10 秒检测一次、每分钟检测一次、每 250 毫秒检测一次以及睡眠模式。这些模式针对传感器测量过程中的低功耗进行了优化,非常适合便携式应用。不过需要注意的是,该芯片在 IIC 通信中会拉伸时钟,因此与某些控制器(如树莓派)不兼容。
| 了解二氧化碳和 TVOC 浓度对人体的影响至关重要。下面是不同浓度下这些物质对人体影响的表格: | 二氧化碳浓度(PPM) | 对人体的影响 | TVOC 浓度(PPB) | 对人体的影响 |
|---|---|---|---|---|
| <500 | 正常 | <50 | 正常 | |
| 500 - 1000 | 有点不舒服 | 50 - 750 | 焦虑、不舒服 | |
| 1000 - 2500 | 疲劳 | 750 - 6000 | 抑郁、头痛 | |
| 2500 - 5000 | 不健康 | >6000 | 头痛及其他神经问题 |
| CCS811 传感器的引脚功能如下表所示: | 引脚编号 | 引脚标签 | 说明 |
|---|---|---|---|
| 1 | VCC | 电源正极 | |
| 2 | GND | 电源负极 | |
| 3 | SCL | IIC 时钟线 | |
| 4 | SDA | IIC 数据线 | |
| 5 | INT | 中断引脚,低电平触发中断 | |
| 6 | WAKE | 开关引脚,低电平唤醒,高电平休眠 | |
| 7 | RST | 复位引脚,低电平复位 |
bool checkDataReady():判断是否可以读取数据。void setInTemHum(float temperature, float humidity):设置环境参数,包括温度和湿度。setMeasurementMode(eCycle_t mode, uint8_t thresh = 0, uint8_t interrupt = 0):配置测量参数,如测量模式、中断设置等。uint16_t getCO2PPM():获取当前二氧化碳浓度,单位为 ppm。uint16_t getTVOCPPB():获取当前 TVOC 浓度,单位为 ppb。uint16_t readBaseLine():读取当前基线值。void writeBaseLine(uint16_t baseLine):将基线值写入寄存器。获取基线的目的是为了在传感器预热后能快速显示空气质量。在传感器运行的第一周,建议每 24 小时保存一次新基线;运行一周后,可每 1 - 28 天保存一次。需要注意的是,要将传感器放置在新鲜空气环境中 20 分钟以上才能获取基线,并且不同传感器和不同测量周期的基线可能不同。
#include "DFRobot_CCS811.h"
DFRobot_CCS811 CCS811;
void setup(void) {
Serial.begin(115200);
while(CCS811.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
}
void loop() {
if(CCS811.checkDataReady() == true){
Serial.println(CCS811.readBaseLine(), HEX);
} else {
Serial.println("Data is not ready!");
delay(1000);
}
}
可以将基线值输入到 sensor.writeBaseLine() 函数中,若不想设置基线,可在示例程序中禁用该函数,此时传感器会自动校准基线,但过程可能较长。上传程序到 UNO 后,打开串口监视器即可查看二氧化碳和 TVOC 浓度。
#include "DFRobot_CCS811.h"
DFRobot_CCS811 CCS811;
void setup(void) {
Serial.begin(115200);
while(CCS811.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
}
void loop() {
if(CCS811.checkDataReady() == true){
Serial.print("CO2: ");
Serial.print(CCS811.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(CCS811.getTVOCPPB());
Serial.println("ppb");
} else {
Serial.println("Data is not ready!");
CCS811.writeBaseLine(0x447B);
delay(1000);
}
}
将基线值输入到 sensor.writeBaseLine() 函数并上传到 UNO。当 CO2 浓度从当前范围(低、中、高)变化到另一个范围(变化超过 50 ppm)时,会产生中断并打印当前 CO2 值。此示例需要将传感器的 INT 引脚连接到主板上相应的中断引脚。
#include "DFRobot_CCS811.h"
volatile int8_t GPIO1TRIG = 0;
DFRobot_CCS811 CCS811;
void setup(void) {
Serial.begin(115200);
while(CCS811.begin() != 0){
Serial.println("failed to init chip, please check if the chip connection is fine");
delay(1000);
}
attachInterrupt(0, interrupt, RISING);
CCS811.setMeasurementMode(CCS811.eCycle_250ms, 1, 1);
CCS811.setThresholds(1500,2500);
}
void loop() {
if(GPIO1TRIG == 1){
Serial.println("CO2 range has changed");
Serial.print("CO2: ");
Serial.print(CCS811.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(CCS811.getTVOCPPB());
Serial.println("ppb");
delay(1000);
GPIO1TRIG = 0;
}
Serial.print("CO2: ");
Serial.print(CCS811.getCO2PPM());
Serial.print("ppm, TVOC: ");
Serial.print(CCS811.getTVOCPPB());
Serial.println("ppb");
CCS811.writeBaseLine(0x447B);
delay(1000);
}
void interrupt(){
GPIO1TRIG = 1;
}
如果你需要更多信息,可以参考以下文档:
你可以从 DFRobot 商店 或 DFRobot 经销商 处获取 CCS811 空气质量传感器。
在实际应用中,你是否遇到过 CCS811 传感器与其他设备兼容性的问题?你是如何解决的呢?欢迎在评论区分享你的经验和见解。
全部0条评论
快来发表一下你的评论吧 !