天天看點

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

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按鍵),可用于觸發體溫檢測上報。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

傳感器--MLX90614ESF-DCI-000-TU(I2C接口)

這顆傳感器是一款紅外的非接觸溫度計,支援I2C通信協定,主要用到SDA和SCL兩條線,可以很友善的連接配接到ESP8266開發闆上。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

說明如下:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

硬體連接配接

開發闆與傳感器的接線引腳對應關系如下:

開發闆 傳感器
D1 (GPIO_05) SCL
D2 (GPIO_04) SDA
3.3V Vcc
GND
快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)
硬體連接配接圖,右鍵可打開大圖

3. 雲端配置

智能生活平台上建立産品及裝置之前,請先確定以下兩點:

3.1 産品建立

在控制台上已建立項目、産品,并完成産品的功能定義,可參見

概述

完成這部分的操作。功能定義時,需要注意以下兩點:

  1. 産品類型選擇“體溫計”, 标準功能中已經包含了“人體溫度”,這裡隻需要修改資料定義中的取值範圍為0~99。
    快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)
  2. 如上圖所示,裝置端上報溫度使用的辨別符,需要與雲端的配置保持一緻(如上圖“人體溫度”所對應的辨別符);

3.2 測試裝置添加

添加測試裝置

,記錄裝置的激活憑證(ProductKey、ProductSecret、DeviceName、DeviceSecret,如下圖紅框處),後續需要将激活憑證配置到裝置端。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

3.3 App配置使用

公版App的參數配置及流程如下所示:

  1. 打開公版App的控制開關,詳細參見 配置App傳遞終端
  2. 設定App參數,其中選擇産品面闆、多語言管理、配網引導為必填參數,詳細請參見 設定App參數
  3. 下載下傳公版App(雲智能),具體參考 公版App介紹
  4. 掃描配網二維碼,綁定裝置後調試,具體二維碼參見 擷取配網二維碼

4. 代碼移植

擷取

參考代碼

(如圖所示),并按以下步驟內建。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

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主要用來做參數配置,具體可參考官方手冊:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

MLX90614的RAM為隻讀屬性,使用者可以讀取溫度等資料,例如,通過RAM上的Tobj1可以擷取被檢測物體的溫度資料。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

I2C總線通過裝置位址0X5A(MLX90614出廠設定)來通路傳感器。通路RAM和EEPROM時,操作指令的對應關系如下所示:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

例如通路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:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

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. 編譯生成的固件[email protected]在outthermometer@esp8266binary目錄下
  2. 通過ESP8266的Flash下載下傳工具(FLASH_DOWNLOAD_TOOLS)燒錄

5.2 運作

開發闆參考如下:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

複位單闆後,長按"FLASH"鍵(>2s),開啟配網流程,APP端參考官方文檔中的“

公版App使用流程

”完成。

配網成功後,短按"FLASH"鍵(>40ms),可以觸發一次溫度采集,并上傳雲端,同時推送到手機側雲智能APP。

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

需要注意的是,用例中增加了校準,檢測溫度的的範圍是34 ~ 42℃,低于這個範圍,上報資料為0;高于這個範圍,上報資料為99。

6. 附錄

問題交流、技術支援群:

快速開發一個帶APP的紅外體溫檢測槍(基于AliOS Things Inside的Wi-Fi模組)

繼續閱讀