血中酸素と体温の測定方法
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
このプロジェクトについて
このプロジェクトでは、血中酸素値と体温値を同時に検出でき、設定値より低い値は赤く点灯します。
重要なことは、血液酸素モジュールは、検出のために自然に指を置く必要があり、過度の圧力をかける必要がないことです。そうしないと、値が間違ってしまいます。
明けましておめでとうございます。
►GitHubのコード(スキームとスケッチ):https://github.com/DKARDU/bloodoxygen
►コンポーネント
このプロジェクトでは、次のパーツが使用されました。
Arduino UNO、https://amzn.to/3ihYFBl
20 x 4 I2C LCD、https://amzn.to/3gTMZnW
Max30102心拍センサー
2つのLED、https://amzn.to/3g1v5za
2つの220Ω抵抗、https://amzn.to/2OSGlBW
GY-906-BCC非接触赤外線温度センサーモジュール
❤SubscribeIt'sFreehttps://bit.ly/2C6HdAg
ご覧いただきありがとうございます。家にいて安全を確保してください...素晴らしい一日を!
#Arduinoproject #ArduinoBloodOxygen#Howto#COVID19 #BloodOxygen #ArduinoBodyTemperature #BodyTemperature
<図>






コード
- Blood_Oximeter.ino
Blood_Oximeter.ino Arduino
#include#include #include #include #include "MAX30105.h" // sparkfunMAX3010XライブラリMAX30105particleSensor; LiquidCrystal_I2C lcd(0x27、 20,4); //#define MAX30105 // SparkfunのMAX30105ブレークアウトボードがある場合は、#defineMAX30105を試してくださいAdafruit_MLX90614mlx =Adafruit_MLX90614(); double avered =0; double aveir =0; double sumirrms =0; double sumredrms =0; int i =0; int Num =100; //このサンプリング間隔でSpO2を計算しますintTemperature; int temp; float ESpO2; //推定SpO2floatESpO2_ROMの初期値;ダブルFSpO2 =0.7; //推定SpO2doublefrateのフィルター係数=0.95; // IR /赤色LED値のローパスフィルターでACコンポーネントを排除#defineTIMETOBOOT 3000 //この時間(msec)が出力されるのを待つSpO2#define SCALE 88.0 //ハートビートとSpO2を同じスケールで表示するように調整#define SAMPLING 5 //ハートビートをより正確に確認したい場合は、SAMPLINGを1#define FINGER_ON 30000に設定します//赤い信号がこれより低い場合は、指がセンサー上にないことを示します#define USEFIFO#define Greenled 8#define Redled 9void setup(){Serial.begin(115200); lcd.init(); lcd.backlight(); lcd.setCursor(3,1); lcd.print( "実行中......"); delay(3000); lcd.clear(); ESpO2 =readEEPROM();温度=EEPROM.read(6); pinMode(Greenled、OUTPUT); pinMode(Redled、OUTPUT); digitalWrite(Greenled、LOW); digitalWrite(Redled、LOW); //センサーを初期化しますwhile(!particleSensor.begin(Wire、I2C_SPEED_FAST))//デフォルトのI2Cポート、400kHzの速度を使用{Serial.println( "MAX30102が見つかりませんでした。MH-ETLIVEMAX30102の配線/電源/はんだジャンパーを確認してくださいボード。 "); // while(1); } //プロッタバイトの見栄えの良い鋸歯を感知するように設定ledBrightness =0x7F; //オプション:0 =オフから255 =50mAバイトsampleAverage =4; //オプション:1、2、4、8、16、32バイトledMode =2; //オプション:1 =赤のみ、2 =赤+ IR、3 =赤+ IR +緑//オプション:1 =IRのみ、2 =MH-ET LIVEMAX30102ボードの赤+ IR int sampleRate =200; //オプション:50、100、200、400、800、1000、1600、3200 int pulseWidth =411; //オプション:69、118、215、411 int adcRange =16384; //オプション:2048、4096、8192、16384 //必要なパラメータを設定しますparticleSensor.setup(ledBrightness、sampleAverage、ledMode、sampleRate、pulseWidth、adcRange); //これらの設定でセンサーを構成しますparticleSensor.enableDIETEMPRDY(); mlx.begin();} void loop(){uint32_t ir、red、green;ダブルフレッド、モミ;ダブルSpO2 =0; //ローパスフィルター処理される前の生のSpO2#ifdef USEFIFOparticleSensor.check(); //センサーをチェックし、最大3つのサンプルを読み取りますwhile(particleSensor.available()){//新しいデータがありますか#ifdef MAX30105 red =particleSensor.getFIFORed(); // SparkfunのMAX30105ir =particleSensor.getFIFOIR(); // SparkfunのMAX30105#else red =particleSensor.getFIFOIR(); // getFOFOIRがMH-ETLIVEブレークアウトボード上のMAX30102によってRedデータを出力する理由ir =particleSensor.getFIFORed(); // getFIFORedがMH-ETLIVEブレークアウトボード上のMAX30102によってIRデータを出力する理由#endifi ++;フレッド=(ダブル)レッド; fir =(double)ir; avered =avered * frate +(double)red *(1.0 --frate); //ローパスフィルターによる平均赤レベルaveir =aveir * frate +(double)ir *(1.0 --frate); //ローパスフィルターによる平均IRレベルsumredrms + =(fred --avered)*(fred --avered); //赤レベルの代替コンポーネントの平方和sumirrms + =(fir --aveir)*(fir --aveir); // IRレベルの代替コンポーネントの平方和if((i%SAMPLING)==0){//遅いarduinoシリアルプロッタのダウングラフプロット速度を間引く場合if(millis()> TIMETOBOOT){float ir_forGraph =(2.0 * fir --aveir)/ aveir * SCALE; float red_forGraph =(2.0 * fred --avered)/ avered * SCALE; //シリアルプロッタの自動スケーリングのトランケーションif(ir_forGraph> 100.0)ir_forGraph =100.0; if(ir_forGraph <80.0)ir_forGraph =80.0; if(red_forGraph> 100.0)red_forGraph =100.0; if(red_forGraph <80.0)red_forGraph =80.0; // Serial.print(red); Serial.print( "、"); Serial.print(ir); Serial.print( "。");フロート温度=particleSensor.readTemperatureF(); if(ir FINGER_ON){Temperature =mlx.readObjectTempC(); lcd.setCursor(0,0); lcd.print( "Oxygen%="); lcd.setCursor(11,0); lcd.print(ESpO2); lcd.print( ""); lcd.print( "%"); //温度=温度+2; lcd.setCursor(0,1); lcd.print( "温度:"); lcd.print(Temperature); lcd.print( "* C"); if((ESpO2> =90)&&(Temperature <38)){digitalWrite(Redled、LOW); digitalWrite(Greenled、HIGH); } if((ESpO2 <90)||(温度> 37)){digitalWrite(Greenled、LOW); digitalWrite(Redled、HIGH); }}}} if((i%Num)==0){double R =(sqrt(sumredrms)/ avered)/(sqrt(sumirrms)/ aveir); // Serial.println(R); SpO2 =-23.3 *(R-0.4)+ 100; //http://ww1.microchip.com/downloads/jp/AppNotes/00001525B_JP.pdf ESpO2 =FSpO2 * ESpO2 +(1.0-FSpO2)* SpO2; //ローパスフィルター//Serial.print(SpO2); Serial .print( "、"); Serial.println(ESpO2); sumredrms =0.0; sumirrms =0.0; i =0;壊す; } particleSensor.nextSample(); //このサンプルは終了したので、次のサンプルに移動します// Serial.println(SpO2); } #endif} void writeEEPROM(float * data){byte ByteArray [4]; memcpy(ByteArray、data、4); for(int x =0; x <4; x ++){EEPROM.write(x、ByteArray [x]); }} float readEEPROM(){float ESpO2 =85.0;バイトByteArray [4]; for(int x =0; x <4; x ++){ByteArray [x] =EEPROM.read(x); } memcpy(&ESpO2、ByteArray、4); ESpO2を返す;}
回路図

製造プロセス