精简版
1
1
0
云栖社区>阿里云 IoT> 博客>正文
阿里云 AIoT 2020-02-21 17:36:27 浏览 1005
互联网产品及应用
配置
Image
aliyun
物联网
AliOS
红外
体温检测
红外体温枪
展开阅读全文
1. 简介
非接触红外测温在医疗, 环境监测, 个人健康等领域得到越来越广泛的应用. 本文将向大家介绍如何通过 AliOS-Things inside 的 Wi-Fi 模组, 快速完成体温检测, 流程涵盖从传感器数据采集, 到阿里云 IoT 智能生活平台接入, 以及快速构建 App 完成监控. 希望通过阿里云 IoT 提供的从设备端到云端应用的全套解决方案, 快速帮助智能设备厂商, 构建出可以替代人力的自动化人体测温设备和方案, 在防控中降低人员接触风险, 提升排查效率.
2. 软硬件环境
2.1 软件平台
云端 -- 阿里云 IoT 智能生活平台(飞燕平台)
生活物联网平台提供了设备接入能力, 移动端的 SDK 以及免开发的公版 App 和界面, 开发者基于该平台可快速实现设备的智能化.
移动端 -- 云智能(公版 App)
云智能是生活物联网平台提供的公版 App, 无需额外开发, 下载后可直接对设备进行配网和控制. 支持在全球主流应用商店中搜索 "云智能" 下载;
设备端 -- AliOS Things 3.0.0 版本
AliOS Things 作为轻量级物联网 OS, 已支持多款芯片, 可以方便的集成温度传感器, 并通过设备端 SDK 连接生活物联网平台; 这里选用其最新发布的 3.0.0 版本.
2.2 硬件平台
硬件平台
硬件平台选用 ESP8266 nodeMCU, 支持 Wi-Fi 连接, 带有 I2C,UART 等接口, 并且带有按键(FLASH 按键), 可用于触发体温检测上报.
传感器 --MLX90614ESF-DCI-000-TU(I2C 接口)
这颗传感器是一款红外的非接触温度计, 支持 I2C 通信协议, 主要用到 SDA 和 SCL 两条线, 可以很方便的连接到 ESP8266 开发板上.
说明如下:
硬件连接
开发板与传感器的接线引脚对应关系如下:
开发板 | 传感器 |
---|---|
D1 (GPIO_05) | SCL |
D2 (GPIO_04) | SDA |
3.3V | Vcc |
GND | GND |
硬件连接图, 右键可打开大图
3. 云端配置
智能生活平台上创建产品及设备之前, 请先确保以下两点:
已经注册了阿里云账号, 并完成实名认证. 注册操作请参见阿里云账号注册流程.
已开通生活物联网平台服务.
3.1 产品创建
在控制台上已创建项目, 产品, 并完成产品的功能定义, 可参见概述完成这部分的操作. 功能定义时, 需要注意以下两点:
产品类型选择 "体温计", 标准功能中已经包含了 "人体温度", 这里只需要修改数据定义中的取值范围为 0~99.
如上图所示, 设备端上报温度使用的标识符, 需要与云端的配置保持一致(如上图 "人体温度" 所对应的标识符);
3.2 测试设备添加
添加测试设备, 记录设备的激活凭证(ProductKey,ProductSecret,DeviceName,DeviceSecret, 如下图红框处), 后续需要将激活凭证配置到设备端.
3.3 App 配置使用
公版 App 的参数配置及流程如下所示:
打开公版 App 的控制开关, 详细参见配置 App 交付终端.
设置 App 参数, 其中选择产品面板, 多语言管理, 配网引导为必填参数, 详细请参见设置 App 参数.
下载公版 App(云智能), 具体参考公版 App 介绍;
扫描配网二维码, 绑定设备后调试, 具体二维码参见获取配网二维码.
4. 代码移植
获取参考代码(如图所示), 并按以下步骤集成.
4.1 ESP8266 单板适配
针对上述选用的 ESP8266 开发板, 为保证按键中断, I2C 等功能正常运行, 需要做以下修改:
FLASH 按键对应的 GPIO 引脚修改;
I2C 总线对应的引脚修改;
8266 不支持 C99 编译的适配;
具体修改可参考附件中的补丁文件(001-aos-3-0-0-esp8266.patch, 基于 AliOS Things 3.0.0 版本生成). 将其拷贝到 AliOS Things 3.0.0 根目录下, 通过以下命令打入补丁:
patch -p1 <./001-aos-3-0-0-esp8266.patch
4.2 驱动移植
MLX90614 是一款用于非接触式温度测量的红外温度计, 这里主要介绍其使用方法. MLX90614 的 EEPROM 主要用来做参数配置, 具体可参考官方手册:
MLX90614 的 RAM 为只读属性, 用户可以读取温度等数据, 例如, 通过 RAM 上的 Tobj1 可以获取被检测物体的温度数据.
I2C 总线通过设备地址 0X5A(MLX90614 出厂设置)来访问传感器. 访问 RAM 和 EEPROM 时, 操作命令的对应关系如下所示:
例如访问 EEPROM 上 0X4 的地址(Emissivity correction coefficient ), 其操作可以通过以下方式得到:
访问的是 EEPROM, 其操作码高 3 位为 0b001
后 5 位为访问的地址, 该地址为 0X4, 二进制表示为 0b00100
按照上图的方式组合, 操作命令为 0b00100100, 即 0X24
按照同样的方式, 通过 RAM 读取被测物体温度寄存器 (Tobj1) 数据的操作码为 0X7.
被测物体温度读取的驱动代码 (位于 drv_temp_melexis_mlx90614.c 中) 参考如下:
- static int drv_temp_melexis_mlx90614_read(void *buf, size_t len)
- {
- int ret = 0;
- size_t size;
- uint8_t data[2];
- int32_t temp;
- uint32_t value;
- temperature_data_t *pdata = (temperature_data_t *)buf;
- if (buf == NULL) {
- return -1;
- }
- size = sizeof(temperature_data_t);
- if (len < size) {
- return -1;
- }
- /* 通过 I2C 读取 RAM 上的 Tobj 寄存器
- MLX90614_ctx.config.dev_addr 为设备地址 0X5A
- MLX90614_TOBJ1 为访问 Tobj1 的操作码 0X07 */
- ret = hal_i2c_mem_read(&MLX90614_ctx, MLX90614_ctx.config.dev_addr, MLX90614_TOBJ1, I2C_REG_LEN, data,
- 2, I2C_OP_RETRIES);
- value = data[0] | (data[1]<<8);
- if (unlikely(ret)) {
- return -1;
- }
- /* 寄存器的值转换成温度数据, 单位为 0.01℃ */
- temp = ((int32_t)value * 2) - 27315;
- pdata->t = temp;
- pdata->timestamp = aos_now_ms();
- return (int)size;
- }
下面介绍如何集成驱动, 将驱动文件 drv_temp_melexis_mlx90614.c 拷贝到 driverssensordrv 目录下, 并且在 driverssensordrv.mk 的第一行添加编译配置.
- ifeq ($(AOS_SENSOR_TEMP_MELEXIS_MLX90614),y)
- $(NAME)_SOURCES += drv/drv_temp_melexis_mlx90614.c
- endif
4.3 用例移植
将用例代码 (thermometer 文件夹) 拷贝到 appexample 目录下, 并且在 appexampleConfig.in 中添加用例编译配置.
- source "app/example/thermometer/Config.in"
- if AOS_APP_THERMOMETER
- config AOS_BUILD_APP
- default "thermometer"
- endif
用例初始化流程如下所示, 具体请参考入口函数 application_start:
ESP8266 的按键中断相关代码在 mcuesp8266bspkey.c 中, 按下按键后, 中断回调函数会根据按键按下的时间(短按, 2 秒钟长按, 6 秒钟长按), 触发不同的 event(通过 aos_post_event).application_start 中注册的按键回调, 会响应上述事件, 按键回调代码如下:
- /* 按键回调函数 */
- void linkkit_key_process(input_event_t *eventinfo, void *priv_data)
- {
- if (eventinfo->type != EV_KEY) {
- return;
- }
- if (eventinfo->code == CODE_BOOT) {
- if (eventinfo->value == VALUE_KEY_CLICK) {
- /* 短按(>40ms), 触发一次体温检测, 并上报云端 */
- app_sensor_test();
- } else if (eventinfo->value == VALUE_KEY_LTCLICK) {
- /* 长按(>2s), 触发系统进入配网模式 */
- do_awss_active();
- } else if (eventinfo->value == VALUE_KEY_LLTCLICK) {
- /* 长按(>6s), 会清除配网信息, 并复位系统 */
- do_awss_reset();
- }
- }
- }
体温数据检测, 上报流程请参考相关代码, 检测低于正常人体温度范围(34~42℃), 则上报数据 0, 高于正常人体温度范围, 则上报数据 99:
- /* 读取温度数据并上报云端 */
- void app_sensor_test()
- {
- int ret;
- char param[128];
- temperature_data_t temp;
- double data = 0.0;
- /* 读取温度传感器数据 */
- ret = sensor_hal_read(TAG_DEV_TEMP, 0, &temp, sizeof(temp));
- if(ret <= 0){
- printf("\nSensor data read fail \n");
- return;
- }
- data = (double)temp.t;
- data = data/100.0;
- /* 人体温度数据校准 */
- data = data - (data * data * data *data * data* data) * 0.000125 +
- (data * data * data *data * data) * 0.0283429488 -
- (data * data * data *data ) * 2.67004808 +
- (data * data * data ) * 133.762569 -
- (data * data ) * 3758.41829 +
- (data ) * 56155.4892 -
- 348548.755;
- if (data <34.0) {
- data = 0.0;
- printf("\nNot the normal range of human body temperature (34 ~ 42℃ ) \n");
- }
- else if (data> 42.0) {
- data = 99.0;
- printf("\nNot the normal range of human body temperature (34 ~ 42℃ ) \n");
- }
- /* 网络连接检测 */
- if (!app_conect_check()) {
- printf("\nNetwork is not connected\n");
- return;
- }
- memset(param, 0, 128);
- /* 构建上报云端的 payload */
- sprintf(param, PROP_POST_FORMAT_TEMP, data);
- /* 上报体温数据到云端 */
- if (app_init_check() != 0) {
- ret = IOT_Linkkit_Report(app_device_get(), ITM_MSG_POST_PROPERTY, (unsigned char *)param, strlen(param) + 1);
- if (ret == -1) {
- LOG("%s %d fail\n", __func__,__LINE__);
- }
- }
- }
4.4 四元组修改
将 3.2 节中记录的设备的激活凭证 (四元组) 更新到设备端(appexamplethermometer 目录下的 app_entry.h 中):
- #define PRODUCT_KEY "xxxxxxxxxxx"
- #define PRODUCT_SECRET "xxxxxxxxxxxxxxxx"
- #define DEVICE_NAME "xxxxxxxxxxxxxx"
- #define DEVICE_SECRET "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
4.5 标识符确认
参考 3.1 节, 确保设备端上报体温对应的功能标识符 (appexamplethermometer 目录下的 app_entry.h 中) 与云端的配置一致:
#define PROP_POST_FORMAT_TEMP "{\"BodyTemperature\":%.1f}"
5. 编译运行
5.1 编译
在 OS 目录下执行以下命令, 完成编译
- make thermometer@esp8266 -c config
- aos make
编译生成的固件 thermometer@esp8266.bin 在 outthermometer@esp8266binary 目录下
通过 ESP8266 的 Flash 下载工具 (FLASH_DOWNLOAD_TOOLS) 烧录
5.2 运行
开发板参考如下:
复位单板后, 长按 "FLASH" 键(>2s), 开启配网流程, App 端参考官方文档中的 "公版 App 使用流程" 完成.
配网成功后, 短按 "FLASH" 键(>40ms), 可以触发一次温度采集, 并上传云端, 同时推送到手机侧云智能 App.
需要注意的是, 用例中增加了校准, 检测温度的的范围是 34 ~ 42℃, 低于这个范围, 上报数据为 0; 高于这个范围, 上报数据为 99.
6. 附录
问题交流, 技术支持群:
来源: https://yq.aliyun.com/articles/745669