如何进行血氧和体温测量
组件和用品
![]() |
| × | 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 心率传感器
两个 LED,https://amzn.to/3g1v5za
两个220Ω电阻,https://amzn.to/2OSGlBW
GY-906-BCC非接触式红外温度传感器模块
❤订阅它是免费的 https://bit.ly/2C6HdAg
感谢收看,待在家里,注意安全......祝你有美好的一天!
#Arduinoproject #ArduinoBloodOxygen #Howto #COVID19 #BloodOxygen #ArduinoBodyTemperature #BodyTemperature






代码
- Blood_Oximeter.ino
Blood_Oximeter.inoArduino
#include#include #include #include #include "MAX30105.h" //sparkfun MAX3010X libraryMAX30105particleSensor;LiquidCrystal_I2C 20,4);//#define MAX30105 //如果你有 Sparkfun 的 MAX30105 分线板,试试 #define MAX30105 Adafruit_MLX90614 mlx =Adafruit_MLX90614();double avered =0; double aveir =0;double sumirrms =0;double sumredrms =0;int i =0;int Num =100;//以此采样间隔计算SpO2int Temperature;int temp;float EspO2;//估计SpO2float的初始值ESpO2_ROM;双 FSpO2 =0.7; //估计SpO2double frate =0.95的过滤因子; // IR/红色 LED 值的低通滤波器以消除 AC 分量#define TIMETOBOOT 3000 // 等待这个时间(毫秒)输出 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);液晶显示器.init();液晶背光(); lcd.setCursor(3,1); lcd.print("运行中......");延迟(3000);液晶显示器(); ESpO2 =readEEPROM();温度 =EEPROM.read(6); pinMode(绿灯,输出); pinMode(红色,输出);数字写入(绿灯,低);数字写入(红色,低); // 初始化传感器 while (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //使用默认 I2C 端口,400kHz 速度 { Serial.println("MAX30102 was not found. Please check wire/power/solder jumper at MH-ET LIVE MAX30102木板。 ”); //同时(1); } //设置以在绘图仪字节上检测漂亮的锯齿 ledBrightness =0x7F; //Options:0=Off to 255=50mA byte sampleAverage =4; //Options:1, 2, 4, 8, 16, 32 字节 ledMode =2; //Options:1 =Red only, 2 =Red + IR, 3 =Red + IR + Green //Options:1 =IR only, 2 =Red + IR on MH-ET LIVE MAX30102 board int sampleRate =200; //选项:50, 100, 200, 400, 800, 1000, 1600, 3200 int pulseWidth =411; //选项:69, 118, 215, 411 int adcRange =16384; //Options:2048, 4096, 8192, 16384 // 设置想要的参数particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //使用这些设置配置传感器particleSensor.enableDIETEMPRDY(); mlx.begin();}void loop(){ uint32_t ir, red , green;双弗雷德,冷杉;双血氧饱和度 =0; //低通滤波前的原始SpO2 #ifdef USEFIFOparticleSensor.check(); //检查传感器,在(particleSensor.available()) {//我们有新数据时读取最多3个样本#ifdef MAX30105 red =particleSensor.getFIFORed(); //Sparkfun 的 MAX30105 ir =particleSensor.getFIFOIR(); //Sparkfun 的 MAX30105#else red =particleSensor.getFIFOIR(); //为什么在 MH-ET LIVE 分线板上通过 MAX30102 getFOFOIR 输出红色数据 ir =particleSensor.getFIFORed(); //为什么在MH-ET LIVE分线板上MAX30102通过getFIFORed输出IR数据#endif i++;弗雷德 =(双)红;冷杉 =(双)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) {//slow如果 (millis()> TIMETOBOOT) { float ir_forGraph =(2.0 * fir - aveir) / aveir * SCALE; float red_forGraph =(2.0 * fred - 平均)/平均 * SCALE; //串行绘图仪自动缩放的转换 if (ir_forGraph> 100.0) ir_forGraph =100.0;如果 (ir_forGraph <80.0) ir_forGraph =80.0;如果 ( red_forGraph> 100.0 ) red_forGraph =100.0;如果 ( red_forGraph <80.0 ) red_forGraph =80.0; // Serial.print(红色); Serial.print(","); Serial.print(ir);Serial.print(".");浮动温度 =particleSensor.readTemperatureF(); if (ir FINGER_ON){ 温度 =mlx.readObjectTempC(); lcd.setCursor(0,0); lcd.print("氧气% ="); lcd.setCursor(11,0);液晶打印(ESPO2);液晶打印(“”); lcd.print("%"); //温度=温度+2; lcd.setCursor(0,1); lcd.print("温度:");液晶打印(温度); lcd.print(" *C"); if((ESpO2>=90) &&(Temperature <38)){ digitalWrite(Redled,LOW);数字写入(绿灯,高); } if((ESpO2 <90) || (Temperature> 37)){ digitalWrite(Greenled,LOW);数字写入(红色,高); } } } } 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;我 =0;休息;粒子传感器.nextSample(); //我们完成了这个样本,所以移到下一个样本 // Serial.println(SpO2); }#endif}void writeEEPROM(float *data){ byte ByteArray[4]; memcpy(字节数组,数据,4); for(int x =0; x <4; x++) { EEPROM.write(x, ByteArray[x]); } } float readEEPROM(){ float ESpO2 =85.0;字节字节数组[4]; for(int x =0; x <4; x++) { ByteArray[x] =EEPROM.read(x); } memcpy(&ESpO2, ByteArray, 4);返回 ESpO2;}
示意图

制造工艺