跳到主要内容

SGP30传感器测量Tvoc和eCO2

注意:CCS811已于2022年初停产,该传感器厂家提供了ENS160作为CCS811的替代品。所以本教程在原来CCS811基础上增加了ENS160和SGP30这两种传感器相关内容,由于之前CCS811突然停产导致其价格大涨,虽然厂家提供了ENS160替代品,但为了开发者能有更多的选择,我们另外增加了Sensirion公司的SGP30传感器,这两种传感器开发者甚至无需关注其差别,只要将任意一种传感器和开发板的IIc接口(SCL,SDA)连接,代码会自动识别其种类并输出Tvoc和eCO2值。

一、本例程实现功能

通过CCS811/ENS160/SGP30传感器模块测量室内空气质量(IAQ),并将测量到的Tvoc(单位ppb)、eCO2(单位ppm)数据打印输出在电脑串口调试终端上面。

注意:推荐使用 SGP30,CCS811已被其芯片厂家停产。

二、基本概念

Tvoc: 室内空气品质的研究人员通常把他们采样分析的所有室内有机气态物质称为TVOC,它是Volatile Organic Compound三个词第一个字母的缩写,各种被测量的VOC被总称为总挥发性有机物TVOC(Total Volatile Organic Compounds)。TVOC是三种影响室内空气品质污染中影响较为严重的一种。TVOC是指室温下饱和蒸气压超过了133.32pa的有机物,其沸点在50℃至250℃,在常温下可以蒸发的形式存在于空气中,它的毒性、刺激性、致癌性和特殊的气味性,会影响皮肤和黏膜,对人体产生急性损害。世界卫生组织(WHO)、美国国家科学院/国家研究理事会(NAS/NRC)等机构一直强调TVOC是一类重要的空气污染物。美国环境署(EPA)对VOC的定义是:除了一氧化碳,二氧化碳,碳酸,金属碳化物,碳酸盐以及碳酸铵外,任何参与大气中光化学反应的含碳化合物。

eCO2: CCS811传感器测量出的等效二氧化碳浓度。

PPb(part per billion),是一个无量纲量,在溶液中是用溶质质量占全部溶液质量的十亿分比来表示的浓度,也称十亿分比浓度(1/10,十亿分之一,10-9),经常用于浓度非常小的场合下。与之相似的还有ppm(part per million,百万分之一),ppb=1/1000ppm。

三、接线图

layout

以上线路图同样适用于ENS160和SGP30模块,并且只用接VCC,GND,SDA,SCL这四个引脚即可

四、材料清单

名称推荐购买链接(或者您可以自己制作)模块/芯片硬件资料下载
CCS811/ENS160/SGP30传感器模块,
建议购买SGP30模块,供应商更多,成本也更低一些
CCS811/ENS160/SGP30购买链接下载地址
声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可,如果需要更低的成本建议自己开发硬件模块或定制。

product1

五、CCS811版本完整代码(CCS811已停产,不建议使用)

--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--配置CCS811气体传感器开始工作,占用IIC0接口,每1秒出一组测量结果
LIB_CCS811Config("IIC0", "1S")
--开始大循环
while(GC(1) == true)
do
--查询传感器是否出数
flag, tvoc, eCO2, raw_i, raw_u = LIB_CCS811GetResult()
if flag == 1 then
--打印Tvoc(单位ppb)和eCO2(单位ppm)的值以及rawdata数据i和u
print(string.format("Tvoc:%d, eCO2:%d, i=%d, u=%d", tvoc,eCO2,raw_i,raw_u))
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

代码运行结果

电脑串口调试终端上显示的Tvoc(单位ppb)、eCO2(单位ppm)、以及Rawdata如下图:

result

CCS811官方资料中需要注意的地方

gf0

gf1

六、ENS160/SGP30版本完整代码(建议使用)

以下代码不区分ENS160和SGP30,只要VCC,GND,SCL,SDA连上ShineBlink开发板之后,运行以下代码ShineBlink开发板会自动识别是ENS160还是SGP30。

--配置USB以虚拟串口模式工作,这样调用print()函数就会在电脑串口终端打印输出
LIB_UsbConfig("CDC")
--配置ENS160/SGP30气体传感器开始工作,占用IIC0接口,每1秒出一组测量结果
LIB_TVOCConfig("IIC0", "1S")
--开始大循环
while(GC(1) == true)
do
--查询传感器是否出数
flag, tvoc, eCO2, AQI, ValidityFlag = LIB_TVOCGetResult()
if flag == 1 then
--打印Tvoc(单位ppb)和eCO2(单位ppm)的值以及AQI空气质量等级
--如果接的传感器是SGP30,则AQI和ValidityFlag无用,它们将一直是固定的0值
print(string.format("Tvoc:%d, eCO2:%d, AQI=%d, ValFlag=%d", tvoc,eCO2,AQI,ValidityFlag))
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

代码运行结果

ens160_result

ENS160/SGP30官方资料中需要注意的地方

(一)ENS160“热身”时间

  1. ENS160传感器首次上电需要经过连续工作24小时后,数据会更准确一些。注意:这个24小时是传感器出厂后仅需一次就够了,不是每次上电都需要24小时。官方描述如下:

ens_gf0

  1. ENS160上电后需要一个3分钟的热身时间,3分钟后数据会更加准确。官方描述如下:

ens_gf1

  1. 更多需要注意的信息信息请参看ENS160 DataSheet

(二)SGP30"热身"时间

  1. SGP30每次上电后的前15秒中其输出的传感器数据会保持固定的Tvoc:0, eCO2:400,15秒后将会正常
  2. SGP30首次出厂需要连续工作24小时的预热期后,数据将会更加准确
  3. 更多需要注意的信息信息请参看SGP30 DataSheet

(三)关于eCO2,AQI空气质量等级介绍

eCO2

ens_gf3

AQI

ens_gf4