电路设计论坛
直播中

蒲泛粟

8年用户 1011经验值
私信 关注
[资料]

利用涂鸦IoT平台改进带涂鸦智能的物联网心率 (BPM) 监测和追踪器

描述
带涂鸦智能的物联网心率 (BPM) 监测和追踪器

心率或脉搏是您每分钟心跳的次数 (BPM)。虽然心脏在全身循环氧气和富含营养的血液,但心率是这一过程的基础,因为心脏的功能(称为“心输出量”)与心率和每搏输出量(泵出的血液量)直接相关每拍)。因此,心率或节律的快速激增或耗竭可能表明患有心脏病、肺部疾病或其他问题。因此,跟踪我们的心率可以让我们深入了解我们的整体健康状况。

虽然监测和跟踪心率(BPM)的方法和系统非常丰富,但在这个项目中,我专注于开发一种新设备,该设备具有易于理解的移动应用程序界面,兼容Android和iOs,用于观察心率产生的数据。脉搏血氧计传感器。

我决定在这个项目中使用涂鸦 IoT 平台,因为它可以让我开发一个兼容各种操作系统的移动应用程序接口,并将信息保存到涂鸦云,以跟踪脉搏血氧仪传感器产生的数据。在接下来的步骤中,我将详细解释我是如何利用涂鸦 IoT 平台来改进这个项目的。
当我从头开始开发此设备以监测和跟踪心率 (BPM) 时,我不想让该设备仅与一种类型的脉搏血氧计传感器一起工作。因此,该设备支持连接到 Arduino Nano 的两种不同传感器类型:

  • MAX30102
  • MAX30100

我可以使用上面提到的两个传感器,但我决定使用 MAX30102。然后,我连接了一块 SSD1306 OLED(128x64)屏幕显示心率(BPM),然后将数据发送到涂鸦云。

最后,我添加了一个 5mm 共阳极 RGB LED 来显示设备与涂鸦云的连接状态。

在涂鸦云支持的移动应用界面上,设备可以让用户展示三个不同的数据点,并带有相关图表:

  • Finger_In - 手指定位
  • Respiratory_Rate - BPM
  • Blood_Oxygen - SpO2(可选)
  • Blood_Oxygen - 红光测量(可选)

在面包板上完成接线并测试代码后,我设计了受呼吸系统启发的 PCB,作为心率显着性的指标。因此,该设备成为监测和跟踪心率的时尚且实用的设备:)






第 1 步:设计和焊接 IoT 心率监测器 PCB
在对我的 PCB 设计进行原型设计之前,我在面包板上使用 Arduino Nano 和 ESP8266 测试了所有连接和布线。



然后,我使用 KiCad 设计了 ​​IoT 心率监测器 PCB - 灵感来自珍贵的呼吸系统 :) 我在下面附上了 PCB 的 Gerber 文件,所以如果您愿意,您可以从 PCBWay 订购此 PCB,以创建合适且有效的使用涂鸦智能监测和跟踪脉搏血氧仪传感器生成的数据的设备。





首先,通过使用烙铁,我连接了接头(母头)、MAX30102 脉搏血氧计传感器、按钮(6x6)、5mm 共阳极 RGB LED、220Ω 电阻和电源插孔。

PCB上的元件清单:
A1(Arduino Nano 接头)
ESP_1(NodeMCU V3 LoLin ESP8266 的标头)
S1(SSD1306 OLED 屏幕接头)
M_X1 (MAX30102)
M_X2 (MAX30100)
K1(6x6 按钮)
D1 (5mm 共阳极 RGB LED)
R1、R2、R3(220Ω电阻)
J1(电源插孔)
J2(外部电池接头)







第二步:在涂鸦IoT平台上创建新产品
涂鸦智能是一个全球物联网平台,为品牌、OEM、制造商和零售连锁店提供智能家居产品。但是,涂鸦并非只为公司提供服务和 API。涂鸦已经建立了一个物联网云平台,为开发者提供一整套产品,包括平台即服务(PaaS)、软件即服务(SaaS)和其他基于云的服务。涂鸦云平台构建了蓬勃发展的生态系统,提供超过 1100 个品类、410,000 多个产品 SKU,覆盖 220 多个国家和地区。

涂鸦物联网平台 让用户从零开始开发智能产品,并提供针对不同产品类型的内置功能。此外,涂鸦 SDK 允许通过串行通信控制带有开发板的注册和授权产品。您可以从涂鸦开发者平台获取更多关于涂鸦 SDK 的信息 。



在使用涂鸦 IoT 平台为该项目创建定制产品时,我决定将 NodeMCU V3 LoLin ESP8266 转换为注册和授权的涂鸦产品。然后,我使用 Arduino Nano 与授权产品(ESP8266)进行通信。借助涂鸦官方 Arduino 库,Arduino Nano 可以通过串口通讯方式与授权产品进行通信,在连接涂鸦智能 App 后,向涂鸦云发送数据并接收来自涂鸦云的指令。



首先,进入 涂鸦账号注册页面 ,创建一个开发者账号。

  • 协议 无线上网
  • 电源类型 标准功耗





创建产品后,从标准功能中选择要添加到产品的功能,如果标准功能不支持,则创建新功能(自定义)。

标准功能是指涂鸦为其产品类别提供的功能。由于有很多内置产品,很容易找到您需要的功能。此外,您可以 根据您的项目创建名为Custom functions的专用函数。

数据点(DP)是一个函数的抽象表示,每个函数都有一个ID和数据类型。

数据点ID(DP ID):表示数据点(功能)的代码。涂鸦云通过数据点 ID 发送或接收数据。

数据类型:布尔值、值(整数)、枚举、故障、字符和 RAW。

涂鸦提供了一些内置的血氧仪功能,我不必为我的产品创建新功能:

  • Finger_In - 104 - 布尔
  • Respiratory_Rate - 102 - 值
  • Blood_Oxygen(或红灯) - 103 - 值
  • Blood_Oxygen 数据 - 101 - 原始(可选)







然后,进入 硬件开发 ,选择 涂鸦标准模块 SDK 下 的TYWE3S Wi-Fi 模块。它与 ESP-12E (ESP8266) 模块有一个无法区分的引脚排列。





步骤 2.1:开发移动应用程序界面(面板)
成功创建产品后,进入设备面板。然后,单击 Visualized DIY Panel 下的 Create Blank Panel。



现在,使用拖放组件设计面板(移动应用程序界面)。它类似于 MIT App Inventor。



设计面板后,单击“ 释放” 按钮并输入所需信息。



最后,  在 Android 或 iOS 上下载涂鸦智能应用并注册。

我将通过以下步骤向您展示如何使用涂鸦智能应用程序连接产品(ESP8266)。



第三步:注册并授权 ESP8266 为涂鸦产品
使用 NodeMCU V3 LoLin ESP8266 作为本项目的涂鸦产品,您需要使用所需的固件对其进行刷写和授权。

首先,进入 涂鸦智能 PMS 系统 ,创建一个开发者账号。





然后,进入 生产管理?工单管理 ? 激活码验证。要激活产品的生产证书,请输入令牌 ID。确认 Token ID 后,ESP8266 就可以刷机和授权了。





确认后,从 知识库管理下载最新版本的 云模块测试平台?软件下载。您可以在下载中找到副本。



下载云模块后,打开并登录。然后,进入文件?设置并输入所需的设置,如下所示:

  • 烧波特率?921600
  • 测试波特?9600



点击 输入令牌?Token 并将 Token ID 粘贴到 Burning Authorization下。不要忘记选择 固件下载



现在,通过 USB 线将 NodeMCU V3 LoLin ESP8266 连接到计算机并选择其端口号,例如 COM5。如果您之前没有将它与 Arduino IDE 或其他编译器一起使用,您可能需要安装 它的驱动程序。



点击 运行 刷机,授权ESP8266为涂鸦产品。



第 4 步:将 ESP8266 与兼容 Android 和 iOS 的涂鸦智能应用程序配对
将ESP8266刷机并授权为涂鸦产品后,即可通过涂鸦智能APP轻松连接到涂鸦云进行数据收发。

产品(ESP8266)必须处于网络连接模式才能连接涂鸦智能APP。如以下步骤所述,我在设备上分配了一个按钮以在按下时部署网络连接模式。

首先,按下设备上的网络连接按钮,直到 RGB LED 闪烁绿色。



然后,打开 涂鸦智能应用 并登录。



添加设备?手动添加?其他的 ?其他(无线网络)










连接到 Wi-Fi 网络 (2.4 GHz)。






当涂鸦智能应用程序在网络上找到具有给定设置的产品时,它会添加该产品并自动将其连接到涂鸦云。










连接后,打开移动应用程序界面(面板)以监控和跟踪脉搏血氧仪传感器生成的数据。







Step 5: Arduino Nano 编程,通过 ESP8266(涂鸦设备)向涂鸦云发送数据

// 包含所需的库。
#include
#include
#include
#include
#include
#include "MAX30105.h"
#include "heartRate.h"

// 定义涂鸦设备:
SoftwareSerial conn ( 8 , 9 ) ; // RX, TX
TuyaWifi my_device (&conn) ;

// 定义涂鸦设备连接状态设置:
unsigned  char led_state = 0 ;
int wifi_key_pin = 7 ;


定义涂鸦设备(ESP8266)的数据点(DPs)。
输入涂鸦设备的PID(产品ID)和MCU软件版本。


// 定义涂鸦设备:
SoftwareSerial conn ( 8 , 9 ) ; // RX, TX
TuyaWifi my_device (&conn) ;

// 定义涂鸦设备连接状态设置:
unsigned  char led_state = 0 ;
int wifi_key_pin = 7 ;

// 定义涂鸦设备的数据点(DPs):
#define DPID_Blood_Oxygen_Data 101
#define DPID_Respiratory_Rate 102
#define DPID_Blood_Oxygen 103
#define DPID_Finger_In 104

// 存储所有 DP 及其类型。PS: array[][0]:dpid, dp type(TuyaDefs.h) : DP_TYPE_RAW, DP_TYPE_BOOL, DP_TYPE_VALUE, DP_TYPE_STRING, DP_TYPE_ENUM, DP_TYPE_BITMAP
unsigned  char dp_array[][ 2 ] =
{
{DPID_Blood_Oxygen_Data,DP_TYPE_RAW},
{DPID_Respiratory_Rate,DP_TYPE_VALUE},
{DPID_Blood_Oxygen,DP_TYPE_VALUE},
{DPID_Finger_In,DP_TYPE_BOOL},
};

// 定义涂鸦设备信息:
unsigned  char pid[] = { "Enter_PID" };
无符号 字符mcu_ver[] = { "3.1.4" };


定义 MAX3010x (MAX30102) 传感器及其设置:


MAX30105粒子传感器;

// MAX3010x 传感器设置:
const  byte RATE_SIZE = 4 ;
字节率[RATE_SIZE];
字节速率点 = 0 ;
长最后一拍 = 0 ;


定义 SSD1306 OLED 屏幕及其设置:


Adafruit_SSD1306显示(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


初始化联网密钥,设置涂鸦设备所需的功能。


pinMode(wifi_key_pin,INPUT_PULLUP);
//输入PID和MCU软件版本:
my_device.init(pid, mcu_ver);
// 传入所有 DP 及其类型数组,DP 编号:
my_device.set_dp_cmd_total(dp_array, 4 );
//注册DP下载处理回调函数:
my_device.dp_process_func_register(dp_process);
//注册上传所有DP回调函数:
my_device.dp_update_all_func_register(dp_update_all);
// 定义最后一次:
last_time = 毫秒();


初始化 MAX30102 传感器并使用默认设置对其进行配置。
初始化 SSD1306 OLED 屏幕。


//初始化MAX3010x传感器:
particleSensor.begin(Wire, I2C_SPEED_FAST);
// 使用默认设置配置传感器:
粒子传感器.setup();
粒子传感器.setPulseAmplitudeRed( 0x0A );

// 初始化 SSD1306 屏幕:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C );
显示.显示();
延迟(3000);


启动与涂鸦设备的串口通讯(软件串口)。
按下 Wi-Fi Key 引脚 (7) 时激活网络连接模式。
涂鸦设备尝试连接 Wi-Fi 网络时,RGB LED 呈绿色闪烁。
如果涂鸦设备(ESP8266)与云服务器(涂鸦云)连接成功,RGB LED 变为蓝色。


my_device.uart_service();
//按下WiFi Key Pin时激活网络连接模式。if (digitalRead(wifi_key_pin) == LOW) {
延迟(80);
if (digitalRead(wifi_key_pin) == LOW) {
my_device.mcu_set_wifi_mode(SMART_CONFIG);
}
}
//涂鸦设备尝试连接网络时,RGB LED 闪烁绿色:if ( ( my_device.mcu_get_wifi_work_state () != WIFI_LOW_POWER) && (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) {
if (millis()- last_time >= 500 ){
last_time = 毫秒();
//调整:if (led_state == LOW){ led_state = HIGH; 调整颜色(0,255,0 );_ }其他{ led_state = 低;调整颜色(0,0,0);_ }
}
}
//如果涂鸦设备(ESP8266)连接云服务器:if (my_device.mcu_get_wifi_work_state() == WIFI_CONN_CLOUD){调整颜色(
0,0,255 );_
}


从 MAX30102 传感器获取 IR 读数值。
如果脉搏血氧仪传感器检测到手指:
更新涂鸦设备的 Finger_In 数据点 - ON。
检查心跳并使用速率数组中存储的数据计算平均心跳 (BPM)。
在 SSD1306 屏幕上显示 BPM 值。
更新涂鸦设备的 Respiratory_Rate (BPM) 和 Blood_Oxygen(SpO2 或红光测量)数据点。


long irValue =particleSensor.getIR();
// 如果检测到手指: if(irValue > 10000){// 更新 Finger_In 数据点:if(finger_in == false){
my_device.mcu_dp_update(DPID_Finger_In, true , 1 );
手指输入 =真;
}
// 打印:
display.clearDisplay();
display.drawBitmap( 0 , 0 , 心率, 32 , 32 , SSD1306_WHITE);
显示.setTextSize( 1 );
display.setCursor( 50 , 0 );
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.println( "BPM:" );
显示.setTextSize( 3 );
display.setCursor( 80 , 10 );
display.setTextColor(SSD1306_WHITE);
display.println(beatAvg);
显示.显示();
// 如果检测到心跳:if (checkForBeat(irValue) == true){long delta = millis() - lastBeat;
lastBeat = 毫秒();
// 计算平均心跳:
beatsPerMinute = 60 / (delta / 1000.0 );
if (beatsPerMinute < 255 && beatsPerMinute > 20 ){
// 将最近的读数存储在rates数组中:
rates[rateSpot++] = ( byte )beatsPerMinute;
rateSpot %= RATE_SIZE;// 包装变量。// 取读数的平均值:
beatAvg = 0 ;
for (字节x = 0 ; x < RATE_SIZE ; x++)
beatAvg += 比率[x];
beatAvg /= RATE_SIZE;
}
// 更新 Respiratory_Rate 数据点:if(beatAvg > 0){
my_device.mcu_dp_update(DPID_Respiratory_Rate, beatAvg, 1 );
// 获取 SpO2 或红光测量值:
Spo2_or_Red_Light( 1 );
// 更新 Blood_Oxygen 数据点:
my_device.mcu_dp_update(DPID_Blood_Oxygen, _value, 1 );
}
}
}


在 Spo2_or_Red_Light 函数中,返回红光读数值或脉搏血氧仪传感器产生的 SpO2。
我使用红光测量值来更新 Blood_Oxygen 数据点,因为用于评估 SpO2 的代码与该项目的其他功能冲突。


void  Spo2_or_Red_Light ( int option) {
switch (option){
case  1 :
_value = map (particleSensor.getRed(), 0 , 130000 , 0 , 100 );
休息;
case  2 :
// 使用Examples中Example8_SPO2.ino文件中的示例代码。/* */break;default:
_value = 1 ;
休息;
}
}


如果脉搏血氧仪传感器未检测到手指:
更新涂鸦设备的 Finger_In 数据点 - OFF。
显示“放上你的食指!” 在 SSD1306 屏幕上。


//如果传感器上没有手指:
if  ( irValue < 10000 ) { if
( finger_in == true ){
my_device.mcu_dp_update(DPID_Finger_In,假,1);
手指输入 =假;
}
节拍平均值= 0 ;
display.clearDisplay();
display.drawBitmap( 0 , 0 , 触摸, 24 , 32 , SSD1306_WHITE);
显示.setTextSize( 1 );
display.setTextColor(SSD1306_WHITE);
display.setCursor( 40 , 0 );
display.println( "放置你的" );
display.setCursor( 40 , 15 );
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);
display.println( "索引" );
display.setCursor( 80 , 15 );
display.setTextColor(SSD1306_WHITE);
display.println( "手指!" );
显示.显示();
}


在 dp_update_all 函数中,使用默认值 - 20、20、false 更新所有数据点 (DP):


void  dp_update_all ( void ) {
// 使用默认值更新所有 DPs:// my_device.mcu_dp_update(DPID_Blood_Oxygen_Data, 0xff, 1);
my_device.mcu_dp_update(DPID_Respiratory_Rate, 20 , 1 );
my_device.mcu_dp_update(DPID_Blood_Oxygen, 20 , 1 );
my_device.mcu_dp_update(DPID_Finger_In,假,1);
}




















步骤 5.2:使用 SSD1306 OLED 屏幕显示图像
为了能够使用 SSD1306 OLED 屏幕显示图像,您需要先将单色位图转换为数据数组,然后再将它们添加到您的代码中。
首先,下载 液晶助手。
然后,上传单色位图并根据屏幕类型选择垂直或水平。
转换图像(位图)并保存输出(数据数组)。
最后,将数据数组添加到代码中并在屏幕上打印:

static  const  unsigned  char PROGMEM touch [] = {
0x00 , 0x00 , 0x00 , 0x00 , 0xF0 , 0x00 , 0x03 , 0x08 , 0x00 , 0x06 , 0x64 , 0x00 , 0x05 , 0x92 , 0x00 , 0x09 ,
0x0A , 0x00 , 0x0A , 0xEA , 0x00 , 0x0A , 0x9A ,0x00 , 0x08 , 0x9A , 0x00 , 0x04 , 0x92 , 0x00 , 0x06 , 0x94 ,
0x00 , 0x02 , 0x98 , 0x00 , 0x00 , 0x90 , 0x00 , 0x00 , 0x9C , 0x00 , 0x00 , 0x97 , 0x80 , 0x00 , 0x96 , 0xE0 ,
0x00 , 0x96, 0xD0 , 0x04 , 0x96 , 0x90 , 0x0E , 0x80 , 0x90 , 0x09 , 0x80 , 0x10 , 0x09 , 0x80 , 0x10 , 0x09 ,
0x80 , 0x10 , 0x04 , 0x80 , 0x10 , 0x04 , 0x00 , 0x10 , 0x04 , 0x00 , 0x10 , 0x02 ,0x00 , 0x10 , 0x02 , 0x00 ,
0x20 , 0x03 , 0x00 , 0x20 , 0x01 , 0x80 , 0x40 , 0x00 , 0xE1 , 0x80 , 0x00 , 0x3E , 0x00 , 0x00 0 , 0x00 ,
};

...

display.clearDisplay();
display.drawBitmap( 0 , 0 , 触摸, 24 , 32 , SSD1306_WHITE);











连接和调整



// 连接
// Arduino Nano :
// NodeMCU V3 LoLin ESP8266
// D8 --------------------------- TX
// D9 -- ------------------------- RX
// MAX30102 脉搏血氧仪和心率传感器
// A4 ------------ --------------- SDA
// A5 --------------------------- SCL
// SSD1306 OLED 128x64
// A4 --------------- SDA
// A5 -------------- ------------- SCL
// 5mm 共阳极 RGB LED
// D3 -------------- - R
// D5 --------------- G
// D6 -------------- ------------- 乙
// 网络连接按钮
// D7 --------------- S


完成焊接并上传代码后,我通过接头将所有剩余的组件连接到板上 - Arduino Nano、NodeMCU V3 LoLin ESP8266 和 SSD1306 OLED (128x64)。




该板支持两种不同的脉搏血氧仪传感器:

  • MAX30102
  • MAX30100

您可以焊接 MAX30100 而不是 MAX30102,如下所示:



模式和功能
如果按下网络连接按钮,设备将激活网络连接模式。然后,当 NodeMCU V3 LoLin ESP8266(涂鸦设备)尝试通过涂鸦智能应用连接到 Wi-Fi 网络时,RGB LED 闪烁绿色。



NodeMCU V3 LoLin ESP8266(涂鸦设备)通过涂鸦智能APP连接涂鸦云成功后,设备RGB LED灯为蓝色。



如果脉搏血氧仪传感器未检测到手指,设备会显示 “放上你的食指!” SSD1306 OLED屏幕上。然后,在 涂鸦云中将 Finger_In 数据点更新为 OFF。



否则,设备会在屏幕上显示 BPM 并更新涂鸦云中的数据点:

  • Finger_In:开
  • Respiratory_Rate:当前 BPM

对于 Blood_Oxygen 数据点,设备支持两个选项:

  • 血氧:SpO2
  • Blood_Oxygen:红光测量

注意:我使用红光测量值来更新 Blood_Oxygen 数据点,因为用于评估 SpO2 的代码与该项目的其他功能冲突。 但是,如果您想监控 SpO2 而不是红灯测量,您可以检查 Example8_SPO2.ino文件。










由于涂鸦云存储了一段时间的更新数据点,涂鸦智能应用程序允许用户使用小时图跟踪参数(BPM、SpO2 或红灯测量):










更多回帖

发帖
×
20
完善资料,
赚取积分