1、CCS811 傳感器
ccs811 軟件包是 CCS811 氣體傳感器的驅動軟件包。CCS811 是一款低功耗數字氣體傳感器,用於檢測室內低水平的揮發性有機化合物和二氧化碳濃度,內部集成微控制器單元 (MCU) 和模數轉換器(ADC),並提供通過標準 I2C 數字接口獲取 CO2 或 TVOC 數據。
CCS811 模塊支持 I2C 接口,IIC 地址可配置爲 0x5A 或 0X5B。
CCS811 支持多種模式:每1秒、10秒、1分鐘、250毫秒測量一次以及休眠模式,這些模式在傳感器測量期間進行了低功耗優化,因此 CCS811 適用於便攜式應用。CCS811 支持濃度報警,當濃度超過用戶設置的閾值時,INT 引腳就會觸發。
注意:該芯片對 IIC 進行了時鐘延展,有些控制器不支持時鐘延展,例如樹莓派。
1.1 技術規格
- 供電電壓:3.3V~5.5 V
- 預熱時間:<15s
- IIC地址:0x5A 或 0X5B
- 工作溫度範圍:-40℃~85℃
- 工作溼度範圍:10%RH~95%RH
- eCO2測量範圍:400ppm~8000ppm
- TVOC測量範圍:0ppb~1100ppb
- 產品尺寸:22*31mm
1.2 功能特性
- 集成 MCU
- 板載處理
- 標準數字接口
- 優化的低功耗模式
- IAQ 閾值報警
- 可編程基線-2.7mm x 4.0mm LGA 封裝
- 低元件數
- 成熟的技術平臺
1.3 應用場景
- 車內空氣質量檢測
- 室內空氣質量檢測
- 空氣淨化器
- 家庭控制器
- 新風系統
2、使用 ccs811 軟件包
2.1 添加軟件包
爲了在項目中快速集成 CCS811 傳感器進行應用開發,筆者製作了基於 RT-Thread 的 ccs811 軟件包。GitHub 地址: https://github.com/luhuadong/rtt-ccs811。
使用 ccs811 軟件包,需要在 RT-Thread 的包管理器中選擇它,具體路徑如下:
RT-Thread online packages --->
peripheral libraries and drivers --->
[*] sensors drivers --->
[*] CCS811: Digital Gas Sensor for Monitoring Indoor Air Quality..
打開 Env 工具,執行 pkgs --upgrade
更新 RT-Thread 軟件包索引。更新完成後,在你的 BSP 工程目錄中執行 menuconfig 進行配置,添加 ccs811 軟件包,如下圖所示。
然後讓 RT-Thread 的包管理器自動更新,或者使用 pkgs --update
命令更新包到 BSP 中。
2.2 配置選項
ccs811 軟件包目前提供兩個配置選項:
- 選擇 I2C 地址(
PKG_USING_CCS811_I2C_ADDRESS
) - 是否使用示例程序(
PKG_USING_CCS811_SAMPLE
)
用戶可根據 CCS811 實際的硬件連接,選擇 I2C 地址爲 0x5A 或 0x5B。
3 測試
3.1 編譯下載
ccs811 軟件包中提供了測試示例,只需在 menuconfig 配置中勾選 “Enable ccs811 sample” 即可。爲了完成測試,還需要開啓 “Sensor cmd” 功能。
對了,別忘了配置 I2C 總線!ccs811 軟件包的示例默認使用 i2c1,因此需要在 menuconfig 中配置好 I2C1 Bus。
配置完成後即可編譯,下載到開發板中進行下一步實驗。
3.2 初始化示例代碼
因爲 RT-Thread 提供了 Sensor 驅動框架,並且 ccs811 已經接入 Sensor 框架了,因此只需要向下面這樣註冊傳感器設備,即可完成初始化工作。
static int rt_hw_ccs811_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.type = RT_SENSOR_INTF_I2C;
cfg.intf.dev_name = CCS811_I2C_BUS_NAME;
rt_hw_ccs811_init("cs8", &cfg);
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_ccs811_port);
實際上,這一步在 sensor_ccs811_sample.c 示例中已經有了。因此,我們不用敲一行代碼!
3.3 使用 sensor 命令
如果一切正常,我們就可以來到 msh 終端。
3.3.1 檢查傳感器是否初始化成功
輸入 list_device 查看 CCS811 傳感器是否已經註冊。如果看到如下信息,說明已經註冊上了,並且傳感器初始化成功。
msh >list_device
device type ref count
-------- -------------------- ----------
tvoc_cs8 Sensor Device 0
eco2_cs8 Sensor Device 0
這裏會看到兩個設備 tvoc_cs8 和 eco2_cs8,這是因爲 CCS811 模塊能檢測兩類氣體數據(TVOC 和 CO2),所以在 RT-Thread 中會註冊爲兩個設備。
3.3.2 查看 CCS811 信息
傳感器初始化成功後,我們就可以使用 sensor 命令進行測試了!sensor probe
命令用於探測傳感器設備,命令後面接上設備名稱即可。
msh >sensor probe tvoc_cs8
[4774993] I/sensor.cmd: device id: 0x81!
同時 sensor probe
命令還會選中該傳感器設備,之後可以使用 sensor info
或 sensor read
等命令對該設備進行操作。
比如查看設備信息:
msh >sensor info
vendor :AMS
model :ccs811
unit :ppb
range_max :32768
range_min :0
period_min:250ms
fifo_max :1
3.3.3 讀取 TVOC 數據
執行 sensor read
即可讀取 TVOC 的值。
msh >sensor read
[4794468] I/sensor.cmd: num: 0, tvoc: 184 ppb, timestamp:4794468
[4794586] I/sensor.cmd: num: 1, tvoc: 184 ppb, timestamp:4794586
[4794704] I/sensor.cmd: num: 2, tvoc: 184 ppb, timestamp:4794704
[4794822] I/sensor.cmd: num: 3, tvoc: 184 ppb, timestamp:4794822
[4794940] I/sensor.cmd: num: 4, tvoc: 184 ppb, timestamp:4794940
3.3.4 讀取 CO2 數據
由於前面選中的是 tvoc_cs8 設備,爲了讀取 CO2 的值,我們需要先執行 sensor probe eco2_cs8
切換設備,再執行 sensor read
讀取傳感數據。
msh >sensor read
[4957632] I/sensor.cmd: num: 0, eco2: 871 ppm, timestamp:4957632
[4957850] I/sensor.cmd: num: 1, eco2: 865 ppm, timestamp:4957850
[4957968] I/sensor.cmd: num: 2, eco2: 865 ppm, timestamp:4957968
[4958086] I/sensor.cmd: num: 3, eco2: 871 ppm, timestamp:4958086
[4958303] I/sensor.cmd: num: 4, eco2: 871 ppm, timestamp:4958303
3.4 使用自定義接口測試
ccs811 爲我們提供了兩種接口,一種是自定義的接口,另一種是對接 RT-Thread Sensor 框架的接口。在 ccs811 軟件包的示例代碼中還提供了一個 cat_ccs811 示例,其使用的就是自定義接口,測試結果如下。
msh >cat_ccs811
[20] TVOC: 0 ppb, eCO2: 0 ppm
[19] TVOC: 9 ppb, eCO2: 465 ppm
[18] TVOC: 11 ppb, eCO2: 475 ppm
[17] TVOC: 11 ppb, eCO2: 475 ppm
[16] TVOC: 11 ppb, eCO2: 477 ppm
==> baseline: 0x8484
...
4、API 說明
4.1 自定義接口
創建和刪除對象
要操作傳感器模塊,首先需要創建一個傳感器對象。
ccs811_device_t ccs811_create(const char *i2c_bus_name);
調用這個函數時,會從動態堆內存中分配一個 ccs811_device_t 句柄,並按給定參數初始化。
參數 | 描述 |
---|---|
i2c_bus_name | 設備掛載的 IIC 總線名稱 |
返回 | —— |
ccs811_device_t | 創建成功,返回傳感器對象句柄 |
RT_NULL | 創建失敗 |
對於使用 ccs811_create()
創建出來的對象,當不需要使用,或者運行出錯時,請使用下面的函數接口將其刪除,避免內存泄漏。
void ccs811_delete(ccs811_device_t dev);
參數 | 描述 |
---|---|
ccs811_device_t | 要刪除的傳感器對象句柄 |
返回 | —— |
無 |
初始化對象
如果需要使用靜態內存分配,則可調用 ccs811_init()
函數。
rt_err_t ccs811_init(struct ccs811_device *dev, const char *i2c_bus_name);
使用該函數前需要先創建 ccs811_device 結構體。
參數 | 描述 |
---|---|
dev | 傳感器對象結構體 |
i2c_bus_name | 設備掛載的 IIC 總線名稱 |
返回 | —— |
RT_EOK | 初始化成功 |
-RT_ERROR | 初始化失敗 |
測量數據
測量 eTVOC 和 eCO2 濃度值,並將數據保存在傳感器對象中。
rt_bool_t ccs811_measure(ccs811_device_t dev);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
返回 | —— |
RT_TRUE | 讀取成功 |
RT_FALSE | 讀取失敗 |
由於 CCS811 傳感器支持多種模式和測量週期,爲成功獲取數據,建議在調用 ccs811_measure()
前使用 ccs811_check_ready()
函數檢查傳感器是否準備好了。
讀取 baseline
rt_uint16_t ccs811_get_baseline(ccs811_device_t dev);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
返回 | —— |
16位的基線值 | 讀取成功 |
0 | 讀取失敗 |
設置 baseline
rt_bool_t ccs811_set_baseline(ccs811_device_t dev, rt_uint16_t baseline);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
baseline | 16位的 baseline 設置值 |
返回 | —— |
RT_TRUE | 設置成功 |
RT_FALSE | 設置失敗 |
設置環境數據
rt_bool_t ccs811_set_envdata(ccs811_device_t dev, float temperature, float humidity);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
temperature | 當前環境的溫度值 |
humidity | 當前環境的溼度值 |
返回 | —— |
RT_TRUE | 設置成功 |
RT_FALSE | 設置失敗 |
在測量過程中定期設置環境溫度和溼度值,有利於獲取更準確的數據。
設置測量週期
rt_bool_t ccs811_set_measure_cycle(ccs811_device_t dev, ccs811_cycle_t cycle);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
cycle | 測量週期 |
返回 | —— |
RT_TRUE | 設置成功 |
RT_FALSE | 設置失敗 |
測量週期包括 250ms、1s、10s 和 60s,具體可配置項如下:
typedef enum
{
CCS811_CLOSED,
CCS811_CYCLE_1S,
CCS811_CYCLE_10S,
CCS811_CYCLE_60S,
CCS811_CYCLE_250MS
} ccs811_cycle_t;
設置工作模式
rt_bool_t ccs811_set_measure_mode(ccs811_device_t dev,
rt_uint8_t thresh,
rt_uint8_t interrupt,
ccs811_mode_t mode);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
thresh | 0:不檢測閾值,1:檢測閾值 |
interrupt | 0:不使能中斷,1:使能中斷 |
mode | 工作模式(就是設置測量週期) |
返回 | —— |
RT_TRUE | 設置成功 |
RT_FALSE | 設置失敗 |
工作模式可選項如下:
typedef enum
{
CCS811_MODE_0,
CCS811_MODE_1,
CCS811_MODE_2,
CCS811_MODE_3,
CCS811_MODE_4
} ccs811_mode_t;
讀取工作模式
rt_uint8_t ccs811_get_measure_mode(ccs811_device_t dev);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
返回 | —— |
MEAS_MODE 寄存器值 | 讀取成功 |
0xFF | 讀取失敗 |
設置報警閾值
rt_bool_t ccs811_set_thresholds(ccs811_device_t dev,
rt_uint16_t low_to_med,
rt_uint16_t med_to_high);
參數 | 描述 |
---|---|
dev | 傳感器對象句柄 |
low_to_med | 低範圍到中範圍的閾值,默認爲 1500ppm |
med_to_high | 中範圍到高範圍的閾值,默認爲 2500ppm |
返回 | —— |
RT_TRUE | 設置成功 |
RT_FALSE | 設置失敗 |
注意:閾值設置只針對 CO2 氣體濃度。
4.2 Sensor 接口
ccs811 軟件包已對接 sensor 驅動框架,操作傳感器模塊之前,只需調用下面接口註冊傳感器設備即可。
rt_err_t rt_hw_ccs811_init(const char *name, struct rt_sensor_config *cfg);
參數 | 描述 |
---|---|
name | 傳感器設備名稱 |
cfg | sensor 配置信息 |
返回 | —— |
RT_EOK | 創建成功 |
-RT_ERROR | 創建失敗 |
5、注意事項
- 爲傳感器對象提供靜態創建和動態創建兩種方式,如果使用動態創建,請記得在使用完畢釋放對應的內存空間。
- 由於 CCS811 模塊包含一個 TVOC 傳感器和一個 eCO2 傳感器,因此在 sensor 框架中會註冊兩個設備,內部提供1位 FIFO 緩存進行同步,緩存空間在調用
rt_device_open
函數時創建,因此 read 之前務必確保兩個設備都開啓成功。 - 由於使用 I2C 接口進行操作,因此註冊時需指定具體的 I2C 總線名稱,對應的句柄存放在 user_data 中。
- CCS811 傳感器需要預熱,預熱時間小於15秒,此前的數據一直是 eTVOC 爲 0,eCO2 爲 400。
- 數據手冊建議在第一次使用傳感器時,先運行48小時。
- CCS811 傳感器會自動校準基線,但是這個過程非常緩慢。數據手冊對基線校準的建議:在運行傳感器的第一週,建議每24小時保存一個新的基線,運行1周後,可以每1-28天保存一次。
- 如需使用中斷功能,請將傳感器的 INT 引腳連接到主控板相應的中斷引腳。