1@page sensor sensor
2
3[更正文档](https://gitee.com/alios-things/sensor/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html)
4
5# 概述
6uData 框架设计思想是基于传统 sensorhub 概念基础之上的,结合IoT的业务场景和 AliOS  Things 物联网操作系统的特点设计而成的一个面对 IoT 的感知设备处理框架。为了能更好的提供每个开发者极简开发,uData 已将驱动相关的 OS 调用,比如中断注册接口,设备硬件配置接口等都抽象到了sensor hal 实现。每一个设备驱动程序,只需一个 .c文件中,通过 BUS 总线如 I2C,对设备进行读写和配置操作,就能实现全部的功能,同时也减少了开发者调试工作时间。可以方便地开发传感器驱动程序。
7
8sensor 组件是 udata 组件的 Sensor Driver 部分,可单独提供 sensor hal 接口给外部模块使用,而无需使用 udata 组件全部功能。
9## 组件支持以下功能:
10- 传感器的硬件抽象层;
11- 统一的I2C和SPI总线驱动程序;
12- 已集成100多个传感器驱动;
13
14## 版权信息
15> Apache license v2.0
16
17## 目录结构
18```tree
19.
20├── drv                             #已集成的Sensor设备驱动程序
21│   ├── drv_acc_adi_adxl345.c
22│   ├── ...
23│   └── drv_temp_humi_si_si7006.c
24├── example
25│   ├── sensor_cloud_demo.c         #示例,获取传感器数据并在本地进行打印;
26│   └── sensor_local_demo.c         #示例,获取传感器数据并通过linkkit上传到云端;
27├── hal
28│   ├── gps_parse.c                 #gps数据处理分析
29│   ├── sensor_drv_api.c            #提供给外部模块使用的Sensor Hal接口
30│   ├── sensor_hal.c                #传感器驱动调用接口
31│   └── sensor_static_calibrate.c   #静态校准配置接口
32├── include                         #头文件
33│   ├── gps_parse.h
34│   ├── sensor
35│   │   └── sensor.h
36│   ├── sensor_drv_api.h
37│   ├── sensor_hal.h
38│   └── sensor_static_calibrate.h
39├── package.yaml                    #编译配置文件
40└── README.md
41```
42
43## 依赖组件
44* ulog
45* vfs
46* i2c
47* spi
48
49# 常用配置
50系统中相关配置已有默认值,如需修改配置,统一在yaml中**def_config**节点修改,具体如下:
51> Sensor 的设备驱动程序默认不编译, 可在yaml中添加驱动对应的宏进行配置,如添加温度传感器驱动 SI7006
52```yaml
53def_config:
54  AOS_SENSOR_TEMP_SI_SI7006: 1
55```
56
57# API说明
58@ref sensor_hal_init()
59传感器器驱动初始化
60
61@ref sensor_hal_open()
62打开传感器,即让指定的传感器进入工作状态
63
64@ref sensor_hal_read()
65读取传感器数据
66
67@ref sensor_hal_write()
68向传感器发送数据,暂时未使用
69
70@ref sensor_hal_ioctl()
71对传感器的参数进行设置
72
73@ref sensor_hal_close()
74关闭指定的传感器
75
76# 使用示例 -- Sensor hal 本地演示
77
78基于 Sensor Hal 接口获取传感器数据,并在本地进行打印,参考 example/sensor_local_demo.c
79
80> 注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。
81
82组件使用示例相关的代码下载、编译和固件烧录均依赖AliOS Things配套的开发工具,所以首先需要参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),下载安装。
83待开发环境搭建完成后,可以按照以下步骤进行示例的测试。
84
85## 1. 创建或打开工程
86
87**打开已有工程**
88
89如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。
90
91**创建新的工程**
92
93组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择helloworld_demo案例。helloworld_demo案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),硬件类型选择“haas edu k1”, 解决方案选择“ helloworld 简单示例”。
94
95## 2. 添加组件
96
97案例下载完成后,需要在helloworld_demo组件的package.yaml中添加对组件的依赖:
98
99```yaml
100depends:
101  - init: master
102  - cli: master
103  - osal_aos: master
104  - haaseduk1: master
105  - sensor: master
106```
107在执行编译步骤时,会自动下载 sensor 组件及依赖的相关组件,sensor组件源码被下载到了./components/sensor路径中。
108
109## 3. 添加示例
110> solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并在本地进行打印:
111
112```yaml
113def_config:
114  AOS_SENSOR_LOCAL_DEMO_ENABLE: 1
115  AOS_SENSOR_HUMI_SI_SI7006: 1
116  AOS_SENSOR_TEMP_SI_SI7006: 1
117```
118
119## 4. 编译固件
120
121在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译helloworld_demo案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)122
123## 5. 烧录固件
124
125helloworld_demo案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。
126
127## 6. 打开串口
128
129固件烧录完成后,可以通过串口查看示例的运行结果,打开串口的具体方法可参考[《AliOS Things集成开发环境使用说明之查看日志》](https://help.aliyun.com/document_detail/302382.html)130
131当串口终端打开成功后,可在串口中输入help来查看已添加的测试命令。
132
133## 7. 测试示例
134
135> CLI命令行输入:
136```sh
137sensor_local_test
138```
139
140**关键日志**
141> CLI日志:
142```sh
143Temperature value :
144Humidity value :
145```
146
147# 使用示例 -- Sensor hal 连云演示
148基于 Sensor Hal 接口获取传感器数据,并通过 linkkit 上传到云端,参考 example/sensor_cloud_demo.c
149
150> 注意: sensor 组件需配合传感器进行使用,haaseduk1 开发板有自带传感器,本示例基于 haaseduk1 自带的温湿度传感器 SI7006 进行演示。haas100 用户可自行外接传感器参考本示例进行验证。
151
152以运行 linksdk_demo 为例,具体步骤如下:
153
154## 1. 创建或打开工程
155
156**打开已有工程**
157如果用于测试的案例工程已存在,可参考[《AliOS Things集成开发环境使用说明之打开工程》](https://help.aliyun.com/document_detail/302381.html)打开已有工程。
158
159**创建新的工程**
160
161组件的示例代码可以通过编译链接到AliOS Things的任意案例(solution)来运行,这里选择 linkkit_demo 案例。 linkkit_demo 案例相关的源代码下载可参考[《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),硬件类型选择“haas edu k1”, 解决方案选择“ WI-FI设备连接阿里云示例”。
162
163## 2. 添加示例代码
164> 2.1 solutions/helloworld_demo/package.yaml 配置信息 def_config 中添加要运行的 example 示例代码和 Sensor 设备驱动的宏。例如温湿度传感器 si7006 数据并通过 linkkit 上传到云端:
165```yaml
166def_config:
167  AOS_SENSOR_CLOUD_DEMO_ENABLE: 1
168  AOS_SENSOR_HUMI_SI_SI7006: 1
169  AOS_SENSOR_TEMP_SI_SI7006: 1
170```
171> 2.2 solutions/linksdk_demo/main.c 添加 sensor_cloud_test_init() 函数调用
172```
173extern void sensor_cloud_test_init(void);
174int application_start(int argc, char *argv[])
175{
176    aos_set_log_level(AOS_LL_DEBUG);
177    sensor_cloud_test_init();
178    event_service_init(NULL);
179    ...
180}
181```
182> 2.3 solutions/linksdk_demo/data_model_basic_demo.c 的 demo_main() 函数中
183- 替换你自己在阿里云物联网平台上创建设备的三元组信息,下面三元组仅本示例测试所用
184```
185extern void sensor_cloud_test_start(void *dm_handle);
186int demo_main(int argc, char *argv[])
187{
188    ...
189    aiot_sysdep_network_cred_t cred; /* 安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数 */
190
191    /* TODO: 替换为自己设备的三元组 */
192    char *product_key       = "a1eykua9RBq";
193    char *device_name       = "haas-edu-k1-calon";
194    char *device_secret     = "589bb9ff1d55675096ba6ba2e0d52392";
195
196    /* 配置SDK的底层依赖 */
197    aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
198    ...
199}
200```
201- 注释掉其它属性上报和事件上报,添加 sensor_cloud_test_start() 函数调用,
202```sh
203extern void sensor_cloud_test_start(void *dm_handle);
204int demo_main(int argc, char *argv[])
205{
206    ...
207
208    /* 主循环进入休眠 */
209    while (1) {
210        /* TODO: 以下代码演示了简单的属性上报和事件上报, 用户可取消注释观察演示效果 */
211        // demo_send_property_post(dm_handle, "{\"LightSwitch\": 0}");
212        // demo_send_event_post(dm_handle, "Error", "{\"ErrorCode\": 0}");
213
214        sensor_cloud_test_start(dm_handle);
215        aos_msleep(1000);
216    }
217
218    ...
219}
220```
221## 3. 添加 sensor 组件
222> solutions/linksdk_demo/package.yaml 依赖信息 depends 末尾添加 sensor 组件
223```yaml
224depends:
225  - linksdk: master
226  - mbedtls: master
227  - netmgr: master
228  - lwip: master
229  - uservice: master
230  - wifi: master
231  - cli: master
232  - haaseduk1: master
233  - sensor: master
234```
235
236## 4. 编译固件
237
238在示例代码已经添加至组件的配置文件,并且helloworld_demo已添加了对该组件的依赖后,就可以编译 linkkit_demo 案例来生成固件了,具体编译方法可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)239
240## 5. 烧录固件
241
242linkkit_demo 案例的固件生成后,可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)来烧录固件。
243
244## 6. 示例测试
245### 设备联网
246> CLI命令行输入:打开连网成功后会自动保存AP信息的功能
247```sh
248netmgr -t wifi -b 1
249```
250> CLI命令行输入:netmgr -t wifi -c {ssid} {password} 连接名为ssid的路由器AP,其中 {ssid} {password}替换为自己的路由器配网信息
251```sh
252netmgr -t wifi -c my_wifi 12345678
253```
254> 设备在联网成功后会自动读取 Sensor 数据并上报到云端,同时可以看到设备在阿里云物联网平台处于在线状态,在日志服务中能查看设备上传到云端的日志信息
255
256## 7. 关键日志
257> CLI日志:
258```sh
259AIOT_MQTTEVT_CONNECT
260Humidity value : 15.3 H
261[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post
262Temperature value : 42.0 centidegree
263[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post
264[LK-0309] pub: /sys/a1eykua9RBq/haas-edu-k1-calon/thing/event/property/post_reply
265[LK-0A08] DM recv generic reply
266demo_dm_recv_handler, type = 0
267msg_id = 1, code = 200, data = {}, message = success
268```
269
270# 注意事项
271sensor设备驱动 components/sensor/drv/drv_####_####_####.c 中 i2c_dev_t 结构体成员 port 要与 sensor_i2c_init() 初始化中的 port 相同。
272```
273void i2c_init(void)
274{
275    i2c_dev_t i2c_dev;
276    i2c_dev.port                 = 1;
277    i2c_dev.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
278    i2c_dev.config.freq          = I2C_BUS_BIT_RATES_100K;
279    i2c_dev.config.mode          = I2C_MODE_MASTER;
280
281    sensor_i2c_init(&i2c_dev);
282}
283
284i2c_dev_t ####_ctx = {
285    .port                 = 1,
286    .config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT,
287    .config.freq          = I2C_BUS_BIT_RATES_100K,
288    .config.mode          = I2C_MODE_MASTER,
289    .config.dev_addr      = SI7006_I2C_ADDRESS,
290};
291```
292
293# FAQ
294Q1: 怎么自己添加特定型号的传感器驱动程序?
295> 1. 参考 components/sensor/drv/drv_####_####_####.c 已集成的传感器设备驱动编写驱动文件;
296
297> 2. components/sensor/drv/drv_init.c 中添加驱动程序的宏开关, 如
298```sh
299#if AOS_SENSOR_TEMP_SI_SI7006
300    drv_temp_si_si7006_init();
301#endif
302```
303> 3. components/sensor/package.yaml 中添加参与编译的源代码文件
304```
305source_file:
306  - drv/drv_temp_humi_si_si7006.c ? <AOS_SENSOR_TEMP_SI_SI7006>
307```
308更具体的操作可以参考下面链接:
309- [AliOS Things uData Sensor Driver Porting Guide](https://github.com/alibaba/AliOS-Things/wiki/AliOS-Things-uData-Sensor-Driver-Porting-Guide)
310