基于STM32设计的云端健康管理系统(采用阿里云物联网平台)

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于STM32设计的云端健康管理系统(采用阿里云物联网平台)相关的知识,希望对你有一定的参考价值。

1. 前言

近几年随着科技的进步和智能化浪潮的到来,智能穿戴设备也在飞速火爆发展,各种健康智能手环,智能手表、智能跑鞋、智能眼镜纷纷上市,并出现了很多针对个人家庭的健康管理设备。比如: 智能血压计、智能心率检测、脂肪秤、智能体重秤等等,都带上了智能、健康各种标签。

可穿戴设备,即直接穿在身上,或是整合到用户的衣服或配件的一种便携式设备。可穿戴设备不仅仅是一种硬件设备,更是通过软件支持以及数据交互、云端交互来实现强大的功能,可穿戴设备将会对生活、感知带来很大的转变。

当前采用STM32加上各种外设传感器配合物联网平台设计一个健康管理设备,通过ESP8266+MQTT协议将数据传输到物联网平台,实现云端健康管理。

物联网平台采用阿里云,下面是设计的界面与设备的整体效果:




2. 设计需求

设备需要支持以下功能:

(1)人体温度测量
(2)运动监测、计步功能
(3)睡眠监测
(4)心率测量

STM32采集这些传感器数据之后,进行处理,在本地OLED显示屏上完成显示;再通过ESP8266将数据传递到物联网平台,完成云端数据展示。

人体温度测量超过规定阈值时、心率测量超过规定阈值、睡眠监测睡眠时长如超出8h,云端以及本地0led屏发出文字提醒并且蜂鸣器报警。

3. 硬件选型

3.1 MAX30102血氧传感器

MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。它集成了一个红光LED和一个红外光LED、光电检测器、光器件,以及带环境光抑制的低噪声电子电路。MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源,应用于可穿戴设备进行心率和血氧采集检测,佩戴于手指、耳垂和手腕等处。标准的I2C兼容的通信接口可以将采集到的数值传输给Arduino、KL25Z、51、STM32等单片机进行心率和血氧计算。此外,该芯片还可通过软件关断模块,待机电流接近为零,实现电源始终维持供电状态。

接线如下:

产品名称      MAX30102心率模块
LED峰值波长   660nm/880nm
LED供电电压   3.3~5V
检测信号类型  光反射信号(PPG)
输出信号接口   I2C接口
通信接口电压   1.8~3.3V5V(可选)

原理说明:

光溶积法: 利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的;

光源: 采用对动脉血中氧合血红蛋白(Hb02)-和血红蛋白(Hb)有选择性的特定波长的发光极管透光率转化为电信号:动脉搏动充血容积委化导致够束光的透光率发生改变,此时由光电变换接收经人体组织反身光线,转变为电信号并将其放大输出。

引脚说明:

VIN:主电源电源输入端,1.8V-5V 3位焊盘:选择总线上的拉电平,取决于引脚主控电压,可选1.8V端或者3.3v端(此端包含3.3V及以上)
SCL:接IIC总线的时钟
SDA:接IIC总线的数据
NT: MAX30102芯片的中断引脚
RD: MAX30102芯片的 RED LED接地端,一般不接
IRD: MAX30102芯片的RLED接地端,一般不接
GND:接地线

PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指、耳垂等处,通过导线连接可将采集到的模拟信号传输给 Arduino 等单片机用来转换为数字信号,再通过 arduino 等单片机简单计算后就可以得到心率数值,此外还可将脉搏波形通过串口上传到电脑显示波形。 PulseSensor 是一款开源硬件, 目前国外官网上已有其对应的 arduino 程序和上位机 Processing 程序, 其适用于心率方面的科学研究和教学演示,也非常适合用于二次开发。

特别提醒:传感器背面是电子元件,请不要用手指直接接触, 以免静电或汗液造成背面器件损坏。 可以在背面粘贴黑色粘扣, 正面粘贴透明膜来保护传感器。

传感器的接口一共 3 个, 如上图红框内所示。 请大家千万不要根据线的颜色来自行推测, 而要根据电路板的背面标识来分辨。
红框中的 3 根线,标有 S 的为模拟信号输出线(最左边) ; 标有+的为电源输入线(中间);标有-的为地线(最右边) 。
总结一下:
S → 脉搏信号输出(要接单片机 AD 接口)

  • → 5v(或 3.3v)电源输入
  • → GND 地

3.2 MPU6050

MPU6050特点:

(1)高性能三轴加速度+三轴陀螺仪的六轴传感器模块MPU6050芯片;

(2)可利用自带的数字运动处理器(DMP)硬件加速引擎,通过主IKC接口,向应用端输出姿态解算后的数据,使用InvenSense公司提供的运动处理资料库,实现姿态解算,降低了运动处理运算对操作系统的负荷同时大大降低了开发难度;

(3)体积小,自带温度传感器;

(4)支持IIC从机地址设置和中断;

(5)兼容3.3V/5V系统;

3.3 STM32开发板

STM32F103RCT6的芯体规格是32位,速度是72MHz,程序存储器容量是256KB,程序存储器类型是FLASH,RAM容量是48K。

3.4 ESP8266 WIFI

ESP8266是一款物联网WiFi芯片,基于ESP8266可以开发物联网串口WiFi模块,像SKYLAB的WG219/WG229专为移动设备和物联网应用设计,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。

ESP8266,专为移动设备、可穿戴电子产品和物联网应用而设计,通过多项专有技术实现了超低功耗。ESP8266EX 具有的省电模式适用于各种低功耗应用场景。

ESP8266内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,支持实时操作系统 (RTOS) 和 Wi-Fi 协议栈,可将高达 80% 的处理能力留给应用编程和开发。

3.5 GY-MCU90615V2体温传感器

通信协议:

串口发送命令字节:
(1)、串口通信参数(默认波特率值9600 bps,可通过软件设定)
波特率:9600 bps     校验位:N   数据位:8   停止位:1
波特率:115200 bps   校验位:N   数据位:8   停止位:12)、模块输入命令,由外部控制器发送至GY-MCU90615模块(十六进制)

1、帧头:0xa5
指令格式:帧头+指令+校验和(8bit)(如自动读取温度指令=0xA5+0x45+0xEA2、命令指令: 
连续输出指令:
0xA5+0x45+0xEA----------------温度数据(模块返回数据类型为0x45)

查询输出指令:
0xA5+0x15+0xBA ---------------温度数据(模块返回数据类型为0x45)

配置指令:(掉电重启后生效)  
波特率配置:
0xA5+0xAE+0x53 ---------------9600(默认)
0xA5+0xAF+0x54 ---------------115200
上电是否自动发送温度数据配置:
0xA5+0x51+0xF6---------------上电后自动输出温度数据(默认)
0xA5+0x52+0xF7---------------上电后不自动输出温度数据

通信协议
串口接收:
(1)、串口通信参数(默认波特率值9600 bps,可通过软件设定)
波特率:9600 bps     校验位:N   数据位:8   停止位:1
波特率:115200 bps   校验位:N   数据位:8   停止位:12)、模块输出格式,每帧包含9个字节(十六进制):
①.Byte0:   0x5A        帧头标志 
②.Byte1:   0x5A        帧头标志 
③.Byte2:   0X45        本帧数据类型(0X45:温度数据)
④.Byte3:   0x04       数据量(以下4个数据2组为例)
⑤.Byte4:   0x00~0xFF   数据18位
⑥.Byte5:   0x00~0xFF   数据18位
⑦.Byte6:   0x00~0xFF   数据28位
⑧.Byte7:   0x00~0xFF   数据28位
⑨.Byte8:   0x00~0xFF   校验和(前面数据累加和,仅留低8位) 
    
(3)、数据计算方法
温度计算方法 :
温度=8<<88位(结果为实际角度乘以100)
例:发送指令:A5 45 EA   ,接收到一帧数据:
<5A- 5A- 45- 04- 0C- 78- 0D- 19- A7 >
表示TO(有符号16bit,表示目标温度):TO=0x0C78/100=31.92 ℃
表示TA(有符号16bit,表示环境温度):TO=0x0D19/100=33.53 ℃

使用方法
 该模块为串口输出数据,使用者通过串口连接后,发送输出指令,例如0xA5+0x45+0xEA给模块,模块将连续输出温度数据;如想通过查询输出可发送0xA5+0x15+0xBA给模块,每发送一次,模块将返回一次温度数据,查询频率应低于10hz,如需高于10hz请使用连续输出模式,即发送0xA5+0x45+0xEA指令;

3.6 OLED显示屏

特点:

OLED是有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且OLED显示屏幕可视角大、功耗低、OLED由于同时具备自发光、不需背光源(只是供电不会亮的、驱动程序和接线正确才会点亮)对比度高、厚度薄视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而OLED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的显示效果好、模块供电可以是3.3v也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制oLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCH、图案等、同时为了方便应用在产品上、预留4个M3固定孔、方便用户固在机壳上。

3.7 母对母杜邦线

三、阿里云物联网云平台

3.1 创建产品

官网地址: https://iot.console.aliyun.com/lk/summary/new

没有账号需要先注册账号,实名认证之后登录。

(1)选择公共实例

(2)创建产品

(3)配置产品信息

3.2 创建设备

(1)点击添加设备

产品下可以创建多个具体设备,设备也可以使用接口让设备端自动创建,下面采用网页手动添加的方式,添加设备。

(2)点击添加设备

(3)填入设备的信息

(4)保存设备信息

创建成功后复制设备证书信息,方便后续生成MQTT登录参数使用。


  "ProductKey": "a1cMlEwEwjg",
  "DeviceName": "healthy_iot_dev",
  "DeviceSecret": "9203ea85a963b40ace7686d01046598f"

(5)创建成功

(6)查看设备证书信息

如果刚才没有复制保存,可以在设备详情页面查看设备证书。

3.3 创建自定义属性

云端的产品、设备创建完毕之后,那么本地具体的设备肯定会向云端设备上传数据,那上传的数据用什么字段保存,数据是什么类型,这些需要提前创建,这样约定好之后,设备端才可以正常的上传数据上来。

(1)找到功能定义选项页面

(2)添加自定义功能

根据自己传感器的数据属性添加即可。

(3)添加心率属性

(4)添加血氧饱和度属性

(5)添加人体体温属性

(5)添加行走的步数

(6)添加完毕发布上线

(4)完成

3.4 查看物模型

接下来设备端的数据上报就要参考物模型的格式来完成数据拼接。

(1)完整物模型


  "schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
  "profile": 
    "version": "1.0",
    "productKey": "a1cMlEwEwjg"
  ,
  "properties": [
    
      "identifier": "HeartRate",
      "name": "心率",
      "accessMode": "r",
      "desc": "心率",
      "required": false,
      "dataType": 
        "type": "int",
        "specs": 
          "min": "1",
          "max": "500",
          "step": "1"
        
      
    ,
    
      "identifier": "BloodOxygen",
      "name": "血氧饱和度",
      "accessMode": "rw",
      "desc": "血氧饱和度",
      "required": false,
      "dataType": 
        "type": "int",
        "specs": 
          "min": "1",
          "max": "100",
          "unit": "%",
          "unitName": "百分比",
          "step": "1"
        
      
    ,
    
      "identifier": "temperature",
      "name": "人体体温",
      "accessMode": "r",
      "desc": "人体体温",
      "required": false,
      "dataType": 
        "type": "int",
        "specs": 
          "min": "1",
          "max": "100",
          "unit": "°C",
          "unitName": "摄氏度",
          "step": "1"
        
      
    ,
    
      "identifier": "steps",
      "name": "行走步数",
      "accessMode": "r",
      "desc": "行走步数",
      "required": false,
      "dataType": 
        "type": "int",
        "specs": 
          "min": "1",
          "max": "100000",
          "unit": "stepCount",
          "unitName": "步",
          "step": "1"
        
      
    
  ],
  "events": [
    
      "identifier": "post",
      "name": "post",
      "type": "info",
      "required": true,
      "desc": "属性上报",
      "method": "thing.event.property.post",
      "outputData": [
        
          "identifier": "HeartRate",
          "name": "心率",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "500",
              "step": "1"
            
          
        ,
        
          "identifier": "BloodOxygen",
          "name": "血氧饱和度",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100",
              "unit": "%",
              "unitName": "百分比",
              "step": "1"
            
          
        ,
        
          "identifier": "temperature",
          "name": "人体体温",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100",
              "unit": "°C",
              "unitName": "摄氏度",
              "step": "1"
            
          
        ,
        
          "identifier": "steps",
          "name": "行走步数",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100000",
              "unit": "stepCount",
              "unitName": "步",
              "step": "1"
            
          
        
      ]
    
  ],
  "services": [
    
      "identifier": "set",
      "name": "set",
      "required": true,
      "callType": "async",
      "desc": "属性设置",
      "method": "thing.service.property.set",
      "inputData": [
        
          "identifier": "BloodOxygen",
          "name": "血氧饱和度",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100",
              "unit": "%",
              "unitName": "百分比",
              "step": "1"
            
          
        
      ],
      "outputData": []
    ,
    
      "identifier": "get",
      "name": "get",
      "required": true,
      "callType": "async",
      "desc": "属性获取",
      "method": "thing.service.property.get",
      "inputData": [
        "HeartRate",
        "BloodOxygen",
        "temperature",
        "steps"
      ],
      "outputData": [
        
          "identifier": "HeartRate",
          "name": "心率",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "500",
              "step": "1"
            
          
        ,
        
          "identifier": "BloodOxygen",
          "name": "血氧饱和度",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100",
              "unit": "%",
              "unitName": "百分比",
              "step": "1"
            
          
        ,
        
          "identifier": "temperature",
          "name": "人体体温",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100",
              "unit": "°C",
              "unitName": "摄氏度",
              "step": "1"
            
          
        ,
        
          "identifier": "steps",
          "name": "行走步数",
          "dataType": 
            "type": "int",
            "specs": 
              "min": "1",
              "max": "100000",
              "unit": "stepCount",
              "unitName": "步",
              "step": "1"
            
          
        
      ]
    
  ]

(2)精简物模型


  "properties": [
    
      "identifier": "HeartRate",
      "dataType": 
        "type": "int"
      
    ,
    
      "identifier": "BloodOxygen",
      "dataType": 
        "type": "int"
      
    ,
    
      "identifier": "temperature",
      "dataType": 以上是关于基于STM32设计的云端健康管理系统(采用阿里云物联网平台)的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32L431设计的云端绿化管理系统(ESP8266+阿里云物联网平台)

基于STM32L431设计的云端绿化管理系统(ESP8266+腾讯物联网云平台)

基于STM32L431设计的云端绿化管理系统(ESP8266+腾讯物联网云平台)

基于STM32的阿里云物联网项目实战

#yyds干货盘点# 基于STM32+ESP8266+华为云IoT设计的健康管理系统并完成应用侧开发

基于STM32设计的健康检测设备(测温心率计步)