COVID-19用のオープンソースパルスオキシメータ
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
|
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
COVID-19の課題
COVID-19は、主に人の呼吸器系を攻撃するSARS-CoV-2ウイルスによって引き起こされる病気です。軽度の症状には、発熱、痛み、悪寒などがありますが、肺炎などのより深刻な症状を引き起こすこともあります。肺炎やわずかな息切れがある人は、特に彼らがさらに圧倒され始めているので、いつ病院に行くべきかわからないかもしれません。これが、私がこのオープンソースパルスオキシメータを作成した理由です。これは、人々が必要な支援を受け、現在の状態に関する正確な情報を得るのに役立ちます。
<図>
免責事項のビット
このデバイス/プロジェクトは、正確な医療診断ツールとして使用することはできません!
エレクトロニクス
MAX30102
<図>128x64ピクセルOLED
<図> <図>Arduino Nano
<図>
デバイスのステップバイステップの構築
これは、このプロジェクトを構築する方法のステップバイステップのウォークスルーです。
1.部品を印刷して清掃する
このプロジェクトの添付ファイルセクションから各ピースをダウンロードし、選択したスライサーにロードすることから始めます。私は約70-80%のインフィルと中程度のサポートを使用しました。すべてPLAを使用しています。印刷が終わったら、サポートを取り外し、軽く紙やすりで磨いて、すべてがうまく収まるようにしました。
<図> <図> <図> <図>
2.電子機器をはんだ付けする
デバイス全体は、44mm x30mmのパフォーマンスボードに取り付けられたArduinoNanoを中心に設計されています。まず、ワイヤーがセンサーのVIN、GND、SDA、およびSCLピンにはんだ付けされてから、ベッドピースの下からArduinoNanoに接続されます。
<図>次に、OLEDのコネクタをNanoに接続し、ディスプレイ自体に接続します。
<図>そして最後に、電子機器アセンブリ全体をハウジングに滑り込ませ、2本の3mmネジで固定します。
3.デバイスを組み立てます
電子機器を挿入したら、OLEDスクリーンを上部に取り付け、3mmのネジを数本使用してシャーシの残りの部分に固定します。ふたを上下に軽く動かすことで、その動きをテストできます。
<図> <図>
4.スケッチをアップロードする
含まれているスケッチは、ユーザーの現在の心拍数と酸素飽和度を表示するためにいくつかのアクションを実行します。アップロードするには、必要なライブラリをインストールし、[ツール]メニューのボードリストから[Arduino Nano]を選択して、[アップロード]をクリックします。
<図>スケッチ自体に関しては、発生する可能性のあるエラーを報告しながら、最初にOLEDとMAX30102を初期化します。次に、100個の値を読み込んでセンサーを校正し、表示を開始します。次に、デバイスはループに入り、25個の新しい値を読み取り、それらを使用して移動平均を計算します。最後に、値が有効かどうかを確認し、有効な場合は画面に出力します。
5.それを使用する
パルスオキシメータを使用するには、センサーの上に指先を置き、上蓋をそっと閉じます。次に、電源を接続し、データが表示されるまで待ちます。
<図> <図> <図>
コード
- パルスオキシメータコード
パルスオキシメータコード C / C ++
/ *ハードウェア接続(ブレークアウトボードからArduinoへ):-5V =5V(3.3Vが許可されます)-GND =GND -SDA =A4(またはSDA)-SCL =A5(またはSCL)-INT =未接続MAX30105ブレイクアウトは5Vまたは3.3VI2Cロジックを処理できます。ボードに5Vで電力を供給することをお勧めしますが、3.3Vでも動作します。* /#include#include "MAX30105.h" #include "spo2_algorithm.h" #include "SSD1306Ascii.h" #include "SSD1306AsciiWire .h "MAX30105particleSensor; SSD1306AsciiWire oled; #define MAX_BRIGHTNESS 255#if defined(__ AVR_ATmega328P __)|| defined(__ AVR_ATmega168 __)// Arduino Unoには32ビット形式のIR主導データと赤主導データの50サンプルを保存するのに十分なSRAMがありません//この問題を解決するために、サンプリングされたデータの16ビットMSBは切り捨てられます。サンプルは16ビットデータになります。uint16_tirBuffer[50]; //赤外線LEDセンサーdatauint16_tredBuffer [50]; //赤色LEDセンサーデータ#elseuint32_t irBuffer [50]; //赤外線LEDセンサーdatauint32_tredBuffer [50]; //赤色LEDセンサーデータ#endifint32_t spo2; // SPO2 valueint8_t validSPO2; // SPO2計算が有効かどうかを示すインジケーターint32_theartRate; //心拍数valueint8_tvalidHeartRate; //心拍数の計算が有効かどうかを示すインジケーターvoidsetup(){Serial.begin(115200); //シリアル通信を115200ビット/秒で初期化します:oled.begin(&Adafruit128x64、0x3C); oled.setFont(Arial14); //センサーを初期化しますif(!particleSensor.begin(Wire、I2C_SPEED_FAST))//デフォルトのI2Cポート、400kHzの速度を使用{Serial.println(F( "MAX30105が見つかりませんでした。配線/電源を確認してください。")); while(1); } particleSensor.setup(55、4、2、200、411、4096); //これらの設定でセンサーを構成します} void loop(){//最初の50サンプルを読み取り、(byte i =0; i <50; i ++){while(particleSensor.available()==falseの信号範囲を決定します)//新しいデータはありますか? particleSensor.check(); //センサーで新しいデータを確認しますredBuffer [i] =particleSensor.getRed(); irBuffer [i] =particleSensor.getIR(); particleSensor.nextSample(); //このサンプルは終了したので、次のサンプルに移動しますSerial.print(F( "red =")); Serial.print(redBuffer [i]、DEC); Serial.print(F( "、ir =")); Serial.println(irBuffer [i]、DEC); } //最初の50サンプル(サンプルの最初の4秒)後の心拍数とSpO2を計算しますmaxim_heart_rate_and_oxygen_saturation(irBuffer、50、redBuffer、&spo2、&validSPO2、&heartRate、&validHeartRate); // MAX30102から継続的にサンプルを取得します。心拍数とSpO2は1秒ごとに計算されますが、(1){//最初の25セットのサンプルをメモリにダンプし、最後の25セットのサンプルを一番上にシフトします(バイトi =25; i <50; i ++) {redBuffer [i-25] =redBuffer [i]; irBuffer [i-25] =irBuffer [i]; } //心拍数を計算する前に25セットのサンプルを採取します。 for(byte i =25; i <50; i ++){while(particleSensor.available()==false)//新しいデータはありますか? particleSensor.check(); //センサーで新しいデータを確認しますredBuffer [i] =particleSensor.getRed(); irBuffer [i] =particleSensor.getIR(); particleSensor.nextSample(); //このサンプルは終了したので、次のサンプルに移動しますSerial.print(F( "red =")); Serial.print(redBuffer [i]、DEC); Serial.print(F( "、ir =")); Serial.print(irBuffer [i]、DEC); Serial.print(F( "、HR =")); Serial.print(heartRate、DEC); Serial.print(F( "、HRvalid =")); Serial.print(validHeartRate、DEC); Serial.print(F( "、SPO2 =")); Serial.print(spo2、DEC); Serial.print(F( "、SPO2Valid =")); Serial.println(validSPO2、DEC); } // 25個の新しいサンプルを収集した後、HRとSP02を再計算しますmaxim_heart_rate_and_oxygen_saturation(irBuffer、50、redBuffer、&spo2、&validSPO2、&heartRate、&validHeartRate); printToScreen(); }} void printToScreen(){oled.clear(); oled.setCursor(0,0); if(validSPO2 &&validHeartRate){oled.print(F( "HR:")); oled.println(heartRate、DEC); oled.print(F( "SPO2:")); oled.println(spo2、DEC); } else {oled.print(F( "無効")); }}
カスタムパーツとエンクロージャー
回路図
製造プロセス