パルスオキシメーターで心拍数をモニタリングするための Arduino ライブラリ

パルスオキシメーターで心拍数をモニタリングするための Arduino ライブラリ

パルスオキシメーターで心拍数をモニタリングするための Arduino ライブラリ

私の睡眠管理プロジェクトで監視されているパラメータの XNUMX つ

それは脈拍です。それを測定する 異なる波長の光に対するヘモグロビンとオキシヘモグロビンの挙動に基づいたデバイスを開発しました。基本的には、特定の種類の光が体の十分に灌漑された領域をどれだけ通過または反射できるかを測定することです。この現象の完全なサイクルが発生する頻度により、 脈拍.

目次

    の設計およびテスト段階では、 脈拍測定装置 アセンブリが正しいことを確認するために、いくつかの小さなプログラムを開発しました。まず、時々(少なくとも毎回)測定値を取得する以下のコードを書きました。 MAXIMUM_MEASUREMENT_TIME そしてせいぜいそれぞれ MINIMUM_MEASUREMENT_TIME) ある値とその前の値 (に対応する値) の間で最小値が変化したとき。 MINIMUM_SIZE) そしてその Python アプリケーションを使用してコンピュータから監視 後で分析できるようにするためです。

    値が調整されると(非常に密な測定から始めて)、次から値のコレクションを取得しました。 パルス酸素濃度計 時間が経つにつれて、スプレッドシートを使用してグラフを作成できるようになりました。 LibreOffice Calc de LibreOfficeの、 特定の。

    パルスオキシメーター測定値のグラフ

    上の画像に示されているように、収集されたデータを使用して、次の操作は、値の密度により、信頼性がありながら「経済的な」方法 (必要以上のデータをサンプリングしない) で値を計算できるかどうかを判断することでした。 脈拍;以下のグラフからわかるように、講じられた対策により、期待に値する結果が得られたようです。

    .

    パルスオキシメーターによるオキシヘモグロビンの存在の経時的な測定

    次に、データ サンプリングからの情報を使用して、脈拍数を測定するアルゴリズムを開発する必要がありました。簡単にするために、グラフは次のようなレイアウトを表すものと仮定します。 QRSコンプレックス、最も単純なことは、最も顕著な部分の間の時間を測定することのようです。より高い値(心室の脱分極の qRs ゾーンに対応します)では、より平坦で「ノイズの多い」ゾーンが無視されるため、測定がより困難になります。測定。以下のテスト コードに対応する採用されたソリューションは、次の手順に従って動作します。

    • それぞれのケースで測定されている領域を検出して、値のピークのみに注目します qR そして谷を捨てる。これを行うには、特定の定数よりも高い値を測定できますが、個人および/または状況によって、比例的ではあるものの、値が上下するリスクがあります。これを避けるために、その領域の値は、平均値を一定の係数だけ超えた値よりも大きいとみなします。このようにして、測定値は高感度に自己校正され、係数を微調整することでさらに調整することができます。私の場合、テスト中に実験的にこれを達成しました。

      測定の下降ゾーンの値を選択します(Rs) ピークの qR、曲線の最大値にできるだけ近づけます。昇順ゾーンが放棄されていることを知るには、新しい値が前の値より小さいことを確認し、一般に降順ゾーンにはいくつかの値が存在するため、検索された値がまだ見つかっていないことを確認するだけで十分です。のゾーン qR サンプリング密度によって異なります。パルスのタイミングを計るために、ポイントが見つかった瞬間の値が保存されます (ミリ秒は、 ミリス()) そして次のものと比較します。

      測定値が最も高い曲線の下降ゾーンで最大であることを確認するために、変数が使用されます。 ブール値 (測定パルス この例では、そして アクティブパルス測定 これは、メジャー カーブの上昇ゾーンに入ったときにアクティブになり、最初の下降値 (時間指定された値) が見つかると非アクティブになります。

      通常、パルスの持続時間は 60000 分あたりの拍数 (ppm) として表されるため、得られたパルス間の時間の値は、表示の合計時間 (XNUMX 分、XNUMX ミリ秒) を次の式で得られた間隔で割ることによって計算することによって補正されます。以前に計測したミリ秒から現在のミリ秒 (現在の値) を減算します。

      誤った測定 (例えば、真空中でのデバイスの測定など) を避けるために、結果を当然のものとみなす前に、結果が最大値と最小値の間にあることが検証されます。健康な成人の安静時の正常値は60から100ppmであると平均的に考えられていますが、以下の許容値があり、アスリートでは安静時に40ppm、運動中に最大200ppmであることは簡単に見つかります。激しい運動など。興奮状態で座りがちな成人では 100 ppm であり、まさに睡眠管理プロジェクトにとって興味深い要素です。 それが私をこれを開発するきっかけにしました 脈拍測定装置。このため、関連する側面を正確に示す可能性がある極端さが失われないように、これらの値を大幅に緩和することをお勧めします。

      新しい平均値は、サンプリングされた値の数に基づいて現在の平均の関連性を下げることによって計算され、最後の値が追加されます。また、これまでに測定された値が多いほどそれをさらに減らす係数で重み付けされます。 。

    最後に、前述のアルゴリズムを使用して、脈拍の存在を検出して脈拍を計算するライブラリを開発しました。 ヘモグロビン Oラ オキシヘモグロビン (使用する光の波長に応じて) 以下のコードから。

    ライブラリはサンプリング関数が定期的に呼び出されることを期待しています。 モニターパルス() 脈拍を計算します。これは関数で参照できます。 last_pulse() または関数を使用して 平均パルス() 平均脈拍。リソースが限られていることに加えて、一時的な値が必要ではなく、時間をかけて持続する値を監視する必要があるため、中断の使用を除外しました。 脈拍 私の睡眠管理プロジェクトでは

    。いずれにしても、私が行ったテストによると、その必要はないようです。デバイスまたは動作のいずれかによって、 脈拍特定の周波数でのサンプリングでは十分な情報が提供されますが、それを増加してもそれ以上の (関連性のある) 情報は得られません。また、計算に関連するデータを失わずにそれを大幅に減少させることもできません。初期のバージョンのコードでは、 パルス酸素濃度計 連続する値の変動を正しく考慮すれば、最大測定時間は最小値に非常に近いため、最大測定時間にこだわる必要がないことがわかりました。

    次のプログラム例は、以前のライブラリを使用して、 脈拍 とともに パルス酸素濃度計。クラスのインスタンス化に加えて、 Pulso レベルの監視 オキシヘモグロビン/ヘモグロビン そして周期性が小さくなると、 脈拍 計算され、平均化されます。

    測定値が適切であることを確認するために、値を表示する前に待機時間がプログラムされています。値が正しくない可能性があるため (たとえば、ユーザーがデバイスを取り外した場合)、値は有効とみなされる範囲内にある場合にのみ表示されます。

    コメントを投稿

    見逃したかもしれません