sensor

更正文档      贡献说明

概述

uData 框架设计思想是基于传统 sensorhub 概念基础之上的,结合IoT的业务场景和 AliOS Things 物联网操作系统的特点设计而成的一个面对 IoT 的感知设备处理框架。为了能更好的提供每个开发者极简开发,uData 已将驱动相关的 OS 调用,比如中断注册接口,设备硬件配置接口等都抽象到了sensor hal 实现。每一个设备驱动程序,只需一个 .c文件中,通过 BUS 总线如 I2C,对设备进行读写和配置操作,就能实现全部的功能,同时也减少了开发者调试工作时间。可以方便地开发传感器驱动程序。

sensor 组件是 udata 组件的 Sensor Driver 部分,可单独提供 sensor hal 接口给外部模块使用,而无需使用 udata 组件全部功能。

组件支持以下功能:

  • 传感器的硬件抽象层;
  • 统一的I2C和SPI总线驱动程序;
  • 已集成100多个传感器驱动;

版权信息

Apache license v2.0

目录结构

.
├── drv #已集成的Sensor设备驱动程序
│   ├── drv_acc_adi_adxl345.c
│   ├── ...
│   └── drv_temp_humi_si_si7006.c
├── example
│   ├── sensor_cloud_demo.c #示例,获取传感器数据并在本地进行打印;
│   └── sensor_local_demo.c #示例,获取传感器数据并通过linkkit上传到云端;
├── hal
│   ├── gps_parse.c #gps数据处理分析
│   ├── sensor_drv_api.c #提供给外部模块使用的Sensor Hal接口
│   ├── sensor_hal.c #传感器驱动调用接口
│   └── sensor_static_calibrate.c #静态校准配置接口
├── include #头文件
│   ├── gps_parse.h
│   ├── sensor
│   │   └── sensor.h
│   ├── sensor_drv_api.h
│   ├── sensor_hal.h
│   └── sensor_static_calibrate.h
├── package.yaml #编译配置文件
└── README.md

依赖组件

  • ulog
  • vfs
  • i2c
  • spi

常用配置

系统中相关配置已有默认值,如需修改配置,统一在yaml中**def_config**节点修改,具体如下:

Sensor 的设备驱动程序默认不编译, 可在yaml中添加驱动对应的宏进行配置,如添加温度传感器驱动 SI7006

def_config:
AOS_SENSOR_TEMP_SI_SI7006: 1

API说明

sensor_hal_init() 传感器器驱动初始化

sensor_hal_open() 打开传感器,即让指定的传感器进入工作状态

sensor_hal_read() 读取传感器数据

sensor_hal_write() 向传感器发送数据,暂时未使用

sensor_hal_ioctl() 对传感器的参数进行设置

sensor_hal_close() 关闭指定的传感器

使用示例 – Sensor hal 本地演示

基于 Sensor Hal 接口获取传感器数据,并在本地进行打印,参考 example/sensor_local_demo.c

注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。

组件使用示例相关的代码下载、编译和固件烧录均依赖AliOS Things配套的开发工具,所以首先需要参考《AliOS Things集成开发环境使用说明之搭建开发环境》,下载安装。 待开发环境搭建完成后,可以按照以下步骤进行示例的测试。

1. 创建或打开工程

打开已有工程

如果用于测试的案例工程已存在,可参考《AliOS Things集成开发环境使用说明之打开工程》打开已有工程。

创建新的工程

组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考《AliOS Things集成开发环境使用说明之创建工程》,硬件类型选择“haas edu k1”, 解决方案选择“ helloworld 简单示例”。

2. 添加组件

案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖:

depends:
- init: master
- cli: master
- osal_aos: master
- haaseduk1: master
- sensor: master

在执行编译步骤时,会自动下载 sensor 组件及依赖的相关组件,sensor组件源码被下载到了./components/sensor路径中。

3. 添加示例

solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并在本地进行打印:

def_config:
AOS_SENSOR_LOCAL_DEMO_ENABLE: 1
AOS_SENSOR_HUMI_SI_SI7006: 1
AOS_SENSOR_TEMP_SI_SI7006: 1

4. 编译固件

在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考《AliOS Things集成开发环境使用说明之编译固件》

5. 烧录固件

helloworld_demo案例的固件生成后,可参考《AliOS Things集成开发环境使用说明之烧录固件》来烧录固件。

6. 打开串口

固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考《AliOS Things集成开发环境使用说明之查看日志》

当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。

7. 测试示例

CLI命令行输入:

sensor_local_test

关键日志

CLI日志:

Temperature value :
Humidity value :

使用示例 – Sensor hal 连云演示

基于 Sensor Hal 接口获取传感器数据,并通过 linkkit 上传到云端,参考 example/sensor_cloud_demo.c

注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。

以运行 linksdk_demo 为例,具体步骤如下:

1. 创建或打开工程

打开已有工程 如果用于测试的案例工程已存在,可参考《AliOS Things集成开发环境使用说明之打开工程》打开已有工程。

创建新的工程

组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择 linkkit_demo 案例。 linkkit_demo 案例相关的源代码下载可参考《AliOS Things集成开发环境使用说明之创建工程》,硬件类型选择“haas edu k1”, 解决方案选择“ WI-FI设备连接阿里云示例”。

2. 添加示例代码

2.1 solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并通过 linkkit 上传到云端:

def_config:
AOS_SENSOR_CLOUD_DEMO_ENABLE: 1
AOS_SENSOR_HUMI_SI_SI7006: 1
AOS_SENSOR_TEMP_SI_SI7006: 1

2.2 solutions/linksdk_demo/main.c 添加 sensor_cloud_test_init() 函数调用

extern void sensor_cloud_test_init(void);
int application_start(int argc, char *argv[])
{
aos_set_log_level(AOS_LL_DEBUG);
sensor_cloud_test_init();
event_service_init(NULL);
...
}

2.3 solutions/linksdk_demo/data_model_basic_demo.c 的 demo_main() 函数中

- 替换你自己在阿里云物联网平台上创建设备的三元组信息,下面三元组仅本示例测试所用

extern void sensor_cloud_test_start(void *dm_handle);
int demo_main(int argc, char *argv[])
{
...
aiot_sysdep_network_cred_t cred; /* 安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数 */
/* TODO: 替换为自己设备的三元组 */
char *product_key = "a1eykua9RBq";
char *device_name = "haas-edu-k1-calon";
char *device_secret = "589bb9ff1d55675096ba6ba2e0d52392";
/* 配置SDK的底层依赖 */
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
...
}
  • 注释掉其它属性上报和事件上报,添加 sensor_cloud_test_start() 函数调用,
    extern void sensor_cloud_test_start(void *dm_handle);
    int demo_main(int argc, char *argv[])
    {
    ...
    /* 主循环进入休眠 */
    while (1) {
    /* TODO: 以下代码演示了简单的属性上报和事件上报, 用户可取消注释观察演示效果 */
    // demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}");
    // demo_send_event_post(dm_handle, "Error", "{\"ErrorCode\": 0}");
    sensor_cloud_test_start(dm_handle);
    aos_msleep(1000);
    }
    ...
    }

3. 添加 sensor 组件

solutions/linksdk_demo/package.yaml 依赖信息 depends 末尾添加 sensor 组件

depends:
- linksdk: master
- mbedtls: master
- netmgr: master
- lwip: master
- uservice: master
- wifi: master
- cli: master
- haaseduk1: master
- sensor: master

4. 编译固件

在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译 linkkit_demo 案例来生成固件了,具体编译方法可参考《AliOS Things集成开发环境使用说明之编译固件》

5. 烧录固件

linkkit_demo 案例的固件生成后,可参考《AliOS Things集成开发环境使用说明之烧录固件》来烧录固件。

6. 示例测试

设备联网

CLI命令行输入:打开连网成功后会自动保存AP信息的功能

netmgr -t wifi -b 1

CLI命令行输入:netmgr -t wifi -c {ssid} {password} 连接名为ssid的路由器AP,其中 {ssid} {password}替换为自己的路由器配网信息

netmgr -t wifi -c my_wifi 12345678

设备在联网成功后会自动读取 Sensor 数据并上报到云端,同时可以看到设备在阿里云物联网平台处于在线状态,在日志服务中能查看设备上传到云端的日志信息

7. 关键日志

CLI日志:

AIOT_MQTTEVT_CONNECT
Humidity value : 15.3 H
[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post
Temperature value : 42.0 centidegree
[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post
[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post_reply
[LK-0A08] DM recv generic reply
demo_dm_recv_handler, type = 0
msg_id = 1, code = 200, data = {}, message = success

注意事项

sensor设备驱动 components/sensor/drv/drv_####_####_####.c 中 i2c_dev_t 结构体成员 port 要与 sensor_i2c_init() 初始化中的 port 相同。

void i2c_init(void)
{
i2c_dev_t i2c_dev;
i2c_dev.port = 1;
i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
i2c_dev.config.freq = I2C_BUS_BIT_RATES_100K;
i2c_dev.config.mode = I2C_MODE_MASTER;
sensor_i2c_init(&i2c_dev);
}
i2c_dev_t ####_ctx = {
.port = 1,
.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT,
.config.freq = I2C_BUS_BIT_RATES_100K,
.config.mode = I2C_MODE_MASTER,
.config.dev_addr = SI7006_I2C_ADDRESS,
};

FAQ

Q1: 怎么自己添加特定型号的传感器驱动程序?

1. 参考 components/sensor/drv/drv_####_####_####.c 已集成的传感器设备驱动编写驱动文件;

2. components/sensor/drv/drv_init.c 中添加驱动程序的宏开关, 如

#if AOS_SENSOR_TEMP_SI_SI7006
drv_temp_si_si7006_init();
#endif

3. components/sensor/package.yaml 中添加参与编译的源代码文件

source_file:
- drv/drv_temp_humi_si_si7006.c ? <AOS_SENSOR_TEMP_SI_SI7006>

更具体的操作可以参考下面链接: