kakekumamonのアイコン画像
kakekumamon 2021年02月28日作成 (2021年02月28日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 1671
kakekumamon 2021年02月28日作成 (2021年02月28日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 1671

ESP32と心拍センサーで心停止時に通知

目次

  1. システム概要
  2. ハードウェア構成
  3. プログラムの挙動
  4. 考察
  5. 感想

システム概要

システム概要図
上記の図のようなシステムを作成していく。心拍センサを一定時間測れなかった場合にWebhookのキーにアクセスすることでIFTTTを経由しSlackに通知することができる。

ハードウェア

今回のシステムを作成する際に扱った部品は以下のようになる。

  • Arduino用Pulse Sensor
  • ESP32
    回路(図1)は複雑ではなく,Pulse Sensorの信号線をESP32の32番ピンに接続し,駆動用に3.3Vを接続,GNDを接続するといった構成になっている。
    図1

紫色のジャンパ線 -- 信号線
赤色のジャンパ線 -- 駆動用3.3V
黒色のジャンパ線 -- GND

Pulse Sensorについて

  • 概要
    つけた場所に流れる血液の量を読み取るセンサ。今回のシステムではPulse Sensor用のライブラリを使って,BPM(心拍数)を測れるようにした。
  • 仕組み
    血液中のヘモグロビン(赤色の成分)が緑色の光を吸収する性質を使うことにより,Pulse Sensorから緑色の光を生体に当て,反射してくる光から血液の量を求めることができる。つまり,帰ってくる緑色の光が少ないほど血液の量が多い。心拍数を測るにあたって,血液の量が多いタイミングで心動したということにした。

ソフトウェア

プログラムの流れとしては,システム概要図に示したとおりだが,以下では文字でプログラムの流れを示す。

  1. ESP32をWiFiに接続する
  2. 心拍センサで心拍数を測り,シリアルモニタに表示
  3. 心拍センサで心拍数が測れなくなった数秒後にWebhookのキーにアクセスする(アクセスできなかった場合はこの作業を繰り返す)
  4. アクセスしたキーが指定したイベントをIFTTTが実行
  5. Slackにイベントが指定した定型文を通知

作成したプログラムを以下に示す。

BPMstop.ino

#include <WiFi.h> #include <WiFiClientSecure.h> #include <Ticker.h> #define USE_ARDUINO_INTERRUPTS true #include <PulseSensorPlayground.h> PulseSensorPlayground pulseSensor; int stoptime; int Threshold = 550; const int inPin = 32; int count = 0; // wifi 設定 const char* ssid = "SSID"; const char* password = "WiFi-PASS"; // ifttt 設定 const char* host = "maker.ifttt.com"; const int httpsPort = 443; bool isStopNortification = false; // 心拍数を測り,心拍が止まったら slack に通知する void checkMYBPMAndNortify() { while(count < 5){ int myBPM = pulseSensor.getBeatsPerMinute(); count = count + 1; if(pulseSensor.sawStartOfBeat()){ Serial.println("♥ A HeartBeat Happened ! "); Serial.print("BPM: "); Serial.println(myBPM); count = 0; } delay(1000); } // 1 秒待機 delay(1000); // isStopNortification が true でない場合 if(!(isStopNortification)){ WiFiClientSecure client; Serial.print("connecting to "); Serial.println(host); if (!client.connect(host, httpsPort)) { Serial.println("connection failed"); return; } // IFTTT のトリガーを設定 String url = "トリガーのURL"; Serial.print("requesting URL: "); Serial.println(url); client.print(String("GET ") + url + " HTTP/1.1¥r¥n" + "Host: " + host + "¥r¥n" + "User-Agent: BuildFailureDetectorESP32¥r¥n" + "Connection: close¥r¥n¥r¥n"); Serial.println("request sent"); while (client.connected()) { String line = client.readStringUntil('¥n'); if(line == "¥r") { Serial.println("headers received"); } } String line = client.readStringUntil('¥n'); Serial.println("reply was:"); Serial.println("=========="); Serial.println(line); Serial.println("=========="); Serial.println("closing connection"); isStopNortification = true; } } // セットアップ void setup() { Serial.begin(115200); pulseSensor.analogInput(inPin); pulseSensor.setThreshold(Threshold); Serial.print("connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); if (pulseSensor.begin()) { Serial.println("We created a pulseSensor Object !"); } } void loop() { checkMYBPMAndNortify(); // 通知が複数回行かないようにする処理 if (isStopNortification) { Serial.println("Nortification: stop"); for(stoptime = 0; stoptime <= 10; stoptime++){ // delay(3600); } count = 0; isStopNortification = false; } else { Serial.println("Nortification: continue"); } }

動作すると以下のようにSlackに通知が来る。
キャプションを入力できます

感想

今回構築したシステムは,心拍数を測り,心拍が止まったらSlackに通知するというものだった。この機能以外にもAmbient(https://ambidata.io/)と呼ばれるサービスを使って心拍数の推移をプロットしていきグラフを作ったりなどすることによって,より便利なものを作れると思った。

ログインしてコメントを投稿する