快速开发一个带APP的红外体温枪(基于AliOS Things Inside的Wi-Fi模组)

简介: 非接触红外测温在医疗,环境监测、个人健康等领域得到越来越广泛的应用。本文将向大家介绍如何通过AliOS-Things inside的WiFi模组,快速完成体温检测,流程涵盖从传感器数据采集,到阿里云IoT智能生活平台接入,以及快速构建App完成监控。

1. 简介

非接触红外测温在医疗,环境监测、个人健康等领域得到越来越广泛的应用。本文将向大家介绍如何通过AliOS-Things inside的WiFi模组,快速完成体温检测,流程涵盖从传感器数据采集,到阿里云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,支持Wifi连接,带有I2C、UART等接口,并且带有按键(FLASH按键),可用于触发体温检测上报。
image.png
传感器--MLX90614ESF-DCI-000-TU(I2C接口)
这颗传感器是一款红外的非接触温度计,支持I2C通信协议,主要用到SDA和SCL两条线,可以很方便的连接到ESP8266开发板上。
image.png
说明如下:
image.png
硬件连接
开发板与传感器的接线引脚对应关系如下:

开发板 传感器
D1 (GPIO_05) SCL
D2 (GPIO_04)
SDA
3.3V Vcc
GND GND

image.png

硬件连接图,右键可打开大图

3. 云端配置

智能生活平台上创建产品及设备之前,请先确保以下两点:

3.1 产品创建

在控制台上已创建项目、产品,并完成产品的功能定义,可参见概述完成这部分的操作。功能定义时,需要注意以下两点:

  1. 产品类型选择“体温计”, 标准功能中已经包含了“人体温度”,这里只需要修改数据定义中的取值范围为0~99。
    image.png
  2. 如上图所示,设备端上报温度使用的标识符,需要与云端的配置保持一致(如上图“人体温度”所对应的标识符);

3.2 测试设备添加

添加测试设备,记录设备的激活凭证(ProductKey、ProductSecret、DeviceName、DeviceSecret,如下图红框处),后续需要将激活凭证配置到设备端。
image.png

3.3 App配置使用

公版App的参数配置及流程如下所示:

  1. 打开公版App的控制开关,详细参见配置App交付终端
  2. 设置App参数,其中选择产品面板多语言管理配网引导为必填参数,详细请参见设置App参数
  3. 下载公版App(云智能),具体参考公版App介绍
  4. 扫描配网二维码,绑定设备后调试,具体二维码参见获取配网二维码

4. 代码移植

获取参考代码(如图所示),并按以下步骤集成。
image.png

4.1 ESP8266单板适配

针对上述选用的ESP8266开发板,为保证按键中断、I2C等功能正常运行,需要做以下修改:

  1. FLASH按键对应的GPIO引脚修改;
  2. I2C总线对应的引脚修改;
  3. 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主要用来做参数配置,具体可参考官方手册:
image.png
MLX90614的RAM为只读属性,用户可以读取温度等数据,例如,通过RAM上的Tobj1可以获取被检测物体的温度数据。
image.png
I2C总线通过设备地址0X5A(MLX90614出厂设置)来访问传感器。访问RAM和EEPROM时,操作命令的对应关系如下所示:
image.png

例如访问EEPROM上0X4的地址(Emissivity correction coefficient ),其操作可以通过以下方式得到:

  1. 访问的是EEPROM,其操作码高3位为0b001
  2. 后5位为访问的地址,该地址为0X4,二进制表示为0b00100
  3. 按照上图的方式组合,操作命令为 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:
image.png
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 编译

  1. 在OS目录下执行以下命令,完成编译
  2. make thermometer@esp8266  -c config

aos make

  1. 编译生成的固件thermometer@esp8266.bin在outthermometer@esp8266binary目录下
  2. 通过ESP8266的Flash下载工具(FLASH_DOWNLOAD_TOOLS)烧录

5.2 运行

开发板参考如下:
image.png
复位单板后,长按"FLASH"键(>2s),开启配网流程,APP端参考官方文档中的“公版App使用流程”完成。
配网成功后,短按"FLASH"键(>40ms),可以触发一次温度采集,并上传云端,同时推送到手机侧云智能APP。
image.png

需要注意的是,用例中增加了校准,检测温度的的范围是34 ~ 42℃,低于这个范围,上报数据为0;高于这个范围,上报数据为99。

6. 附录

问题交流、技术支持群:
image.png

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
24天前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
73 3
|
25天前
|
Android开发 开发者 UED
个人开发 App 成功上架手机应用市场的关键步骤
个人开发 App 成功上架手机应用市场的关键步骤
|
25天前
|
开发工具 数据安全/隐私保护 Android开发
【教程】APP 开发后如何上架?
【教程】APP 开发后如何上架?
|
1月前
|
API
uni-app 146朋友圈列表api开发
uni-app 146朋友圈列表api开发
17 0
|
24天前
|
Java Android开发 开发者
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
34 3
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。
|
28天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
正如优秀的软件设计一样,uni-app把一些移动端常用的功能做成了独立的服务或者插件,我们在使用的时候只需要选择使用即可。但是在使用这些服务或者插件时一定要区分其提供的各种服务和插件的使用场景,例如其提供的【uni-starter快速开发项目模版】几乎集成了移动端所需的所有基础功能,使用非常方便,但是其许可协议只允许对接其uniCloud的JS开发服务端,不允许对接自己的php、java等其他后台系统。
135 2
|
1月前
|
移动开发 负载均衡 小程序
代驾app开发丨代驾系统开发玩法详情丨代驾系统开发网页版/H5/小程序及源码部署
**司机/代驾员端**:司机可以通过APP接收订单,查看订单详情、路线和导航,提供现场服务并进行确认。
|
1月前
|
人工智能 算法 数据处理
App Inventor 2 Personal Image Classifier (PIC) 拓展:自行训练AI图像识别模型,开发图像识别分类App
这里仅仅介绍一下AI图像识别App的实现原理,AI的基础技术细节不在本文讨论范围。通过拓展即可开发出一款完全自行训练AI模型,用于特定识别场景的App了。
40 1
|
1月前
|
API
uni-app 147我的朋友圈列表api开发
uni-app 147我的朋友圈列表api开发
12 0