风筝
发表于: 2018-10-15 22:07:45 | 显示全部楼层

健康监测是当今世界的主要问题。由于缺乏适当的健康监测,患者患有严重的健康问题。现在有很多物联网设备可以通过互联网监控患者的健康状况。健康专家也在利用这些智能设备来关注他们的病人。凭借大量新的医疗保健技术初创企业,物联网正在迅速改变医疗保健行业。


在本篇文章中,我们将建立一个基于物联网的健康监测系统,记录患者的心跳率和体温,并在这些读数超过临界值时发送电子邮件/短信警报。脉搏率和体温读数记录在ThingSpeak和Google表格上,以便通过互联网从世界上任何地方监测患者的健康状况。还附加一个按键,以便患者可以在紧急情况下按下它以向他们的亲属发送电子邮件/短信。


所需的材料

●    Arduino Uno开发板

●    ESP8266 Wi-Fi模块

●    LM35温度传感器

●    脉搏传感器

●    按钮

●    10k电阻

●    连接导线

●    面包板


脉搏传感器

脉搏传感器(Pulse Sensor)是一款精心设计的即插即用的心率传感器,适用于Arduino。传感器夹在指尖或耳垂上,然后插入到Arduino。它还包括一个开源监控应用程序,可实时显示您的脉搏。


传感器的正面是一个心形徽标。这是与皮肤接触的一面。在正面你会看到一个小圆孔,这是LED从后面照射的地方,在LED下方还有一个小方形。它是一种环境光传感器,与手机、平板电脑和笔记本电脑中使用的传感器完全相同,可在不同光线条件下调节屏幕亮度。 LED将光照射到指尖或耳垂或其他毛细血管组织中,并且传感器读取反弹的光量。这就是计算心率的方法。传感器的另一侧是其他部件的安装位置。

Pulse-Rate-Sensor.jpg


在我们使用这种传感器之前,我们需要保护传感器的暴露面,以便我们能够获得准确的读数并避免因汗水而导致的短路。为此,您可以使用Velcro条带或黑色胶带。如图所示。

Patient-Heartbeat-Monitoring-using-Pulse-rate-Sensor.jpg

传感器有三根电线:信号(S)、Vcc(3 - 5 V)和GND。信号线连接到Arduino开发板的模拟引脚。


LM35温度传感器

LM35是一款模拟线性温度传感器。其输出与温度成正比(以摄氏度为单位)。工作温度范围为-55°C至150°C。响应每次°C上升或温度下降,输出电压变化10mV。它可以采用5V和3.3 V电源供电,待机电流小于60uA。

LM35.jpg


ESP8266-01

有很多数人将ESP8266称为WIFI模块,但它实际上是一个微控制器。 ESP8266是由Espressif Systems开发的微控制器的名称,Espressif Systems是一家位于上海的公司。该微控制器可以执行WIFI相关活动的能力,因此被广泛用作WIFI模块。

ESP8266-wifi-module.jpg


有两种方法可以使用ESP8266模块。本教程将帮助您开始使用ESP8266。一种方法是使用AT命令。另一种方法是使用Arduino IDE。这里我们将使用AT命令将数据从Arduino发送到ESP。


电路原理图

Circuit-Diagram-for-IoT-based-Patient-Monitoring-System-using-ESP8266-and-Arduino.png


以下是详细的连接:

●    脉搏传感器的信号引脚 - > arduino的A0

●    脉搏传感器的Vcc引脚 - > arduino的5V

●    脉搏传感器的GND引脚 - > arduino的GND

●    LM35的Vout - > Arduino的A1

●    ESP8266的Tx - > arduino的10号引脚

●    ESP8266的Rx - > arduino的11号引脚

●    ESP8266的CH_PD和Vcc - > arduino的3.3 V

●    ESP8266的GND - > arduino的GND

●    按钮 - > arduino的数字引脚8

跳转到指定楼层
风筝
发表于: 2018-10-16 15:15:42 | 显示全部楼层

配置ThingSpeak在线记录患者数据

ThingSpeak为基于物联网的项目提供了非常好的工具。通过使用ThingSpeak网站,我们可以使用ThingSpeak提供的频道Channels和网页监控我们的数据,以及通过互联网控制我们的系统。 ThingSpeak'收集(Collect)'来自传感器的数据,'分析和可视化(Analyze and Visualize)'数据和通过触发一条反应'执行(Acts)'。本文中,我们简要说明如何使用ThingSpeak实现物联网患者监测项目。


我们将使用ThingSpeak通过互联网在线监测患者的心跳和体温。我们还将使用IFTTT平台将ThingSpeak连接到电子邮件/消息服务,以便在患者处于危急状态时发送警报消息。


第1步: - 首先,用户需要在ThingSpeak.com上创建一个帐户,然后登录并单击“Get Started”。

thingspeak.png

第2步: - 现在转到“频道”菜单,然后单击同一页面上的“New Channel”选项。

Temperature-Humidity-Monitoring-ThingSpeak-channel.png


第3步: - 现在您将看到一个用于创建频道的表单,根据您的选择填写名称和说明。然后在Field 1、Field 2和Field 3标签中填写'Pulse Rate'、'Temperature'和'Panic',勾选Fields的复选框。同时勾选表格中“Make Public”选项的复选框,最后保存频道。现在您的新频道已创建。

Parameter-for-Patient-Monitoring.png


第4步: - 您将看到如下所示的三个图表。注意Write API key,我们将在代码中使用此密钥。

Parameters-Graph-on-Thingspeak-for-Patient-Monitoring.png


第5步: - 现在,我们将使用服务器的ThingHTTP应用程序来触发IFTTT小程序,以便将数据输入到Google表格以及发送电子邮件/短信。 ThingHTTP支持设备、网站和Web服务之间的通信,而无需在设备级别实现协议。您可以在ThingHTTP中指定要使用其他ThingSpeak应用程序(如React)触发的操作。


要制作New ThingHTTP,我们将需要用于触发的URL,我们将从IFTTT获得。

Creating-new-ThingHTTP.png


配置IFTTT以根据ThingSpeak值触发邮件/ SMS

第1步: - 登录IFTTT并搜索Webhooks,然后单击它。

Search-for-Webhooks-in-IFTTT.png


第2步: - 单击Documentation。

Webhooks.png

第3步: - 在事件框中键入“Patient_Info”并复制URL。我们将在ThingHTTP中使用此URL。

Webhooks-Documentation.jpg


现在让我们让Applet将ThingHTTP链接到Google表格并发送电子邮件/短信。之后我们将跳转到完成我们的ThingHTTP。


第4步: - 单击My Applete中的New Applete选项。

Making-Applet-to-link-ThingHTTP.jpg


第5步: - 单击“+ this”并搜索Webhooks,然后单击它。选择触发器作为“接收Web请求”。

Choose-Trigger-as-Receive-a-web-request.jpg


第6步: - 在webhooks URL的事件框中键入与您编写的事件名称相同的事件名称。单击“Create Trigger”。

Complete-Trigger-Fields.jpg


第7步: - 点击“+ that”并搜索Google表格并点击它。

单击“Add row to spreadsheet.”。

Create-Spreadsheet.jpg


第8步: - 为您的工作表提供任何名称。在格式化的行框中,您将显示日期和时间、事件名称、BPM值和体温,如下所示

Add-row-to-spreadsheet.jpg


第9步: - 检查您的小程序,然后单击“完成”。

Review-your-applet-and-click-on-finish.jpg


同样,我们必须制作applet,以便在发生Panic事件时发送电子邮件。

所以再次点击“+ this”并选择Webhooks,然后在事件名称中输入“Panic”。在“+ that”中搜索Gmail并单击它。

现在,单击发送电子邮件。

Setting-up-mailing-option.jpg

当患者发生Panic时,键入您希望接收电子邮件的电子邮件地址。

Enter-Email-address-for-Patient-data.jpg


在电子邮件中键入要发送的正文内容,然后单击“创建操作”。检查并完成。

Enter-default-text-for-mail.jpg


我们已经让我们的applet执行任务。现在,回到Thingspeak-> Apps-> ThingHTTP


用于连接ThingSpeak和IFTTT的ThingHTTP

第1步: - 点击New ThingHTTP。命名,然后粘贴您从webhooks文档中复制的URL。填写剩下的信息,如下所示。

Enter-URL-for-New-ThingHTTp.jpg


在Body中,我们必须编写我们想要发送到IFTTT applet的信息。我们发送患者脉搏读数和温度。所以格式是

  1. { "value1" : "%%channel_channelID_field_fieldNumber%%","value2" : "%%channel_channelID_field_fieldNumber%%"}
复制代码

Enter-Body-text-and-Save-ThingHTTP.png

填写完这些信息后,单击Save ThingHTTP。


以同样的方式,我们必须使ThingHTTP成为“Panic”。按照相同的步骤。

在URL中,写下Panic来代替Patient_Info。正文保持空白,所有其他信息与之前的ThingHTTP相同。保存。

现在,我们必须让React触发URL。


React与ThingHTTP应用程序一起使用,以在通道数据满足特定条件时执行操作。

要制作React,请单击Apps - > React。单击New React。


第2步: - 给你的React命名。条件类型为数字和测试频率与数据插入相同。

选择要触发URL的条件。从If Channel下拉菜单中选择您的频道。选择字段1即脉冲率并使条件大于任何值。我填写的是60。如图所示:

Triggering-Condition-for-monitoring-Patient-Parameter.jpg


从Action下拉菜单中选择ThingHTTP,然后选择ThingHTTP。

选择“每次满足条件时运行操作”,然后单击“保存反应”。

Set-running-Condition-for-Patient-Monitor.png


以同样的方式,如图所示为Panic制作React。

Enter-Condition-for-Panic-action.png


选择“每次满足条件时运行操作”,然后单击“保存反应”。


我们已经完成了基于Web的工作。现在,我们将介绍基于Arduino的代码。

回复

使用道具 举报

风筝
发表于: 2018-10-16 16:03:43 | 显示全部楼层

Arduino代码

在本文的末尾处给出了完整的Arduino代码,这里我们只介绍一些重要部分。我们将使用脉博传感器库,可以从此链接下载。此外,我们使用计时器来设置间隔以获取读数。为此,我们需要Timer库,可以从此链接下载。


让我们开始介绍代码部分......

首先,我们需要包括所有使用的库。我们使用串口与esp8266进行通信。

  1. #include <SoftwareSerial.h>
  2. #include "Timer.h"
  3. #include <PulseSensorPlayground.h>     //pulse sensor library
复制代码

在我们的代码中使用定时器、SoftwareSerial和脉博传感器的实例。

  1. Timer t;
  2. PulseSensorPlayground pulseSensor;
  3. SoftwareSerial esp8266(10,11);   //Rx,Tx
复制代码

设置低级中断以实现最准确的BPM匹配,并使DEBUG能够在串行监视器上显示正在进行的命令。

  1. #define USE_ARDUINO_INTERRUPTS true           
  2. #define DEBUG true
复制代码

设置您的WiFi名称、密码和thingspeak.com的IP

  1. #define SSID "*********"      // "your WiFiname"
  2. #define PASS "**********"   // "wifi password"
  3. #define IP "184.106.153.149"      // thingspeak.com ip
复制代码

声明String以更新ThingSpeak通道的信息。您将需要API密钥,可以从ThingSpeak channel - > API密钥中找到。复制Write API密钥并粘贴到此处。

  1. String msg = "GET /update?key=Your Api Key";
复制代码

setup函数中,设置Arduino串行监视器和esp8266之间串行通信的波特率。通过给AT命令启动ESP通信并通过调用connectWiFi()函数连接。之后我们将通过调用t.every(time_interval,do_this)来初始化Timers;在您定义的每个time_interval之后,它将获取传感器的读数并在通道上更新。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   esp8266.begin(115200);
  5.     pulseSensor.analogInput(PulseWire);   
  6.   pulseSensor.blinkOnPulse(LED13);       //auto-magically blink Arduino's LED with heartbeat.
  7.   pulseSensor.setThreshold(Threshold);   

  8.   // Double-check the "pulseSensor" object was created and "began" seeing a signal.
  9.    if (pulseSensor.begin()) {
  10.     Serial.println("We created a pulseSensor Object !");  
  11.   }
  12.   Serial.println("AT");
  13.   esp8266.println("AT");
  14.   delay(3000);

  15.   if(esp8266.find("OK"))
  16.   {
  17.     connectWiFi();
  18.   }
  19.   t.every(10000, getReadings);
  20.    t.every(10000, updateInfo);
  21. }
复制代码

我们需要编写connectWiFi()、panic_button()、update_info()getReadings()函数。

connectWiFi()函数根据连接的Wi-Fi,它将返回True或False。 AT + CWMODE = 1将使ESP8266在站模式下工作。 AT + CWJAP = \,此功能中使用的命令是连接到您的接入点(您的Wi-Fi路由器)。

  1. boolean connectWiFi()
  2. {
  3.   Serial.println("AT+CWMODE=1");
  4.   esp8266.println("AT+CWMODE=1");
  5.   delay(2000);
  6.   String cmd="AT+CWJAP="";
  7.   cmd+=SSID;
  8.   cmd+="","";
  9.   cmd+=PASS;
  10.   cmd+=""";
  11.   Serial.println(cmd);
  12.   esp8266.println(cmd);
  13. ……
  14. …..
复制代码

getReadings()函数用于获取脉搏传感器和LM35读数并使用dtostrf()函数将它们转换为字符串。

  1. void getReadings(){
  2.    raw_myTemp = analogRead(A1);
  3.   Voltage = (raw_myTemp / 1023.0) * 5000;         // 5000 to get millivots.
  4.   tempC = Voltage * 0.1;                //in degree C
  5.   myTemp = (tempC * 1.8) + 32;             // conver to F
  6.   Serial.println(myTemp);
  7.   int myBPM = pulseSensor.getBeatsPerMinute();  // Calls function on our pulseSensor object that returns BPM as an "int".
  8. if (pulseSensor.sawStartOfBeat()) {            // Constantly test to see if "a beat happened".
  9. Serial.println(myBPM);                        // Print the value inside of myBPM.
  10. }
  11. delay(20);
复制代码

为BPM和temp定义char数组,并使用dtostrf()将这些传感器的浮点值转换为String。

  1.      char buffer1[10];
  2.      char buffer2[10];
  3.     BPM = dtostrf(myBPM, 4, 1, buffer1);
  4.     temp = dtostrf(myTemp, 4, 1, buffer2);
  5.   }
复制代码

编写函数,在ThingSpeak通道上更新传感器信息。

“AT + CIPSTART = \”TCP \“,\”“,AT命令将通过端口80建立TCP命令

  1. void updateInfo()
  2. {
  3.   String cmd = "AT+CIPSTART="TCP","";
  4.   cmd += IP;
  5.   cmd += "",80";
  6.   Serial.println(cmd);
  7.   esp8266.println(cmd);
  8.   delay(2000);
  9.   if(esp8266.find("Error"))
  10.   {
  11.     return;
  12.   }
复制代码

使用“&field1 =”附上带有GET URL的读数; 用于脉冲读数和“&field2 =”; 用于温度读数。 使用“AT + CIPSEND =”命令发送此信息。

  1.   cmd = msg ;
  2.   cmd += "&field1=";    //field 1 for BPM
  3.   cmd += BPM;
  4.   cmd += "&field2=";  //field 2 for temperature
  5.   cmd += temp;
  6.   cmd += "\r\n";
  7.   Serial.print("AT+CIPSEND=");
  8.   esp8266.print("AT+CIPSEND=");
  9.   Serial.println(cmd.length());
  10.   esp8266.println(cmd.length());
  11.   if(esp8266.find(">"))
  12.   {
  13.     Serial.print(cmd);
  14.     esp8266.print(cmd);
  15.   }

复制代码

同样,为panic_button创建函数。 当按钮变为高电平时,esp8266使用AT + CIPSTART和AT + CIPSEND命令将信息发送到服务器。

  1. void panic_button(){
  2.   panic = digitalRead(8);
  3.     if(panic == HIGH){
  4.     Serial.println(panic);
  5.       String cmd = "AT+CIPSTART="TCP","";
  6.   cmd += IP;
  7.   cmd += "",80";
  8.   Serial.println(cmd);
  9.   esp8266.println(cmd);
  10. …..
复制代码

将此信息附加到“&field3 =”。

  1.   cmd = msg ;
  2.   cmd += "&field3=";   
复制代码

在loop函数中,使用t.update()函数调用panic_button()和计时器。

  1. void loop()
  2. {
  3.   panic_button();
  4.   start: //label
  5.     error=0;
  6.     t.update();            
  7. ……
  8. ……
复制代码

实际运行的患者监护系统

现在,根据电路图连接硬件组件并将代码上传到Arduino。 打开串行监视器以查看代码内部的内容。

IoT-based-Patient-Monitoring-System-using-ESP8266-and-Arduino.jpg

在您在计时器设置中定义的时间间隔之后,您将看到Google网盘上的Google表格中定义的数据已更新。

Getting-Patient-Info-on-Spredsheet.jpg


按下紧急按钮4-5秒,您将收到患者出现状况的电子邮件,如下所示:

Email-received-when-Patient-is-in-Panic.jpg


代码

本文使用的完整代码如下所示: main.rar (1.65 KB, 下载次数: 75)


回复

使用道具 举报

大大大佬啊
发表于: 2018-11-18 15:21:22 | 显示全部楼层

前辈,按照您的做法一步一步来的。库文件我都放里面了,可是烧写程序出错了,

Arduino:1.8.7 (Windows 10), 开发板:"Arduino/Genuino Uno"

C:\Users\LAZYBO~1\AppData\Local\Temp\ccrQ71Yu.ltrans0.ltrans.o: In function `begin':

E:\安装软件\软件\Arduino\libraries\PulseSensorPlayground-master\src/PulseSensorPlayground.cpp:55: undefined reference to `PulseSensorPlayground::UsingInterrupts'

E:\安装软件\软件\Arduino\libraries\PulseSensorPlayground-master\src/PulseSensorPlayground.cpp:56: undefined reference to `PulseSensorPlaygroundSetupInterrupt()'

collect2.exe: error: ld returned 1 exit status

exit status 1
为开发板 Arduino/Genuino Uno 编译时出错。
回复

使用道具 举报

大大大佬啊
发表于: 2018-11-18 15:22:34 | 显示全部楼层

好像是库文件src 文件里未定义PulseSensorPlaygroundSetupInterrupt()'
回复

使用道具 举报

风筝
发表于: 2018-11-20 15:04:46 | 显示全部楼层

大大大佬啊 发表于 2018-11-18 15:22
好像是库文件src 文件里未定义PulseSensorPlaygroundSetupInterrupt()'

非常感谢您的回复。

已经重新上传了代码附件。

问题主要是由于#define宏定义应该位于include语句的前面。
回复

使用道具 举报

shiphook
发表于: 2019-3-30 18:06:06 | 显示全部楼层

楼主您好,请关于esp8266系统配置是怎么做的,在这个实例中貌似没有看到?
回复

使用道具 举报

azi1974
发表于: 2019-5-12 02:28:01 | 显示全部楼层

这个很有学习的必要
回复

使用道具 举报

wax
发表于: 2019-11-26 15:22:15 | 显示全部楼层

我想请问一下,thingspeak已经注册好账户了,为什么登陆的时候输入email后点击next没有反应?求解决方案
回复

使用道具 举报

mzbljm
发表于: 2019-12-18 16:11:12 | 显示全部楼层

wax 发表于 2019-11-26 15:22
我想请问一下,thingspeak已经注册好账户了,为什么登陆的时候输入email后点击next没有反应?求解决方案 ...

我也是这样,很苦恼
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 16:49 , Processed in 0.062792 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表