在 RT-Thread 中快速使用 CCS811 氣體傳感器

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 infosensor 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、注意事項

  1. 爲傳感器對象提供靜態創建和動態創建兩種方式,如果使用動態創建,請記得在使用完畢釋放對應的內存空間。
  2. 由於 CCS811 模塊包含一個 TVOC 傳感器和一個 eCO2 傳感器,因此在 sensor 框架中會註冊兩個設備,內部提供1位 FIFO 緩存進行同步,緩存空間在調用 rt_device_open 函數時創建,因此 read 之前務必確保兩個設備都開啓成功。
  3. 由於使用 I2C 接口進行操作,因此註冊時需指定具體的 I2C 總線名稱,對應的句柄存放在 user_data 中。
  4. CCS811 傳感器需要預熱,預熱時間小於15秒,此前的數據一直是 eTVOC 爲 0,eCO2 爲 400。
  5. 數據手冊建議在第一次使用傳感器時,先運行48小時。
  6. CCS811 傳感器會自動校準基線,但是這個過程非常緩慢。數據手冊對基線校準的建議:在運行傳感器的第一週,建議每24小時保存一個新的基線,運行1周後,可以每1-28天保存一次。
  7. 如需使用中斷功能,請將傳感器的 INT 引腳連接到主控板相應的中斷引腳。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章