技术标签: RT-Thread RT-Thread 系列 软件包 物联网 传感器 CCS811
ccs811 软件包是 CCS811 气体传感器的驱动软件包。CCS811 是一款低功耗数字气体传感器,用于检测室内低水平的挥发性有机化合物和二氧化碳浓度,内部集成微控制器单元 (MCU) 和模数转换器(ADC),并提供通过标准 I2C 数字接口获取 CO2 或 TVOC 数据。
CCS811 模块支持 I2C 接口,IIC 地址可配置为 0x5A 或 0X5B。
CCS811 支持多种模式:每1秒、10秒、1分钟、250毫秒测量一次以及休眠模式,这些模式在传感器测量期间进行了低功耗优化,因此 CCS811 适用于便携式应用。CCS811 支持浓度报警,当浓度超过用户设置的阈值时,INT 引脚就会触发。
注意:该芯片对 IIC 进行了时钟延展,有些控制器不支持时钟延展,例如树莓派。
为了在项目中快速集成 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 中。
ccs811 软件包目前提供两个配置选项:
PKG_USING_CCS811_I2C_ADDRESS
)PKG_USING_CCS811_SAMPLE
)用户可根据 CCS811 实际的硬件连接,选择 I2C 地址为 0x5A 或 0x5B。
ccs811 软件包中提供了测试示例,只需在 menuconfig 配置中勾选 “Enable ccs811 sample” 即可。为了完成测试,还需要开启 “Sensor cmd” 功能。
对了,别忘了配置 I2C 总线!ccs811 软件包的示例默认使用 i2c1,因此需要在 menuconfig 中配置好 I2C1 Bus。
配置完成后即可编译,下载到开发板中进行下一步实验。
因为 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 示例中已经有了。因此,我们不用敲一行代码!
如果一切正常,我们就可以来到 msh 终端。
输入 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 中会注册为两个设备。
传感器初始化成功后,我们就可以使用 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
执行 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
由于前面选中的是 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
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
...
要操作传感器模块,首先需要创建一个传感器对象。
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()
函数检查传感器是否准备好了。
rt_uint16_t ccs811_get_baseline(ccs811_device_t dev);
参数 | 描述 |
---|---|
dev | 传感器对象句柄 |
返回 | —— |
16位的基线值 | 读取成功 |
0 | 读取失败 |
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 气体浓度。
ccs811 软件包已对接 sensor 驱动框架,操作传感器模块之前,只需调用下面接口注册传感器设备即可。
rt_err_t rt_hw_ccs811_init(const char *name, struct rt_sensor_config *cfg);
参数 | 描述 |
---|---|
name | 传感器设备名称 |
cfg | sensor 配置信息 |
返回 | —— |
RT_EOK | 创建成功 |
-RT_ERROR | 创建失败 |
rt_device_open
函数时创建,因此 read 之前务必确保两个设备都开启成功。shell下的read命令的作用是從標准流中讀取輸入,並把讀取的內容放到某個變量中。用法:read [-ers] [-a array] [-ddelim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name...]此篇主要介紹參數read + -p的使用使用read...
在林荫道、城市峡谷等复杂环境下,GNSS观测值往往会出现大量粗差(由于环境原因大幅度偏离实际值),影响定位结果精度。同样,我们预设的动力学模型只是载体运动过程的近似描述,有时也会存在显著异常,影响定位精度。抗差自适应卡尔曼滤波可用于缓解上述问题,其主要包含抗差估计和自适应卡尔曼滤波两部分。抗差估计通过适当扩大异常观测方差(R)以消除和削弱粗差对参数估值的影响。自适应卡尔曼滤波采用自适应因子降低异常动力学模型信息对滤波状态的影响(扩大状态协方差阵P阵)。
有序单链表转换为平衡二叉树。TreeNode *buildTree(ListNode *&list,int n){ if (n == 0) return NULL; TreeNode *root = new TreeNode(0); root->left = buildTree(list,n / 2); root->val = list->val; list = list->n
1.从docker hub查找 redis 一般是第一个点击去。选择tags 找一个版本 有版本号的 我找到的是6.0.6不要找到其他linux的发型版本执行命令docker pull redis:6.0.6镜像已经到我们本地创建redis配置文件 /home/config/redis/redis.conf,配置文件可以自己配 或者从官网下载一个http://download.redis.io/redis-stable/redis.conf创建...
这是嵌入式硬件使用Altium Designer 绘制原理图时遇到的Bug。
加密:加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。作用:对一串信息进行加密防止被第三方窃取并破解。数字签名:数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。只有信息的发...
首先声明,是使用的YunYang1994大神的版本,原始代码地址在这里:https://github.com/YunYang1994/TensorFlow2.0-Examples。感谢大神的分享。我是同时在windows和TX2上跑的,都能跑通,但是在我的笔记本window 10上非常的慢,视频卡顿严重。一、检查环境先打开docs/requirements.txt查看手工检查环境而不是直接开始下载安装使用,是为了避免无意中升级某些包导致环境有问题,最近忙没有时间去处理异常和重装环境。
status:更新中…0x01提示就是flag。0x02 ext3考察linux下如何挂载光盘,base64编码。挂载下载的光盘文件到linux_cd目录下:然后在目录下找到flag.txt:最后base64解码即可:0x03 base64stegozip伪加密,但是好像使用7Z打开就直接可以解压,哈哈。解压之后有一个stego.txt,隐写,打开来看是一长串base6...
由于个人项目需要对电池管理系统进行仿真测试,需要将Peak-Can上的报文发送至Simulink接收进行处理,发现网上没有很完整的教程,自己查阅资料摸索出来后供大家参考!
我们的游戏终于开通了网通区,但一个在电信区完全正常的功能到了网通区变成残废了。一种存储于memcached中的每日临时游戏代币在网通区完全不会被消耗,搞得网通区的玩家们刷的不亦乐乎!当然,也有一部分正直的玩家向我们反馈了问题。问题出在哪儿呢?首先,memcached已经提供了incr和decr两个计数操作分别用来进行增值计数和减值计数,但是居然就有开发人员牛逼到用incr操作来进行减值,用
买了本本了,有发现更好的配置的,有点后悔了,但是有能怎么样那,已经买回来了,无法退回了。要怪只能怪自己,没有好好看一下就决定买了, 已经无可挽回了。看来冲动就是魔鬼呀。但是后悔有什么用,所以不能后悔了。于事无补了,那后悔什么那?但是人的心理就是很奇怪,不是吗?不想想的非要想。我能不能有一种豁达的心胸那,不要那么斤斤计较那?什么时候我才不那么小家子气?但是我可以用
小T作为班长,要筹备这次的主题班会。班主任给了小T几个任务。