Преглед изворни кода

Merge pull request #9 from yangjie11/master

【添加】将 aht10 对接到 sensor 框架
朱天龙 (Armink) пре 6 година
родитељ
комит
f422818ea6
5 измењених фајлова са 373 додато и 170 уклоњено
  1. 53 112
      README.md
  2. 151 0
      README_OLD.md
  3. 0 58
      aht10.c
  4. 148 0
      sensor_asair_aht10.c
  5. 21 0
      sensor_asair_aht10.h

+ 53 - 112
README.md

@@ -1,8 +1,8 @@
-# AHT10 软件包
+# AHT10
 
-## 1 介绍
+## 简介
 
-AHT10 软件包提供了使用温度与湿度传感器 `aht10` 基本功能,并且提供了软件平均数滤波器可选功能。本文介绍该软件包的基本功能,以及 `Finsh/MSH` 测试命令等
+AHT10 软件包提供了使用温度与湿度传感器 `aht10` 基本功能,并且提供了软件平均数滤波器可选功能。并且本软件包新的版本已经对接到了 Sensor 框架,通过 Sensor 框架,开发者可以快速的将此传感器驱动起来。若想查看**旧版软件包**的 README 请点击[这里](README_OLD.md)
 
 基本功能主要由传感器 `aht10` 决定:在输入电压为 `1.8v-3.3v` 范围内,测量温度与湿度的量程、精度如下表所示
 
@@ -11,141 +11,82 @@ AHT10 软件包提供了使用温度与湿度传感器 `aht10` 基本功能,
 | 温度 | `-40℃ - 85℃` |`±0.5℃`|
 | 湿度 | `0% - 100%` |`±3%`|
 
-### 1.1 目录结构
+## 支持情况
 
-| 名称 | 说明 |
-| ---- | ---- |
-| aht10.h | 传感器使用头文件 |
-| aht10.c | 传感器使用源代码 |
-| SConscript | RT-Thread 默认的构建脚本 |
-| README.md | 软件包使用说明 |
-| aht10_datasheet.pdf | 官方数据手册 |
-
-### 1.2 许可证
+| 包含设备 | 温度 | 湿度 |
+| ---- | ---- | ---- |
+| **通信接口** |          |        |
+| IIC      | √        | √      |
+| **工作模式**     |          |        |
+| 轮询             | √        | √      |
+| 中断             |          |        |
+| FIFO             |          |        |
 
-AHT10 软件包遵循  Apache-2.0 许可,详见 LICENSE 文件。
+## 使用说明
 
-### 1.3 依赖
+### 依赖
 
-依赖 `RT-Thread I2C` 设备驱动框架。
+- RT-Thread 4.0.0+
+- Sensor 组件
+- IIC 驱动:aht10 设备使用 IIC 进行数据通讯,需要系统 IIC 驱动支持
 
-## 2 获取软件包
+### 获取软件包
 
-使用 `aht10` 软件包需要在 RT-Thread 的包管理器中选择它,具体路径如下:
+使用 aht10 软件包需要在 RT-Thread 的包管理中选中它,具体路径如下:
 
 ```
-RT-Thread online packages
-    peripheral libraries and drivers  --->
-        [*] aht10: digital humidity and temperature sensor aht10 driver library  --->
-        [*]    Enable support filter function
-               Version (latest)  --->
+RT-Thread online packages  --->
+  peripheral libraries and drivers  --->
+    sensors drivers  --->
+            aht10: digital humidity and temperature sensor aht10 driver library. 
+                         [ ]   Enable average filter by software         
+                               Version (latest)  --->
 ```
 
+**Enable average filter by software**:选择后会开启采集温湿度软件平均数滤波器功能。
 
-每个功能的配置说明如下:
-
-- `aht10: digital humidity and temperature sensor aht10 driver library`:选择使用 `aht10` 软件包;
-- `Enable support filter function`:开启采集温湿度软件平均数滤波器功能;
-- `Version`:配置软件包版本,默认最新版本。
-
-然后让 RT-Thread 的包管理器自动更新,或者使用 `pkgs --update` 命令更新包到 BSP 中。
-
-## 3 使用 aht10 软件包
-
-按照前文介绍,获取 `aht10` 软件包后,就可以按照 下文提供的 API 使用传感器 `aht10` 与 `Finsh/MSH` 命令进行测试,详细内容如下。
-
-### 3.1 API
-
-#### 3.1.1  初始化 
-
-`aht10_device_t aht10_init(const char *i2c_bus_name)`
-
-根据总线名称,自动初始化对应的 AHT10 设备,具体参数与返回说明如下表
-
-| 参数    | 描述                      |
-| :----- | :----------------------- |
-| name   | i2c 设备名称 |
-| **返回** | **描述** |
-| != NULL | 将返回 aht10 设备对象 |
-| = NULL | 查找失败 |
-
-#### 3.1.2  反初始化
-
-void aht10_deinit(aht10_device_t dev)
-
-如果设备不再使用,反初始化将回收 aht10 设备的相关资源,具体参数说明如下表
+**Version**:软件包版本选择,默认选择最新版本。
 
-| 参数 | 描述           |
-| :--- | :------------- |
-| dev  | aht10 设备对象 |
+### 使用软件包
 
-#### 3.1.3 读取温度
-
-float aht10_read_temperature(aht10_device_t dev)
-
-通过 `aht10` 传感器读取温度测量值,返回浮点型温度值,具体参数与返回说明如下表
-
-| 参数     | 描述           |
-| :------- | :------------- |
-| dev      | aht10 设备对象 |
-| **返回** | **描述**       |
-| != -50.0 | 测量温度值     |
-| = -50.0  | 测量失败       |
-
-#### 3.1.4 读取湿度
-
-float aht10_read_humidity(aht10_device_t dev)
-
-通过 `aht10` 传感器读取湿度测量值,返回浮点型湿度值,具体参数与返回说明如下表
-
-| 参数     | 描述          |
-| :------- | :------------ |
-| dev      | aht10设备对象 |
-| **返回** | **描述**      |
-| != 0.0   | 测量湿度值    |
-| =0.0     | 测量失败      |
-
-### 3.2 Finsh/MSH 测试命令
-
-aht10 软件包提供了丰富的测试命令,项目只要在 RT-Thread 上开启 Finsh/MSH 功能即可。在做一些基于 `aht10` 的应用开发、调试时,这些命令会非常实用,它可以准确的读取指传感器测量的温度与湿度。具体功能可以输入 `aht10` ,可以查看完整的命令列表
+aht10 软件包初始化函数如下所示:
 
 ```
-msh />aht10
-Usage:
-aht10 probe <dev_name>   - probe sensor by given name
-aht10 read               - read sensor aht10 data
-msh />
+int rt_hw_aht10_init(const char *name, struct rt_sensor_config *cfg);
 ```
 
-#### 3.2.1 在指定的 i2c 总线上探测传感器 
+该函数需要由用户调用,函数主要完成的功能有,
 
-当第一次使用 `aht10` 命令时,直接输入 `aht10 probe <dev_name>` ,其中 `<dev_name>` 为指定的 i2c 总线,例如:i2c0。如果有这个传感器,就不会提示错误;如果总线上没有这个传感器,将会显示提示找不到相关设备,日志如下:
+- 设备配置和初始化(根据传入的配置信息配置接口设备);
+- 注册相应的传感器设备,完成 aht10 设备的注册;
 
-```
-msh />aht10 probe i2c1      #探测成功,没有错误日志
-msh />
-msh />aht10 probe i2c88     #探测失败,提示对应的 I2C 设备找不到
-[E/aht10] can't find aht10 device on 'i2c88'
-msh />
-```
+#### 初始化示例
 
-#### 3.2.2 读取数据
+```c
+#include "sensor_asair_aht10.h"
+#define AHT10_I2C_BUS  "i2c4"
 
-探测成功之后,输入 `aht10 read` 即可获取温度与湿度,包括提示信息,日志如下: 
+int rt_hw_aht10_port(void)
+{
+    struct rt_sensor_config cfg;
 
-```
-msh />aht10 read
-read aht10 sensor humidity   : 54.7 %
-read aht10 sensor temperature: 27.3 
-msh />
+    cfg.intf.dev_name  = AHT10_I2C_BUS;
+    cfg.intf.user_data = (void *)AHT10_I2C_ADDR;
+    
+    rt_hw_aht10_init("aht10", &cfg);
+
+    return RT_EOK;
+}
+INIT_ENV_EXPORT(rt_hw_aht10_port);
 ```
 
-## 4 注意事项
+## 注意事项
 
 测试中发现传感器 `aht10` 为不标准 I2C 设备,总线上出现数据与该器件地址相同,即使没有开始信号,也会响应,导 SDA 死锁。所以,建议用户给 AHT10 独立一个 I2C 总线。
 
-## 5 联系方式
+## 联系人信息
 
-* 维护:[Ernest](https://github.com/ErnestChen1)
-* 主页:https://github.com/RT-Thread-packages/aht10
+维护人:
 
+- 维护:[Ernest](https://github.com/ErnestChen1)
+- 主页:https://github.com/RT-Thread-packages/aht10

+ 151 - 0
README_OLD.md

@@ -0,0 +1,151 @@
+# AHT10 软件包
+
+## 1 介绍
+
+AHT10 软件包提供了使用温度与湿度传感器 `aht10` 基本功能,并且提供了软件平均数滤波器可选功能。本文介绍该软件包的基本功能,以及 `Finsh/MSH` 测试命令等。
+
+基本功能主要由传感器 `aht10` 决定:在输入电压为 `1.8v-3.3v` 范围内,测量温度与湿度的量程、精度如下表所示
+
+| 功能 | 量程 | 精度 |
+| ---- | ---- | ---- |
+| 温度 | `-40℃ - 85℃` |`±0.5℃`|
+| 湿度 | `0% - 100%` |`±3%`|
+
+### 1.1 目录结构
+
+| 名称 | 说明 |
+| ---- | ---- |
+| aht10.h | 传感器使用头文件 |
+| aht10.c | 传感器使用源代码 |
+| SConscript | RT-Thread 默认的构建脚本 |
+| README.md | 软件包使用说明 |
+| aht10_datasheet.pdf | 官方数据手册 |
+
+### 1.2 许可证
+
+AHT10 软件包遵循  Apache-2.0 许可,详见 LICENSE 文件。
+
+### 1.3 依赖
+
+依赖 `RT-Thread I2C` 设备驱动框架。
+
+## 2 获取软件包
+
+使用 `aht10` 软件包需要在 RT-Thread 的包管理器中选择它,具体路径如下:
+
+```
+RT-Thread online packages
+    peripheral libraries and drivers  --->
+        [*] aht10: digital humidity and temperature sensor aht10 driver library  --->
+        [*]    Enable support filter function
+               Version (latest)  --->
+```
+
+
+每个功能的配置说明如下:
+
+- `aht10: digital humidity and temperature sensor aht10 driver library`:选择使用 `aht10` 软件包;
+- `Enable support filter function`:开启采集温湿度软件平均数滤波器功能;
+- `Version`:配置软件包版本,默认最新版本。
+
+然后让 RT-Thread 的包管理器自动更新,或者使用 `pkgs --update` 命令更新包到 BSP 中。
+
+## 3 使用 aht10 软件包
+
+按照前文介绍,获取 `aht10` 软件包后,就可以按照 下文提供的 API 使用传感器 `aht10` 与 `Finsh/MSH` 命令进行测试,详细内容如下。
+
+### 3.1 API
+
+#### 3.1.1  初始化 
+
+`aht10_device_t aht10_init(const char *i2c_bus_name)`
+
+根据总线名称,自动初始化对应的 AHT10 设备,具体参数与返回说明如下表
+
+| 参数    | 描述                      |
+| :----- | :----------------------- |
+| name   | i2c 设备名称 |
+| **返回** | **描述** |
+| != NULL | 将返回 aht10 设备对象 |
+| = NULL | 查找失败 |
+
+#### 3.1.2  反初始化
+
+void aht10_deinit(aht10_device_t dev)
+
+如果设备不再使用,反初始化将回收 aht10 设备的相关资源,具体参数说明如下表
+
+| 参数 | 描述           |
+| :--- | :------------- |
+| dev  | aht10 设备对象 |
+
+#### 3.1.3 读取温度
+
+float aht10_read_temperature(aht10_device_t dev)
+
+通过 `aht10` 传感器读取温度测量值,返回浮点型温度值,具体参数与返回说明如下表
+
+| 参数     | 描述           |
+| :------- | :------------- |
+| dev      | aht10 设备对象 |
+| **返回** | **描述**       |
+| != -50.0 | 测量温度值     |
+| = -50.0  | 测量失败       |
+
+#### 3.1.4 读取湿度
+
+float aht10_read_humidity(aht10_device_t dev)
+
+通过 `aht10` 传感器读取湿度测量值,返回浮点型湿度值,具体参数与返回说明如下表
+
+| 参数     | 描述          |
+| :------- | :------------ |
+| dev      | aht10设备对象 |
+| **返回** | **描述**      |
+| != 0.0   | 测量湿度值    |
+| =0.0     | 测量失败      |
+
+### 3.2 Finsh/MSH 测试命令
+
+aht10 软件包提供了丰富的测试命令,项目只要在 RT-Thread 上开启 Finsh/MSH 功能即可。在做一些基于 `aht10` 的应用开发、调试时,这些命令会非常实用,它可以准确的读取指传感器测量的温度与湿度。具体功能可以输入 `aht10` ,可以查看完整的命令列表
+
+```
+msh />aht10
+Usage:
+aht10 probe <dev_name>   - probe sensor by given name
+aht10 read               - read sensor aht10 data
+msh />
+```
+
+#### 3.2.1 在指定的 i2c 总线上探测传感器 
+
+当第一次使用 `aht10` 命令时,直接输入 `aht10 probe <dev_name>` ,其中 `<dev_name>` 为指定的 i2c 总线,例如:i2c0。如果有这个传感器,就不会提示错误;如果总线上没有这个传感器,将会显示提示找不到相关设备,日志如下:
+
+```
+msh />aht10 probe i2c1      #探测成功,没有错误日志
+msh />
+msh />aht10 probe i2c88     #探测失败,提示对应的 I2C 设备找不到
+[E/aht10] can't find aht10 device on 'i2c88'
+msh />
+```
+
+#### 3.2.2 读取数据
+
+探测成功之后,输入 `aht10 read` 即可获取温度与湿度,包括提示信息,日志如下: 
+
+```
+msh />aht10 read
+read aht10 sensor humidity   : 54.7 %
+read aht10 sensor temperature: 27.3 
+msh />
+```
+
+## 4 注意事项
+
+测试中发现传感器 `aht10` 为不标准 I2C 设备,总线上出现数据与该器件地址相同,即使没有开始信号,也会响应,导 SDA 死锁。所以,建议用户给 AHT10 独立一个 I2C 总线。
+
+## 5 联系方式
+
+* 维护:[Ernest](https://github.com/ErnestChen1)
+* 主页:https://github.com/RT-Thread-packages/aht10
+

+ 0 - 58
aht10.c

@@ -349,62 +349,4 @@ void aht10_deinit(aht10_device_t dev)
     rt_free(dev);
 }
 
-void aht10(int argc, char *argv[])
-{
-    static aht10_device_t dev = RT_NULL;
-
-    if (argc > 1)
-    {
-        if (!strcmp(argv[1], "probe"))
-        {
-            if (argc > 2)
-            {
-                /* initialize the sensor when first probe */
-                if (!dev || strcmp(dev->i2c->parent.parent.name, argv[2]))
-                {
-                    /* deinit the old device */
-                    if (dev)
-                    {
-                        aht10_deinit(dev);
-                    }
-                    dev = aht10_init(argv[2]);
-                }
-            }
-            else
-            {
-                rt_kprintf("aht10 probe <dev_name>   - probe sensor by given name\n");
-            }
-        }
-        else if (!strcmp(argv[1], "read"))
-        {
-            if (dev)
-            {
-                float humidity, temperature;
-
-                /* read the sensor data */
-                humidity = aht10_read_humidity(dev);
-                temperature = aht10_read_temperature(dev);
-                
-                rt_kprintf("read aht10 sensor humidity   : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10);
-                rt_kprintf("read aht10 sensor temperature: %d.%d \n", (int)temperature, (int)(temperature * 10) % 10);
-            }
-            else
-            {
-                rt_kprintf("Please using 'aht10 probe <dev_name>' first\n");
-            }
-        }
-        else
-        {
-            rt_kprintf("Unknown command. Please enter 'aht10' for help\n");
-        }
-    }
-    else
-    {
-        rt_kprintf("Usage:\n");
-        rt_kprintf("aht10 probe <dev_name>   - probe sensor by given name\n");
-        rt_kprintf("aht10 read               - read sensor aht10 data\n");
-    }
-}
-MSH_CMD_EXPORT(aht10, aht10 sensor function);
-
 #endif /* PKG_USING_AHT10 */

+ 148 - 0
sensor_asair_aht10.c

@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-05-08     yangjie      the first version
+ */
+ 
+#include "sensor_asair_aht10.h"
+
+#define DBG_TAG "sensor.asair.aht10"
+#define DBG_LVL DBG_INFO
+#include <rtdbg.h>
+
+#define SENSOR_TEMP_RANGE_MAX (85)
+#define SENSOR_TEMP_RANGE_MIN (-40)
+#define SENSOR_HUMI_RANGE_MAX (100)
+#define SENSOR_HUMI_RANGE_MIN (0)
+
+static struct aht10_device *temp_humi_dev;
+
+static rt_err_t _aht10_init(struct rt_sensor_intf *intf)
+{
+    temp_humi_dev = aht10_init(intf->dev_name);
+
+    if (temp_humi_dev == RT_NULL)
+    {
+        return -RT_ERROR;
+    }
+    
+    return RT_EOK;
+}
+
+static rt_size_t _aht10_polling_get_data(rt_sensor_t sensor, struct rt_sensor_data *data)
+{
+    float temperature_x10, humidity_x10;
+    
+    if (sensor->info.type == RT_SENSOR_CLASS_TEMP)
+    {
+        temperature_x10 = 10 * aht10_read_temperature(temp_humi_dev);
+        data->data.temp = (rt_int32_t)temperature_x10;
+        data->timestamp = rt_sensor_get_ts();
+    }    
+    else if (sensor->info.type == RT_SENSOR_CLASS_HUMI)
+    {
+        humidity_x10    = 10 * aht10_read_humidity(temp_humi_dev);
+        data->data.humi = (rt_int32_t)humidity_x10;
+        data->timestamp = rt_sensor_get_ts();
+    }
+    return 1;
+}
+
+static rt_size_t aht10_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len)
+{
+    RT_ASSERT(buf);
+
+    if (sensor->config.mode == RT_SENSOR_MODE_POLLING)
+    {
+        return _aht10_polling_get_data(sensor, buf);
+    }
+    else
+        return 0;
+}
+
+static rt_err_t aht10_control(struct rt_sensor_device *sensor, int cmd, void *args)
+{
+    rt_err_t result = RT_EOK;
+
+    return result;
+}
+
+static struct rt_sensor_ops sensor_ops =
+{
+    aht10_fetch_data,
+    aht10_control
+};
+
+int rt_hw_aht10_init(const char *name, struct rt_sensor_config *cfg)
+{
+    rt_int8_t result;
+    rt_sensor_t sensor_temp = RT_NULL, sensor_humi = RT_NULL;
+    
+#ifdef PKG_USING_AHT10   
+    
+     /* temperature sensor register */
+    sensor_temp = rt_calloc(1, sizeof(struct rt_sensor_device));
+    if (sensor_temp == RT_NULL)
+        return -1;
+
+    sensor_temp->info.type       = RT_SENSOR_CLASS_TEMP;
+    sensor_temp->info.vendor     = RT_SENSOR_VENDOR_UNKNOWN;
+    sensor_temp->info.model      = "aht10";
+    sensor_temp->info.unit       = RT_SENSOR_UNIT_DCELSIUS;
+    sensor_temp->info.intf_type  = RT_SENSOR_INTF_I2C;
+    sensor_temp->info.range_max  = SENSOR_TEMP_RANGE_MAX;
+    sensor_temp->info.range_min  = SENSOR_TEMP_RANGE_MIN;
+    sensor_temp->info.period_min = 5;
+
+    rt_memcpy(&sensor_temp->config, cfg, sizeof(struct rt_sensor_config));
+    sensor_temp->ops = &sensor_ops;
+
+    result = rt_hw_sensor_register(sensor_temp, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
+    if (result != RT_EOK)
+    {
+        LOG_E("device register err code: %d", result);
+        goto __exit;
+    }
+    
+    /* humidity sensor register */
+    sensor_humi = rt_calloc(1, sizeof(struct rt_sensor_device));
+    if (sensor_humi == RT_NULL)
+        return -1;
+
+    sensor_humi->info.type       = RT_SENSOR_CLASS_HUMI;
+    sensor_humi->info.vendor     = RT_SENSOR_VENDOR_UNKNOWN;
+    sensor_humi->info.model      = "aht10";
+    sensor_humi->info.unit       = RT_SENSOR_UNIT_PERMILLAGE;
+    sensor_humi->info.intf_type  = RT_SENSOR_INTF_I2C;
+    sensor_humi->info.range_max  = SENSOR_HUMI_RANGE_MAX;
+    sensor_humi->info.range_min  = SENSOR_HUMI_RANGE_MIN;
+    sensor_humi->info.period_min = 5;
+
+    rt_memcpy(&sensor_humi->config, cfg, sizeof(struct rt_sensor_config));
+    sensor_humi->ops = &sensor_ops;
+
+    result = rt_hw_sensor_register(sensor_humi, name, RT_DEVICE_FLAG_RDONLY, RT_NULL);
+    if (result != RT_EOK)
+    {
+        LOG_E("device register err code: %d", result);
+        goto __exit;
+    }
+    
+#endif
+    
+    _aht10_init(&cfg->intf);
+    return RT_EOK;
+    
+__exit:
+    if (sensor_temp)
+        rt_free(sensor_temp);
+    if (sensor_humi)
+        rt_free(sensor_humi);
+    if (temp_humi_dev)
+        aht10_deinit(temp_humi_dev);
+    return -RT_ERROR;     
+}

+ 21 - 0
sensor_asair_aht10.h

@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2019-05-08     yangjie      the first version
+ */
+
+#ifndef SENSOR_ASSIR_AHT10_H__
+#define SENSOR_ASSIR_AHT10_H__
+
+#include "sensor.h"
+#include "aht10.h"
+
+#define AHT10_I2C_ADDR 0x38
+
+int rt_hw_aht10_init(const char *name, struct rt_sensor_config *cfg);
+
+#endif