《基于Blynk物联网平台的社区智能健康系统》

一、作品设计思路、实现和制作计划

        2019开始的新型冠状病毒肺炎主要症状是发热、干咳、喉咙痛、头痛、乏力、鼻塞等。在医院,护士每天给患者测量体温,测温这个环节耗时、耗人,效率不高,而且不能做到随时检测,手持测温枪对医护人员、其他病患都有传染的风险;通常医务人员仅对患者的手腕、额头的部位皮肤进行测温;而人的口腔温度是最接近人的实际温度,而且稳定,不容易受环境因素的影响,而医护人员给患者测口腔的温度是一个比较尴尬的事;

经细致观察调研,自主检测、无接触、精准检测口腔温度是一个比较适宜的科学手段。

我们的想法就设计一面镜子,采取在人们照镜子时同时进行人脸识别及测温,并增加心率及血氧的测量,获取人们每天的身体状况。以居家饰品的形式融入人们的日常生活中,既避免了人们对自身健康状况的忧虑,又增加了生活情趣。这个终端产品在养老社区、医院、疫情封控区等部署安装是非常有效的。

设计思路

  • 应用于小区、医院、养老院等小型的社区健康管理系统;
  • 管理系统由终端、服务器、管理中心组成;
  • 管理中心中显示屏可以显示人的体温、心率、血氧的变化数据,也可以通过手机查看身体指标变化折线图,还能给终端发送提示信息;
  • 搭建云服务器,处理住户信息及体温、心率、血氧监测;并将数据提供给管理中心;
  • 本设计主要是社区智能健康终端;
    • 测温没有启动时,本设备可当镜面,可悬挂、或可放置桌面上,还可以当做氛围灯使用;
    • 当AI摄像头识别到住户人脸,启动测温及心率、血氧监测,并语音提示信息;
    • 掌控板通过WIFI将数据上传到云端数据库;
    • 语音播报管理中心发送的信息,同时显示屏显示信息;
    • 本设备上部的液晶屏显示日期、时间、室外温度、湿度;

参考相关文献、产品、应用系统

[1] (中国) 王治强 孙晓东 杨永 孙鹏 著 计算机系统应用. 2021,30(01)《人脸识别算法在考勤系统的应用》:

[2] (中国) 刘玉琪 著 科学大众(中学生). 2020,(12) 《全球医务人员告急,人工智能来帮忙》;

[3] (中国) 江锐 著 电子技术及信息科学 《基于云计算的桥梁结构健康监测物联网系统设计与应用研究》;

[4]  3i Smart LT手持式红外测

http://www.raytest.net/raytest_Product_2064169018.html

[5]怎么搭建自己的Blynk物联网服务器

https://mp.weixin.qq.com/s/4Pj5r94ykiAAZKVgO2N_Mg

[6]用SIoT秒搭STEM课堂物联网服务器

https://mc.dfrobot.com.cn/thread-289794-1-1.html

二、作品创新点

1、本设计强调体温监测的准确性,采用免接触口腔测温;将测温环节融入人们生活中,想测就测,避免检测人员上门,或核酸检测时临时发现体温异常者,而造成恐慌;

2、本设计对如何保证测温中采集数据的准确性作了多次修改与验证,并能与住户信息准确对应;

3、本设计采用PET高强度聚脂薄膜,单向透视,在无背光源情况下形成镜面效果,作为镜子使用;在有背光源情况下,透出清淅的画面图像。与内置平面镜形成无限反射,环形灯带产生炫幻的效果。

4、本设备不仅可以接入社区健康管理系统,医护人员还可以手机查看护对象健康数据的变化曲线,对患者功老人健康状况会自动报警,大降低看护对象或家属的担忧。

三、材料清单和相关要求,包括软硬件名称、类型等

序号设备型号连接针脚测量数据单位备注单价数量金额(元)
1开发板掌控板2.0   主控99199
2I/O扩展板micro:bit掌控双兼容   连接外置传感器、执行器89189
3语音合成模块module V2.0 UARTP0、P1  发出提示音1991199
4AI摄像头哈仕奇P15、P16  人脸识别3791379
5免接触红外测温模块GY-906    DCIIIC温度°C免接触测温1151115
6心率传感器MAX30102 IIC心率Times/min测量用户心率、血氧89189
7LED灯条WS2812P8  氛围灯10110
8行空板
UNIHIKER
   联接wifi显示EasyIOT数据3991399
9其它     45145
 合计       1370

四、制作过程

包括至少5个步骤,每个步骤需配合图片和文字说明

1、初步构思:作为医疗器具的结构设计

2、外形结构讨论,做为一种生活用品的结构想法

3、设计定位为家居装饰-社区智能健康系统

4、模型制作,激光切割、拼装

5、硬件连接设计

6、编程设计

编程涉及的功能模块较多,使用图形化编程软件Mind+进行初步设计,后期转源代码,使用VScCode调试。

掌控板编程部分

/*!

 * MindPlus

 * mpython

 *

 */

#include <MPython.h>

#include <DFRobot_Iot.h>

#define BLYNK_PRINT Serial

#include <DFRobot_MLX90614.h>

#include <DFRobot_HuskyLens.h>

#include <DFRobot_BloodOxygen_S.h>

#include <DFRobot_SpeechSynthesis_M.h>

#include <BlynkSimpleEsp32.h>

#include <WidgetRTC.h>

// 动态变量

volatile float mind_n_WenDu, mind_n_XinLvShuJu, mind_n_XueYangShuJu;

// 函数声明

void DF_ChuShiHua();

// 静态常量

const String topics[5] = {“S3x2ggYnR”,””,””,””,””};

// 创建对象

DFRobot_Iot                  myIot;

DFRobot_SpeechSynthesis_UART sstts;

DFRobot_HuskyLens            huskylens;

DFRobot_MLX90614_IIC         mlx90614;

DFRobot_BloodOxygen_S_I2C    max30102(&Wire, 0x57);

// 主程序开始

void setup() {

    mPython.begin();

    sstts.begin(sstts.eV2, &Serial2, P0, P1);

    max30102.begin();

    Blynk.config(“jchU7WOpsq4j6nq7l6MUpjpDls6CITZL”, IPAddress(192,168,15,1), 8080);

    DF_ChuShiHua();

}

void loop() {

    huskylens.request();

    if (huskylens.isLearned(1)) {

        if (huskylens.isAppearDirect(HUSKYLENSResultBlock)) {

            if (huskylens.isAppear(1,HUSKYLENSResultBlock)) {

                sstts.speak(“徐子涵先生,很高兴为您服务”);

                myIot.publish(topic_0, “徐子涵”);

                for (int index = 0; index < 10; index++) {

                    delay(500);

                    myIot.publish(topic_0, (String(max30102.getSPO2()) + String(“%”)));

                    myIot.publish(topic_0, (String(max30102.getHeartbeat()) + String(“Times/min”)));

                    myIot.publish(topic_0, (String(mlx90614.getObjectTempC()) + String(“℃”)));

                    mind_n_WenDu = mlx90614.getObjectTempC();

                    mind_n_XinLvShuJu = max30102.getHeartbeat();

                    mind_n_XueYangShuJu = max30102.getSPO2();

                    Blynk.virtualWrite(V0, mind_n_WenDu);

                    Blynk.virtualWrite(V2, mind_n_XueYangShuJu);

                    Blynk.virtualWrite(V4, mind_n_XinLvShuJu);

                    yield();

                }

                myIot.publish(topic_0, “清零”);

            }

            else {

                sstts.speak(“你好,请保持有效距离”);

            }

        }

    }

    if (huskylens.isLearned(2)) {

        if (huskylens.isAppearDirect(HUSKYLENSResultBlock)) {

            if (huskylens.isAppear(2,HUSKYLENSResultBlock)) {

                sstts.speak(“吴承瀚先生,很高兴为您服务”);

                myIot.publish(topic_0, “吴承瀚”);

                for (int index = 0; index < 10; index++) {

                    delay(500);

                    myIot.publish(topic_0, (String(max30102.getSPO2()) + String(“%”)));

                    myIot.publish(topic_0, (String(max30102.getHeartbeat()) + String(“Times/min”)));

                    myIot.publish(topic_0, (String(mlx90614.getObjectTempC()) + String(“℃”)));

                    mind_n_WenDu = mlx90614.getObjectTempC();

                    mind_n_XinLvShuJu = max30102.getHeartbeat();

                    mind_n_XueYangShuJu = max30102.getSPO2();

                    Blynk.virtualWrite(V1, mind_n_WenDu);

                    Blynk.virtualWrite(V3, mind_n_XueYangShuJu);

                    Blynk.virtualWrite(V5, mind_n_XinLvShuJu);

                    yield();

                }

                myIot.publish(topic_0, “清零”);

            }

            else {

                sstts.speak(“你好,请保持有效距离”);

            }

        }

    }

    Blynk.run();

}

// 自定义函数

void DF_ChuShiHua() {

    mind_n_WenDu = 0;

    mind_n_XinLvShuJu = 0;

    mind_n_XueYangShuJu = 0;

    myIot.wifiConnect(“GT-ndwz”, “ndwz-chqzhc”);

    myIot.init(“iot.dfrobot.com.cn”,”zlsTe6f7R”,””,”z_yTeeB7Rz”,topics,1883);

    myIot.connect();

    while (!myIot.wifiStatus()) {yield();}

    while (!myIot.connected()) {yield();}

    display.setCursorLine(1);

    display.printLine(“系统初始化中”);

    sstts.speak(“系统初始化中,请稍候”);

    display.setCursorLine(2);

    display.printLine(“连接网络中……”);

    display.setCursorLine(3);

    display.printLine(“请稍候……”);

    display.setCursorLine(4);

    display.printLine(“网络连接成功”);

    sstts.speak(“网络连接成功”);

    huskylens.beginSoftwareSerialUntilSuccess(P14, P13);

    huskylens.writeAlgorithm(ALGORITHM_FACE_RECOGNITION);

    huskylens.clearOSD();

    display.fillScreen(0);

    display.setCursorLine(1);

    display.printLine(“人脸识别初始化成功”);

    sstts.speak(“人脸识别初始化成功”);

    max30102.sensorStartCollect();

    sstts.speak(“物联网启动成功”);

    display.setCursorLine(2);

    display.printLine(“物联网启动成功”);

}

行空板编程部分

#  -*- coding: UTF-8 -*-

# MindPlus

# Python

from pinpong.board import Board

from unihiker import GUI

import requests

import siot

import time

# 自定义函数

def QiDongwifiSheZhi():

    print(“扫描WIFI:”)

    my_variable = requests.get(“http://10.1.2.3/wifi/scan”)

    print(my_variable.text)

    print(“扫描WIFI:”)

    my_variable = requests.get(“http://10.1.2.3/wifi/connect?ssid=MI8&password=233233giao”)

    print(my_variable.text)

    print(“查看WiFi连接情况:”)

    my_variable = requests.get(“http://10.1.2.3/wifi/status”)

    print(my_variable.text)

# 事件回调函数

def on_message_callback(client, userdata, msg):

    if (msg.payload.decode().find(“℃”)!=-1):

        v1.config(text=msg.payload.decode())

    else:

        time.sleep(0.2)

        v1.config(text=””)

    if (msg.payload.decode().find(“%”)!=-1):

        b1.config(text=msg.payload.decode())

    else:

        time.sleep(0.2)

        b1.config(text=””)

    if (msg.payload.decode().find(“Times/min”)!=-1):

        a1.config(text=msg.payload.decode())

    else:

        time.sleep(0.2)

        a1.config(text=””)

Board().begin()

siot.init(client_id=””,server=”iot.dfrobot.com.cn”,port=1883,user=”zlsTe6f7R”,password=”z_yTeeB7Rz”)

u_gui=GUI()

siot.connect()

siot.loop()

siot.set_callback(on_message_callback)

QiDongwifiSheZhi()

siot.getsubscribe(topic=”S3x2ggYnR”)

head=u_gui.draw_text(text=”社区健康系统”,x=40,y=10,font_size=18, color=”#CC0000″)

pic1=u_gui.draw_image(image=”southeast.png”,x=70,y=55)

pic1.config(w=100)

pic1.config(h=100)

v=u_gui.draw_text(text=”体温:”,x=30,y=150,font_size=15, color=”#CC0000″)

v1=u_gui.draw_text(text=”    “,x=90,y=150,font_size=15, color=”#CC0000”)

a=u_gui.draw_text(text=”心率:”,x=30,y=175,font_size=15, color=”#CC0000″)

a1=u_gui.draw_text(text=”    “,x=90,y=175,font_size=15, color=”#CC0000”)

b=u_gui.draw_text(text=”血氧:”,x=30,y=200,font_size=15, color=”#CC0000″)

b1=u_gui.draw_text(text=”    “,x=90,y=200,font_size=15, color=”#CC0000”)

ip=u_gui.draw_text(text=”ip:10.1.2.3:8080″,x=62,y=265,font_size=10, color=”#CC0000″)

txt=u_gui.draw_text(text=”MQTT连接成功”,x=62,y=280,font_size=12, color=”#CC0000″)

name=u_gui.draw_text(text=”GT创客空间   出品”,x=35,y=300,font_size=10, color=”#CC0000″)

while True:

    pass

7、调试

由于使用摄像头、行空板、语音合成模块,扩展板供电不足,有时摄像头点不亮,行空板、掌控板也不够稳定,手扫感应开关模块的加入,很好控制了本设备的开机时间。

五、成果

包括外观图片、功能介绍、演示效果等,并提供必要的使用说明(包括外观图片、功能介绍、演示效果等,并提供必要的使用说明)

功能介绍:

  1. 测温没有启动时,本作品可当镜面,可悬挂或放置桌面上,可以当做氛围灯使用;
  2. 当AI摄像头识别到用户人脸,启动测温,并语音提示信息;根据提示,将手指按在心率传感器上,检测心率与血氧浓度;
  3. 掌控板通过WIFI将数据上传到云端数据库;
    •  
  4. 语音播报管理中心发送的信息,同时显示屏显示信息;

不足之处:

    本设计使用教育用的独立智能硬件,比如语音识别模块、AI摄像头、行空板等,成本计算偏高;如果要产品化设计,对于可以采用价格较低的普通硬件,在网速有保证的情况下,可以将智能化的模型计算、判断交给云端服务器(比如:百度大脑、科大迅飞等),减轻主控板的运算强度,供电功率也就可以降下来;

    本项目,在未来可以将外形设计得更加美观,功能更加完善,使其测量精度更高,指向性更准确,并可以采用更加轻便牢固的材料。相信该项目能够很好的应用于生活中,使人们在疫情环境下更加方便。

六、团队成员介绍和工作分工说明

黄宣昊负责建模与编程,陈宇煊负责收集与整理信息,外形结构制作等,并与指导老师多次交流,参考或借鉴了老师的一些建议。

七、团队工作讨论记录表

第一次讨论:

讨论时间: 2022年 1月 10日 13点0 分至15点30分    

参会人数:2人 陈宇煊  黄宣昊   缺席人数:0人

(一)主要讨论内容:

1、设计作品定位

2、作品使用的硬件模块等

(二)主要决定项(会议达成的主要成果,包括对后续方案的决策等)

1、本人参考资料,决定定位为医疗设备

2、决定使用掌控板做为主控,加入测温头、AI摄像头、语音合成模块

下一步行动项负责人时间节点
硬件连接,试验功能效果;陈宇煊2022.1.12
2、作品定位重新考虑,再征求意见;陈宇煊2022.1.15
3、作品外形结构重新设计黄宣昊2022.1.18
出席人员签到:提前约定下次会议时间:

第二次讨论:

讨论时间: 2022年 2月 6日20点 0分至23点0分   

 参会人数:3人  陈宇煊  黄宣昊 邬肖英(师)  缺席人数:0人

(一)主要讨论内容:

1、作品定位确定为家居装饰用品、疫情防控管理助手

2、编程中调用的相关网络模块

3、是否考虑管理端手机APP的设计

(二)主要决定项(会议达成的主要成果,包括对后续方案的决策等)

1、认同本人对作品的重新定位

2、决定使用简单的教学用的数据库TinyWebDB服务器以及物联网Easy IOT,手机端不再编写APP,直接使用Blynk APP

下一步行动项负责人时间节点
1、激光切割、安装黄宣昊自行安排,不定时
2、硬件连接,加固陈宇煊自行安排,不定时
3、编程、调试黄宣昊自行安排,不定时
出席人员签到:提前约定下次会议时间:

1人评论了“《基于Blynk物联网平台的社区智能健康系统》”

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部