- MAX30100センサー
- 必要なコンポーネント
- MAX30100オキシメータとESP32のインターフェース
- 心拍数モニタリング用のESP32を備えたAdafruitIO
- コードの説明
- IoTベースのパルスオキシメータのデモンストレーション
パルスオキシメトリは広く使用されている医療測定機器であり、血液中の酸素飽和度を測定する非侵襲的で痛みのない検査であり、酸素の小さな変化を簡単に検出できます。現在のCovid-19の状況では、複数の患者の酸素レベルを、患者と接触することなくリモートで同時に追跡することが重要になっています。
そのため、このプロジェクトでは、MAX30100パルスオキシメータとESP32を使用してパルスオキシメータを構築します。このパルスオキシメータは、血中酸素濃度を追跡し、Wi-Fiネットワークに接続してインターネット経由でデータを送信します。このように、患者との社会的距離を維持することにより、複数の患者をリモートで監視できます。得られたデータは、患者の状態の追跡と分析を容易にするグラフとして表示されます。以前は、脈拍センサーを使用して他の心拍数モニターも作成しました。また、他のCovid-19関連プロジェクトに興味がある場合は、人体温度計、発熱監視用のスマートIR温度計、および以前に構築した壁取り付け温度スキャナーを確認できます。
Covid-19アプリケーションの他に、このプロジェクトは慢性閉塞性肺疾患(COPD)、喘息、肺炎、肺がん、貧血、心臓発作、心不全、または先天性心疾患にも広く使用できます。
このプロジェクトで使用されているセンサーは医学的に評価されておらず、プロジェクトはフェイルプルーフアプリケーション用にテストされていないことに注意してください。常に医学的に評価されたパルスオキシメータを使用して、患者の脈拍と酸素レベルを決定し、開業医と話し合ってください。ここで説明するプロジェクトは、教育目的のみです。
MAX30100センサー
MAX30100センサーは、パルスオキシメトリと心拍数モニターモジュールが統合されています。I2Cデータラインと通信し、SpO2およびパルス情報をホストマイクロコントローラユニットに提供します。光検出器、赤、緑のIRLEDがLEDパルスを変調する光学素子を使用しています。LED電流は0から50mAまで設定可能です。下の画像はMAX30100センサーを示しています。
上記のセンサーモジュールは、1.8Vから5.5Vの範囲で動作します。I2Cピン用のプルアップ抵抗はモジュールに含まれています。
必要なコンポーネント
- WiFi接続
- ESP32
- MAX30100センサー
- Adafruit IOユーザーIDとカスタム作成されたダッシュボード(さらに詳しく説明します)
- 定格電流1A以上の5V適切な電源ユニット
- USBケーブルマイクロUSB-USBA
- ESP32プログラミング環境を備えたArduinoIDEを搭載したPC。
MAX30100オキシメータとESP32のインターフェース
ESP32を搭載したMAX30100の完全な回路図を以下に示します。
これは非常に単純な回路図です。ESP32 devkit Cのピン21および22は、SDAピンおよびSCLピンを備えたパルスオキシメータセンサーMAX30100に接続されています。オキシメータは、ESP32開発ボードの5Vピンからも電力を供給されます。ブレッドボードと接続ワイヤーを使用して接続しました。テストのセットアップは次のようになります-
心拍数モニタリング用のESP32を備えたAdafruitIO
これまで、さまざまなIoTアプリケーション向けに多くのAdafruitIOプロジェクトを構築してきました。Adafruit IOは、カスタムダッシュボードを作成できる優れたプラットフォームです。IoTベースのパルスオキシメータセンサーのカスタムダッシュボードを作成するには、以下の手順を使用します-
ステップ1:最初に、拳の名前、姓、電子メールアドレス、ユーザー名、およびパスワードを入力した後、adafruitIOにサインアップします。
ステップ2:サインインプロセスが完了すると、空白のダッシュボードウィンドウが開きます。このセグメントでは、さまざまな方法でデータを表示するダッシュボードを作成する必要があります。したがって、新しいダッシュボードを作成し、ダッシュボードの名前と説明を提供するときが来ました。
ステップ3:上記のフォームに記入したら、センサーのグラフと制御セクションを作成します。
スイッチブロックを選択します。パルスオキシメータセンサーのON / OFFに必要です。
ステップ4:ブロック名を書き留めます。上の画像でわかるように、トグル機能はオンとオフの2つの状態を提供します。同じプロセスで、グラフブロックを選択します。
ハートビットとSpO2の2つのグラフが表示されるため、このグラフセクションを2回選択する必要があります。両方のセクションが作成されます。ご覧のとおり、すべての入力機能と出力機能を選択しました。
ステップ5:次の最後のステップは、adafruitキーを用意することです。ご覧のとおり、adafruitキーを取得しており、これをコードに追加する必要があります。
これで、AdafruitIOが構成されました。ハードウェアを準備し、このプロジェクトのファームウェアを作成する時が来ました。
コードの説明
このコードは多くのライブラリを使用しており、すべてが重要です。ライブラリは、MAX30100パルスオキシメーターセンサーライブラリ、ある Wire.h 、I2C用 WiFi.h ESP32、内無線LAN関連のサポートのために Adafruit MQTT 、および MQTTクライアント ライブラリ。完全なプログラムは、このページの下部にあります。
上記のライブラリは、コードの先頭に含まれています。
#include
次の2つの定義は、WLANSSIDとWLANパスワードです。これは正確である必要があり、WiFiネットワークに接続するためにESP32によって使用されます。
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
次に、Adafruitioの定義を定義しました。
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
更新レートは5秒ごとにデータを更新し、サーバーは io.adafruit.com で、サーバーポートは1883になります。ユーザー名とパスワードは、adafruitIOダッシュボードから生成されたユーザー名とパスワードになります。これはすべてで異なり、adafruitのセットアップセクションで説明されているように生成する必要があります。
I2Cポートは、回路図に示すように後で定義されます。
#define I2C_SDA 21 #define I2C_SCL 22
次に、3つの変数を使用して、最後のレポートとbpmおよびspo2値を保存します。
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTTは、pub-subモデル(パブリッシュおよびサブスクライブ)で動作します。この作業モデルでは、Adafruitサーバーにデータを送信するデバイスは、AdafruitIOサーバーが同じデータポイントにサブスクライブする公開モードのままになります。このような効果では、デバイスが新しいデータを公開するたびに、サーバーはサブスクライブされているため、データを受信して必要なアクションを提供します。
サーバーがデータを公開し、デバイスがデータをサブスクライブするときにも同じことが起こります。このアプリケーションでは、デバイスはSPO2とBPMのデータをサーバーに送信するため、同じものを公開し、サーバーからON-OFF状態を受信して、これをサブスクライブします。これは、以下で説明するコードスニペットで構成されています-
WiFiClientクライアント; Adafruit_MQTT_Client mqtt(&client、AIO_SERVER、AIO_SERVERPORT、AIO_USERNAME、AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe(&mqtt、AIO_USERNAME "/ feeds / switch"); // AIOのMQTTパスが次の形式に従っていることに注意してください。
では 、セットアップ 機能、我々は、I2Cを開始する事前定義SSIDとパスワードで無線LANを接続し、スイッチ状態(Adafruit IOダッシュボードで作成されたスイッチボタン)のためのMQTTサブスクリプションプロセスを開始しています。
void setup(){Serial.begin(115200); Wire.begin(I2C_SDA、I2C_SCL); WiFi.begin(WLAN_SSID、WLAN_PASS); while(WiFi.status()!= WL_CONNECTED){delay(500); Serial.print( "。"); } Serial.println(); Serial.println( "WiFi接続"); Serial.println( "IPアドレス:"); Serial.println(WiFi.localIP()); mqtt.subscribe(&sw_sub); Serial.print( "パルスオキシメータの初期化.."); // PulseOximeterインスタンスを初期化します//失敗は通常、不適切なI2C配線、電源の欠落、または//ターゲットチップの誤りが原因ですif(!pox.begin()){Serial.println( "FAILED");にとって(;;); } else {Serial.println( "SUCCESS"); } // IR LEDのデフォルト電流は50mAであり、//次の行のコメントを外すことで変更できます。 //利用可能なすべてのオプションについては、MAX30100_Registers.hを確認してください。ポックス。setIRLedCurrent(MAX30100_LED_CURR_7_6MA); //ビート検出のコールバックを登録しますpox.setOnBeatDetectedCallback(onBeatDetected); stopReadPOX(); }
このすべての後、max30100はLED電流設定で開始されます。さまざまな構成のMAX30100ヘッダーファイルで、さまざまな現在の設定も利用できます。心拍検出コールバック機能も開始します。これらのセットアップがすべて完了すると、酸素濃度計センサーが停止します。
では ループ 機能、MQTT接続が開始され、サブスクリプションモデルがチェックインされたすべての5000ミリ秒。この状況で、スイッチをオンにすると、酸素濃度計センサーの読み取りが開始され、心拍数とSPO2値のデータが公開されます。スイッチをオフにすると、パルスオキシメータセンサーに関連するすべてのタスクが一時停止されます。
void loop(){MQTT_connect(); Adafruit_MQTT_Subscribe *サブスクリプション; while((subscription = mqtt.readSubscription(5000))){if(subscription ==&sw_sub){Serial.print(F( "Got:")); Serial.println((char *)sw_sub.lastread); if(!strcmp((char *)sw_sub.lastread、 "ON")){Serial.print(( "Starting POX…")); startReadPOX(); BaseType_t xReturned; if(poxReadTaskHld == NULL){xReturned = xTaskCreate(poxReadTask、/ *タスクを実装する関数。* / "pox_read"、/ *タスクのテキスト名。* / 1024 * 3、/ *スタックサイズ(単語ではなく)バイト。* / NULL、/ *タスクに渡されるパラメーター。* / 2、/ *タスクが作成される優先度。* /&poxReadTaskHld); / *作成されたタスクのハンドルを渡すために使用されます。 * /} delay(100); if(mqttPubTaskHld == NULL){xReturned = xTaskCreate(mqttPubTask、/ *タスクを実装する関数。 * / "mqttPub"、/ *タスクのテキスト名。 * / 1024 * 3、/ *スタックサイズ(バイトではなくワード)。 * / NULL、/ *パラメータがタスクに渡されました。 * / 2、/ *タスクが作成される優先度。 * /&mqttPubTaskHld); / *作成されたタスクのハンドルを渡すために使用されます。 * /}} else {Serial.print(( "Stopping POX…")); // POX読み取りタスクをデテレif(poxReadTaskHld!= NULL)vTaskDelete(poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Taskを削除しますif(mqttPubTaskHld!= NULL){vTaskDelete(mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX(); }}}}/ *作成されたタスクのハンドルを渡すために使用されます。 * /}} else {Serial.print(( "Stopping POX…")); // POX読み取りタスクをデテレif(poxReadTaskHld!= NULL)vTaskDelete(poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Taskを削除しますif(mqttPubTaskHld!= NULL){vTaskDelete(mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX(); }}}}/ *作成されたタスクのハンドルを渡すために使用されます。 * /}} else {Serial.print(( "Stopping POX…")); // POX読み取りタスクをデテレif(poxReadTaskHld!= NULL)vTaskDelete(poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Taskを削除しますif(mqttPubTaskHld!= NULL){vTaskDelete(mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX(); }}}}
IoTベースのパルスオキシメータのデモンストレーション
ブレッドボードに回路が正しく接続され、以下のプログラムがESP32にアップロードされます。コード内でWi-FiとAdafruitの認証情報を適宜変更して、機能するようにしてください。
WiFiおよびAdafruitIOサーバーとの接続後、期待どおりに機能し始めました。
ご覧のとおり、SPO2レベルは96%を示しており、心拍数は1分あたり78〜81ビットを示しています。また、データがキャプチャされる時間を提供します。
上の画像でわかるように、スイッチはオフになっており、データは0です。プロジェクトの完全な作業ビデオもこのページの下部にあります。
記事を楽しんで、何か役立つことを学んだことを願っています。質問がある場合は、下のコメントセクションに残すか、フォーラムに投稿してください。