1297|1

61

帖子

2

资源

一粒金砂(中级)

RT-Thread应用实战-TI温湿度HDC1000软件包设计与制作

本帖最后由 nich20xx 于 2020-5-31 17:16 编辑

 

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传感器工作原理

image.png

图2.1 HDC1000功能框图

HDC1000是TI公司开发的一款集成式湿度和温度传感器, 其能够以较低功耗提供出色的测量精度。HDC1000的传感元件位于器件底部,有助于 HDC1000 免受粉尘、灰尘以及其他环境污染物的影响,从而更加稳定可靠。

HDC1000通过IIC接口,作为IIC从设备与Host MCU进行数据交互。

HDC1000内置了加热元件(Heater), 软件可短暂地打开,用于消散设备长期暴露在高湿度环境中产生的冷凝和湿气, 从而增加湿度传感器的可靠性。此外,加热功能也可用于验证集成温度传感器的功能。

注:推荐使用换代产品HDC2010代替HDC1000。HDC2010具有更好的特性功能,但是两者硬件接口与软件接口都不兼容。

image.png

表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 硬件设计

image.png

图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 --> 
    • image.png
  1. 采样转换完成判断。采样完成可以根据实际情况,有如下两种方式:
    1. HDC1000提供了一个DRDY/INT硬件引脚,用于指示温度\湿度采样转换完成,该引脚可以用于唤醒Host MCU。
    2. 若实际应用电路未使用该引脚,则可以采用了固定延时的方式来等待传感器转换完成,采样转换时间如下所示:

image.png 图2.3 温度与湿度采样转换时间

  1. 单次采样(按需触发),这里默认采用序列采样方式(即每次采样,先后执行一次温度与湿度采样)

image.png

图2.4 单次采样流程

2.3.1 IIC从机地址

由图2.2电路图(ADR0 = 0、ADR1 = 0)可知,当前HDC1000传感器的IIC从机地址为0x40。

注:若使用的是STM32硬件IIC驱动,则传入HAL_I2C_Init()的从机地址是0x80(8位地址形式)

/* according to hdc1000 spec */
// 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时序,如下所示:

image.png

图2.5 读取温度与湿度的IIC时序(序列采样方式)

读取温湿度值的IIC时序实例,如下所示

image.png

图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 温湿度值结果转换

image.png

图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软件包的主要实现文件

image.png

注: 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,查看对应设备是否注册成功

image.png

 

  1. sensor,查看sensor驱动框架当前支持的Finsh/msh命令

image.png

注: rt_kprintf 不支持浮点数与特殊字符℃ 打印

  1. sensor info,查看sensor驱动框架当前挂载的传感设备的具体信息(测量范围等)。

image.png

 

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个字符的话会被裁掉。

image.png

图 sensor驱动框架自动添加前缀字符表

 

通过msh输入sensor probe temp_hdc1000,可看到如下返回内容:

image.png

  1. sensor read  YYY,读取传感器值。YYY为读取次数.

image.png

  1. 通过 sensor probe humi_hdc1000切换到湿度传感器设备,然后通过sensor read 5读取。

image.png

  1. 输入hdc1000_selftest,这是hdc1000软件包提供的一个快速自测试程序。

image.png

3.3.2 应用程序调用

  1. 在应用程序中,正常注册设备后(rt_hw_hdc1000_init("hdc1000", &cfg)),
  2. 通过设备(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驱动框架的不同传感类型的单位。

image.png

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大环节:

    1. HDC1000软件包源码文件 (本文第3章节)
    2. HDC1000软件包索引(包信息)

image.png

4.1 建立git代码仓库

4.1.1 使用工具

    • git 分布式版本管理工具
      • 在windows下,Git 工具提供了Git GUI或者Git Bash两种操作方式
    • git服务器
      • 这里选择目前使用最为广泛的github

4.1.2 创建git本地仓库

  1. 创建本地仓库
    1. 若使用Git Bash,则打开Git Bash命令行窗口,输入cd /d xxx 切换到指定文件夹(比如3章节的软件包代码文件夹)(/d为windows切换盘符作用),然后执行git init;
    2. 若使用Git GUI,则在指定文件夹,鼠标右键->在弹出窗口选择“Git GUI Here”->弹出新窗口 ->"Create New Repository"
  1. 配置git仓库的用户信息。

git config user.name "自己github用户名"

git config user.name "自己github注册邮箱"

配置好后,可通过 git config --list查看是否生效

  1. 对于不需要加入版本管理的文件,可设置过滤文件.gitignore。

build                           # 过滤bulid整个文件夹内容

Debug                         # 过滤Debug整个文件夹内容

documentation/html    # 过滤documentation/html文件夹所有内容

*~                               # 过滤以~结尾的所有文件

*.o                               # 过滤以.o结尾的所有文件

*.uvguix*                      # 过滤包含.uvguix的所有文件

  1. 至此,就可以在本地进行代码文件的版本管理。

4.1.3 创建开发者的git远程仓库

  1. 建立软件包的仓库(Repository),开发者自己可在github、gitee等远程仓库平台(git服务器)创建,并上传软件包代码。

如下为在github创建的hdc1000代码仓库

image.png

  1. 点击“Create repository”,,就可以得到一个远程仓库的地址:git@github.com:Forest-Rain/hdc1000.git。
  2. 配置Github中的SSH秘钥
  1. 本地生成rsa key
    • 通过Git Bash命令窗口切换到本地项目文件夹,Bash窗口输入 ssh-keygen -t rsa,接下来按照提示进行。
  2. 登录github网站的"account settings",依次点击"Setting -> SSH and GPG Keys"->"New SSH key",将本地的rsa key(id_rsa.pub里的字符串)填写进去,
  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,通过是否建立成功

  1. 至此,就可以将本地仓库同步到远程仓库。

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 仓库等信息)

image.png

图4.1 HDC1000软件包索引

  1. 执行完第2步,在你打开ConEmu的当前文件路径下,会自动生成一个名为 hdc1000的文件夹,里面包含两个文件:
    • Kconfig
    • package.json

4.3 修改HDC1000软件包索引

对“4.1”中生成的软件包索引文件进一步修改完善。

image.png

 

 

4.4 本地测试软件包索引

  1. 拷贝软件包索引文件hdc1000到env工具包的对应分类目录下,这里是 \packages\peripherals\sensors目录

image.png

  1. 修改 \packages\peripherals\sensors同级目录中的Kconfig文件,手动添加HDC1000软件包源信息

image.png

 

  1. 正确完成上述步骤后,在env -> menucofig -> RT-Thread online packages -> peripheral libraries and drivers -> sensor drivers,可以看到HDC1000软件包
    1. 测试软件包下载是否OK
    2. 然后测试软件包功能编译是否OK,功能是否OK等

 

image.png

4. 本地测试完成后,通过git push提交或更新软件包源代码到开发者自己的github仓库(如本文的https://github.com/Forest-Rain/packages

4.5 提交软件包索引

  1. 若之前未使用过RT-Thread软件包索引仓库(https://github.com/RT-Thread/packages),先fork该仓库到开发者自己github仓库,然后将新fork的仓库git clone到本地。
  2. 添加hdc1000软件包与Kconfig到packages指定的分类目录下,然后git push提交

image.png

  1. 登录开发者自己fork的packages仓库github网页(如本文https://github.com/Forest-Rain/packages),找到自己提交的 Pull Request 提示,填写必要描述信息,便可提交PR到在RT-Thread官方的软件包索引仓库( https://github.com/RT-Thread/packages)。
  2. 等待RT-Thread官方PR审查与合并代码后,其他用户便可通过本地env工具,执行 pkgs --update 拉取新提交的软件包索引,并自动同步env工具menuconfig中显示的内容。

5 参考


回复

97

帖子

1

资源

一粒金砂(中级)

666 作者可以认识下吗?


回复
您需要登录后才可以回帖 登录 | 注册

关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表