目录
1 概述
2 HDC1000应用原理
2.1 HDC1000传感器工作原理
2.1.1 工作模式
2.1.2 典型应用场景
2.2 硬件设计
2.3 软件设计
2.3.1 IIC从机地址
2.3.2 IIC时序
2.3.3 温湿度值结果转换
3 HDC1000软件包功能设计
3.1 HDC1000软件包功能简介
3.2 HDC1000软件包功能实现
3.2.1 HDC1000软件包的依赖
3.2.2 HDC1000软件包的主要实现文件
3.3 HDC1000软件包使用
3.3.1 Finsh/Msh命令窗口
3.3.2 应用程序调用
4 RT-Thread HDC1000软件包索引制作与发布
4.1 建立git代码仓库
4.1.1 使用工具
4.1.2 创建git本地仓库
4.1.3 创建开发者的git远程仓库
4.2 创建HDC1000软件包索引
4.2.1 使用工具(RT-Thread Env)
4.2.2 生成软件包索引步骤
4.3 修改HDC1000软件包索引
4.4 本地测试软件包索引
4.5 提交软件包索引
5 参考
1 概述
本文主要讲述了基于RT-Thread Sensor框架实现的温湿度传感器HDC1000软件包,同时详细记录了RT-Thread传感器软件包的制作过程。
本文的主要内容提要:
- 低功耗温湿度传感器HDC1000的基础知识
- HDC1000的工作机制
- HDC1000软件包功能设计
- HDC1000软件包的功能简介
- HDC1000软件包的使用与测试
- HDC1000软件包制作与发布
- 制作软件包索引
- 软件包本地测试
- PR推送
HDC1000软件包的代码仓库:
https://github.com/Forest-Rain/hdc1000
2 HDC1000应用原理
2.1 HDC1000传感器工作原理
图2.1 HDC1000功能框图
HDC1000是TI公司开发的一款集成式湿度和温度传感器, 其能够以较低功耗提供出色的测量精度。HDC1000的传感元件位于器件底部,有助于 HDC1000 免受粉尘、灰尘以及其他环境污染物的影响,从而更加稳定可靠。
HDC1000通过IIC接口,作为IIC从设备与Host MCU进行数据交互。
HDC1000内置了加热元件(Heater), 软件可短暂地打开,用于消散设备长期暴露在高湿度环境中产生的冷凝和湿气, 从而增加湿度传感器的可靠性。此外,加热功能也可用于验证集成温度传感器的功能。
注:推荐使用换代产品HDC2010代替HDC1000。HDC2010具有更好的特性功能,但是两者硬件接口与软件接口都不兼容。
表2.1 HDC1000主要功能特性
特性参数 |
说明 |
|
工作温度范围 |
-40°C 至 125°C |
|
温度精度
|
±0.2°C | |
工作相对湿度 (RH)
|
0% 至 100%
|
|
相对湿度精度 | ±3%
|
|
测量分辨率 |
温度:11, 14 湿度:8, 11, 14 |
|
封装 |
DSBGA(8凸点) 2.04mm x 1.59mm
|
|
休眠电流 | 200nA |
|
平均电源电流(每秒测量 1 次 ) |
仅 RH(11 位) |
820nA
|
RH(11 位)+ 温度(11 位) |
1.2µA
|
|
电源电压 | 3V 至 5V |
|
用户接口
|
IIC |
|
寄存器数量 |
8个(每个寄存器为16bit) |
2.1.1 工作模式
HDC1000有两种工作模式:睡眠模式(Sleep Mode)与测量模式(Measurement Mode)。
- 睡眠模式
- 上电后默认处于睡眠模式。Host MCU通过IIC接口发送指令来唤醒传感器,并对传感器进行读写操作。在完成一次有效温度\湿度测量后,HDC1000自动回到睡眠模式。
- 测试模式
- HDC1000测量模式只支持(手动)按需触发(Trigger on Demand)。( HDC2010支持自动定时采样模式)
2.1.2 典型应用场景
- IoT低功耗应用,如
- 智能恒温器 ...
- 环境标签
- 烟雾和热量探测器
- 智能冰箱
- 可穿戴设备
- 冷链运输
- 智能家居助理
2.2 硬件设计
图2.2 HDC1000典型应用电路
HDC1000有2根地址线.因此一条IIC总线上,最多可以挂载4个HDC1000。
器件型号 |
ADR1 |
ADR0 |
地址描述(7-bit address) |
HDC1000 |
0 |
0 |
100 0000 |
0 |
1 |
100 0001 |
|
1 |
0 |
100 0010 |
|
1 |
1 |
100 0011 |
2.3 软件设计
获取HDC1000的温度与湿度数据主要是MCU通过IIC接口对指定寄存器读写来完成的,具体实现过程主要包括以下内容:
1. IIC通信驱动
- 使用RT-Thread系统提供的模拟I2C驱动,来访问HDC1000传感器,可查看 env工具 --> menuconfig --> RT-Thread Components --> Device Drivers -->
2. 采样转换完成判断。采样完成可以根据实际情况,有如下两种方式:
- HDC1000提供了一个DRDY/INT硬件引脚,用于指示温度\湿度采样转换完成,该引脚可以用于唤醒Host MCU。
- 若实际应用电路未使用该引脚,则可以采用了固定延时的方式来等待传感器转换完成,采样转换时间如下所示:
图2.3 温度与湿度采样转换时间
- 单次采样(按需触发),这里默认采用序列采样方式(即每次采样,先后执行一次温度与湿度采样)
图2.4 单次采样流程
2.3.1 IIC从机地址
由图2.2电路图(ADR0 = 0、ADR1 = 0)可知,当前HDC1000传感器的IIC从机地址为0x40。
注:若使用的是STM32硬件IIC驱动,则传入HAL_I2C_Init()的从机地址是0x80(8位地址形式)
// ADR0 = 0,ADR1 = 0 ==> hdc1000 slave address 0x40(7-bit address)
#define HDC1000_DEVICE_IIC_BUS_ADDRESS 0x40
2.3.2 IIC时序
HDC1000主要IIC时序包括读写配置寄存器(Configuration Register(0x02))、触发采样(rigger Humidity/Temperature Measurement(0x00\0x01))、读取温度与温度(Read Humidity/Temperature Measurement)。
读取温度与湿度的IIC时序,如下所示:
图2.5 读取温度与湿度的IIC时序(序列采样方式)
读取温湿度值的IIC时序实例,如下所示
图2.6 读取温度与湿度IIC实例(序列采样方式)
特别注意:
HDC1000温度与湿度寄存器位为16bit,高位先发(大端模式),因此读回的数值需要转换为小端模式。
对读回的寄存器数据的处理代码如下所示:
if (rt_i2c_transfer((struct rt_i2c_bus_device *)dev->bus, msgs, 1) == 1)
{
res = RT_EOK;
*temp_raw = (buffer[0] << 8) | buffer[1];
*humi_raw = (buffer[2] << 8) | buffer[3];
}
else
{
res = -RT_ERROR;
}
2.3.3 温湿度值结果转换
图2.7 温湿度结果转换计算式
按照图2.7公式,将获取到的温度\湿度寄存器值转换为实际的温度(℃)与湿度(%RH)。
3 HDC1000软件包功能设计
3.1 HDC1000软件包功能简介
HDC1000软件包支持对温湿度数据的快速采集。
功能项 \ 包含设备 |
温度计 | 湿度计 |
通讯接口 | ||
IIC | √ | √ |
工作模式 | ||
轮询 | √ | √ |
中断 | ||
电源模式 | ||
掉电 |
|
|
低功耗 | √ | √ |
测量范围 | ||
自检 | √ |
√ |
多实例 |
3.2 HDC1000软件包功能实现
3.2.1 HDC1000软件包的依赖
- RT-Thread 4.0.0+
- Sensor 组件
- IIC 驱动:HDC1000 设备使用 IIC 进行数据通讯,需要RT-Thread系统 IIC 驱动框架支持;
3.2.2 HDC1000软件包的主要实现文件
注: Sconscript的编写可参照RT-Thread官方的Scons构建工具说明文档:https://www.rt-thread.org/document/site/programming-manual/scons/scons/
3.3 HDC1000软件包使用
HDC1000软件包的使用可以使用Finsh/Msh命令窗口与应用程序调用两种方式。
3.3.1 Finsh/Msh命令窗口
可通过RT-Thread的CLI工具Finsh/msh 输入以下命令进行HDC1000软件包使用与测试:
1. list_device,查看对应设备是否注册成功
2. sensor,查看sensor驱动框架当前支持的Finsh/msh命令
注: rt_kprintf 不支持浮点数与特殊字符℃ 打印
3. sensor info,查看sensor驱动框架当前挂载的传感设备的具体信息(测量范围等)。
4.sensor probe XXX,查看当前传感设备是否可用。
- XXX参数为注册的 sensor 设备名,即调用rt_hw_hdc1000_init(const char *name, struct rt_sensor_config *cfg)时传入的*name参数
- eg: 本例中,调用rt_hw_hdc1000_init("hdc1000", &cfg)注册设备
- sensor驱动框架会为传入的 *name 自动添加一个前缀
- 如
加速度计
类型的传感器会自动添加acce_
的前缀。- 由于系统默认的设备名最长为 7 个字符,因此如果传入的名称超过3个字符的话会被裁掉。
- 如
图 sensor驱动框架自动添加前缀字符表
5. 通过msh输入sensor probe temp_hdc1000,可看到如下返回内容:
6. sensor read YYY,读取传感器值。YYY为读取次数.
7. 通过 sensor probe humi_hdc1000切换到湿度传感器设备,然后通过sensor read 5读取。
8. 输入hdc1000_selftest,这是hdc1000软件包提供的一个快速自测试程序。
3.3.2 应用程序调用
- 在应用程序中,正常注册设备后(rt_hw_hdc1000_init("hdc1000", &cfg)),
- 通过设备(rt_device)框架提供的API(rt_device_find\rt_device_open\rt_device_read等)来访问传感器设备。
详细可查看 sensor_ti_hdc1000_example.c 示例代码
int rt_hw_hdc1000_port(void) { struct rt_sensor_config cfg; rt_int8_t result; cfg.intf.dev_name = "i2c1"; cfg.intf.user_data = (void *)HDC1000_SLAVE_ADDR_DEFAULT; cfg.irq_pin.pin = RT_PIN_NONE; result = rt_hw_hdc1000_init("hdc1000", &cfg); return result; } INIT_APP_EXPORT(rt_hw_hdc1000_port); void application_get_sensor_val(void) { struct rt_sensor_data sensor_data; rt_size_t res; rt_device_t dev = RT_NULL; dev = rt_device_find("temp_hdc1000"); if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) { LOG_E("open device failed!"); return; } res = rt_device_read(dev, 0, &sensor_data, 1); if (res != 1) { LOG_E("read data failed!size is %d", res); } else { LOG_I("temp:%3d.%dC, timestamp:%5d", sensor_data.data.temp / 10, sensor_data.data.temp % 10, sensor_data.timestamp); LOG_I("humi:%3d.%dC, timestamp:%5d", sensor_data.data.humi / 10, sensor_data.data.humi % 10, sensor_data.timestamp); } rt_device_close(dev); }
注1:
- 关闭设备接口(rt_device_open)和打开设备接口(rt_device_close)需配对使用,打开一次设备对应要关闭一次设备,这样设备才会被完全关闭,否则设备仍处于未关闭状态。
注2:
- sensor驱动框架中,fetch_data接口中,温度值与湿度值扩大了10倍,具体可查看Sensor驱动框架的不同传感类型的单位。
4 RT-Thread HDC1000软件包索引制作与发布
完成HDC1000软件包主体功能后,接下来进行RT-Thread软件包索引的制作与发布。
RT-Thread采用了类似高级语言(比如python)的包管理方式,创新地将软件包引入到开源RTOS,这是一种富有活力的社区管理形式。
注:软件包的制作可以参考RT-Thread官方文档的《软件包开发指南》https://www.rt-thread.org/document/site/development-guide/package/package/
基于RT-Thread的HDC1000软件包的制作主要涉及2大环节:
- HDC1000软件包源码文件 (本文第3章节)
- HDC1000软件包索引(包信息)
4.1 建立git代码仓库
4.1.1 使用工具
- git 分布式版本管理工具
- 在windows下,Git 工具提供了Git GUI或者Git Bash两种操作方式
- git远程仓库(服务器)
- 这里选择目前使用最为广泛的github
4.1.2 创建git本地仓库
1. 创建本地仓库
- 若使用Git Bash,则打开Git Bash命令行窗口,输入cd /d xxx 切换到指定文件夹(比如3章节的软件包代码文件夹)(/d为windows切换盘符作用),然后执行git init;
- 若使用Git GUI,则在指定文件夹,鼠标右键->在弹出窗口选择“Git GUI Here”->弹出新窗口 ->"Create New Repository"
2. 配置git仓库的用户信息。
git config user.name "自己github用户名"
git config user.name "自己github注册邮箱"
3. 配置好后,可通过 git config --list查看是否生效
- 对于不需要加入版本管理的文件,可设置过滤文件.gitignore。
build # 过滤bulid整个文件夹内容
Debug # 过滤Debug整个文件夹内容
documentation/html # 过滤documentation/html文件夹所有内容
*~ # 过滤以~结尾的所有文件
*.o # 过滤以.o结尾的所有文件
*.uvguix* # 过滤包含.uvguix的所有文件
4. 至此,就可以在本地进行代码文件的版本管理。
4.1.3 创建开发者的git远程仓库
1. 建立软件包的仓库(Repository),开发者自己可在github、gitee等远程仓库平台(git服务器)创建,并上传软件包代码。
如下为在github创建的hdc1000代码仓库
2. 点击“Create repository”,,就可以得到一个远程仓库的地址:git@github.com:Forest-Rain/hdc1000.git。
- 配置Github中的SSH秘钥
- 本地生成rsa key
- 通过Git Bash命令窗口切换到本地项目文件夹,Bash窗口输入 ssh-keygen -t rsa,接下来按照提示进行。
- 登录github网站的"account settings",依次点击"Setting -> SSH and GPG Keys"->"New SSH key",将本地的rsa key(id_rsa.pub里的字符串)填写进去,
- 本地生成rsa key
3. 建立git远程仓库与本地仓库的关联。
git remote add [远程仓库的别名] [远程仓库地址]
注:设置 origin为[远程仓库地址]的别名,后续可以直接使用origin来访问该远程仓库,[远程仓库的别名]可以任意自定义
如: 在github网页端上创建好一个hdc1000仓库后,在本地Git Bash输入如下命令
git remote add origin git@github.com:Forest-Rain/hdc1000.git
4. 关联建立完成,可通过git remote -v,通过是否建立成功
- 至此,就可以将本地仓库同步到远程仓库。
git add .
git commit "V1.0 更新说明信息"
4.2 创建HDC1000软件包索引
4.2.1 使用工具(RT-Thread Env)
- RT-Thread 的 Env 工具为我们提供了自动生成软件包索引(文件)的向导功能。
4.2.2 生成软件包索引步骤
1. 在Env输入pkgs --wizard,进入向导功能
2. 按照提示填写软件包的相关信息( Package 名、版本号、类别、作者、licence、Git 仓库等信息)
图4.1 HDC1000软件包索引
3. 执行完第2步,在你打开ConEmu的当前文件路径下,会自动生成一个名为 hdc1000的文件夹,里面包含两个文件:
- Kconfig
- package.json
4.3 修改HDC1000软件包索引
对“4.1”中生成的软件包索引文件进一步修改完善。
4.4 本地测试软件包索引
- 拷贝软件包索引文件hdc1000到env工具包的对应分类目录下,这里是 \packages\peripherals\sensors目录
1. 修改 \packages\peripherals\sensors同级目录中的Kconfig文件,手动添加HDC1000软件包源信息
2. 正确完成上述步骤后,在env -> menucofig -> RT-Thread online packages -> peripheral libraries and drivers -> sensor drivers,可以看到HDC1000软件包
- 测试软件包下载是否OK
- 然后测试软件包功能编译是否OK,功能是否OK等
4. 本地测试完成后,通过git push提交或更新软件包源代码到开发者自己的github仓库(如本文的https://github.com/Forest-Rain/packages)
4.5 提交软件包索引
- 若之前未使用过RT-Thread软件包索引仓库(https://github.com/RT-Thread/packages),先fork该仓库到开发者自己github仓库,然后将新fork的仓库git clone到本地。
- 添加hdc1000软件包与Kconfig到packages指定的分类目录下,然后git push提交
- 登录开发者自己fork的packages仓库github网页(如本文https://github.com/Forest-Rain/packages),找到自己提交的 Pull Request 提示,填写必要描述信息,便可提交PR到在RT-Thread官方的软件包索引仓库( https://github.com/RT-Thread/packages)。
- 等待RT-Thread官方PR审查与合并代码后,其他用户便可通过本地env工具,执行
pkgs --update
拉取新提交的软件包索引,并自动同步env工具menuconfig中显示的内容。
5 参考
- TI HDC1000官方资料入口
- http://www.ti.com.cn/product/cn/HDC1000
- TI HDC2010官方资料入口
- http://www.ti.com.cn/product/cn/HDC2010/technicaldocuments
- 传感器驱动框架介绍
- https://www.rt-thread.org/document/site/development-guide/sensor/sensor_driver/
- RT-Thread 支持的传感器列表
- https://www.rt-thread.org/document/site/programming-manual/device/sensor/sensor_list/
- 传感器驱动开发指南
- https://www.rt-thread.org/document/site/development-guide/sensor/sensor_driver_development/
- 软件包开发指南
- https://www.rt-thread.org/document/site/development-guide/package/package/
- RT-Thread官方的软件包索引仓库
- https://github.com/RT-Thread/packages