MAX30102: เครื่องวัดอัตราการเต้นของหัวใจและโมดูล oximeter สำหรับ Arduino

MAX30102

ตลอดเวลานี้เราได้แสดงให้เห็นเป็นจำนวนมาก ชิ้นส่วนอิเล็กทรอนิกส์ เข้ากันได้กับ บอร์ดเช่น Arduino หรือเข้ากันได้รวมถึงงานช่างทำหรืองาน DIY อื่นๆ อีกมากมาย ตอนนี้เราจะมาแนะนำคุณกับโมดูล MAX30102ซึ่งมีเซ็นเซอร์วัดชีพจรและออกซิเจนในเลือด

ด้วยวิธีนี้ คุณสามารถสร้างอุปกรณ์สวมใส่ได้ เช่น กำไลข้อมือหรือฮาร์ดแวร์สำหรับกิจกรรมทำเอง ติดตามสถานะสุขภาพ ของบุคคล การให้ข้อมูลไบโอเมตริกซ์หรือการวัดทางไกลของบุคคลดังกล่าว เนื่องจากการผสานรวมเครื่องวัดอัตราการเต้นของหัวใจและเครื่องวัดออกซิเจนในเลือดในอุปกรณ์นี้...

เครื่องวัดอัตราการเต้นของหัวใจคืออะไร? มันทำงานอย่างไร?

Un เซ็นเซอร์ชีพจรหรือเครื่องวัดอัตราการเต้นของหัวใจ เป็นอุปกรณ์อิเล็กทรอนิกส์ที่ใช้ในการวัดอัตราการเต้นของหัวใจของบุคคลแบบเรียลไทม์ ส่วนใหญ่จะใช้ในสนามกีฬาเพื่อติดตามประสิทธิภาพและความพยายามระหว่างการฝึกซ้อมหรือในชีวิตประจำวัน เครื่องวัดอัตราการเต้นของหัวใจเป็นที่นิยมในหมู่นักกีฬา แต่ก็เป็นอุปกรณ์พื้นฐานในศูนย์การแพทย์ในการทราบอัตราการเต้นของหัวใจซึ่งก็คืออัตราการเต้นของหัวใจหรือการเต้นของหัวใจต่อนาที:

  • ประชาสัมพันธ์ Bpm: แสดงอัตราการเต้นของหัวใจ กล่าวคือ อัตราการเต้นของหัวใจต่อนาที

ในทุกกรณี เซ็นเซอร์จะจับความแปรผันของปริมาตรเลือดในแต่ละการเต้นของหัวใจ. รูปแบบนี้ถูกแปลเป็นสัญญาณไฟฟ้าที่ได้รับการประมวลผลเพื่อให้ได้อัตราการเต้นของหัวใจ เครื่องวัดอัตราการเต้นของหัวใจบางรุ่นยังมีวงจรขยายและตัดเสียงรบกวนเพื่อปรับปรุงความแม่นยำในการอ่าน

เครื่องวัดออกซิเจนคืออะไร? มันทำงานอย่างไร?

Un oximeter เป็นอุปกรณ์ทางการแพทย์หรือการกีฬา ซึ่งใช้วัดความอิ่มตัวของออกซิเจนในเลือด อุปกรณ์นี้นำเสนอข้อมูลความอิ่มตัวของออกซิเจนในเลือดที่มีค่าตั้งแต่ 0 ถึง 100% เป็นเรื่องปกติที่อุปกรณ์เดียวกันจะมีตัวเลือกอัตราการเต้นของหัวใจด้วย ซึ่งระบุข้อมูลทั้งหมดสำหรับการตรวจสอบหรือบันทึก

ข้อมูลที่ วัดค่าออกซิเจน มันเป็น:

  • %SpO2: หมายถึงเปอร์เซ็นต์ความอิ่มตัวของออกซิเจนในเลือด

oximeter วางเหมือนที่หนีบในลักษณะที่ปรับให้เข้ากับสัณฐานวิทยาของนิ้วของเราหรือสามารถวางไว้ที่ตำแหน่งอื่นในร่างกายได้เช่นเดียวกับกรณีของเครื่องวัดอัตราการเต้นของหัวใจเช่นข้อมือ สามารถพบได้ในกำไลกิจกรรมมากมาย ,

ในการทำงานนั้น oximeters จะปล่อยก๊าซที่แตกต่างกัน ความยาวคลื่นแสง ที่ทะลุผ่านผิวหนัง สิ่งที่ทำหน้าที่กับแสงนี้คือฮีโมโกลบิน ซึ่งเป็นโมเลกุลของเลือดที่ทำหน้าที่ขนส่งออกซิเจน โดยดูดซับแสงในปริมาณที่แตกต่างกันไป ขึ้นอยู่กับระดับของออกซิเจนที่มันขนส่ง กระบวนการโดยละเอียดมีดังนี้:

  1. การปล่อยแสง- oximeter ปล่อยแสงความยาวคลื่นสองช่วง หนึ่งสีแดงและหนึ่งอินฟราเรด ซึ่งส่องผ่านนิ้วที่วางไว้บนอุปกรณ์
  2. การดูดซับแสง: เฮโมโกลบินซึ่งเป็นโมเลกุลในเซลล์เม็ดเลือดแดงที่นำพาออกซิเจนจะดูดซับแสงเหล่านี้ในปริมาณที่แตกต่างกัน เฮโมโกลบินที่มีออกซิเจน (oxyhemoglobin) และฮีโมโกลบินที่ปราศจากออกซิเจน (deoxyhemoglobin) มีคุณสมบัติในการดูดซับแสงที่แตกต่างกัน
  3. การตรวจจับแสง: เครื่องตรวจจับที่อยู่ฝั่งตรงข้ามของตัวปล่อยแสงจะรวบรวมแสงที่ผ่านนิ้ว
  4. การคำนวณความอิ่มตัวของออกซิเจน- อุปกรณ์คำนวณอัตราส่วนของออกซีฮีโมโกลบินต่อปริมาณฮีโมโกลบินทั้งหมดที่มีอยู่ ทั้งออกซีเฮโมโกลบินและดีออกซีเฮโมโกลบิน สัดส่วนนี้แสดงเป็นเปอร์เซ็นต์ของความอิ่มตัวของออกซิเจนในเลือด (%SpO2) ซึ่งทำได้ผ่านโปรเซสเซอร์ที่สามารถตีความสัญญาณไฟฟ้าเหล่านี้เพื่อแปลเป็นค่าตัวเลขได้

โมดูล MAX30102 คืออะไร?

เซ็นเซอร์ MAX30102 ผลิตโดย Maxim Integratedเป็นอุปกรณ์บูรณาการที่รวมฟังก์ชันการทำงานของเครื่องวัดอัตราการเต้นของหัวใจและเครื่องวัดออกซิเจนในเลือด เซ็นเซอร์นี้สามารถใช้กับไมโครคอนโทรลเลอร์เช่น Arduino ได้อย่างง่ายดาย MAX30102 เป็นของเซ็นเซอร์ออปติคัลซีรีส์ MAX3010x จากบริษัทนี้

การทำงานของมันขึ้นอยู่กับความแปรผันของการดูดกลืนแสงของเลือด ขึ้นอยู่กับมัน ระดับความอิ่มตัวของออกซิเจน และชีพจร ตามที่ฉันได้กล่าวไว้ในสองส่วนก่อนหน้านี้ เซ็นเซอร์นี้ติดตั้งไฟ LED สองดวง สีแดงหนึ่งดวงและอินฟราเรดหนึ่งดวง โดยวางบนผิวหนัง เช่น บนนิ้วหรือข้อมือ และตรวจจับแสงสะท้อนเพื่อกำหนดระดับความอิ่มตัวของออกซิเจน

ดำเนินการสื่อสารกับ MAX30102 ผ่านบัส I2Cทำให้ง่ายต่อการเชื่อมต่อกับไมโครคอนโทรลเลอร์เช่น Arduino MAX30102 ต้องการแหล่งจ่ายไฟคู่: 1.8V สำหรับลอจิกและ 3.3V สำหรับ LED โดยทั่วไปจะพบได้ในโมดูล 5V ที่มีการจับคู่ระดับที่จำเป็นอยู่แล้ว

MAX30102 เป็นเซ็นเซอร์ที่ใช้ในบ้านหรือโครงการกีฬา กล่าวคือ อาจมีความน่าเชื่อถือและความไวไม่เพียงพอสำหรับการใช้งานทางการแพทย์ระดับมืออาชีพ

La เครื่องวัดความอิ่มตัวของออกซิเจนในเลือดแบบออปติคอล เป็นวิธีการแบบไม่รุกรานเพื่อกำหนดเปอร์เซ็นต์ความอิ่มตัวของออกซิเจนในเลือด ดังที่ได้กล่าวไปแล้ว ค่านี้ขึ้นอยู่กับความแตกต่างของค่าสัมประสิทธิ์การดูดกลืนแสงของฮีโมโกลบิน (Hb) และออกซีเฮโมโกลบิน (HbO2) สำหรับความยาวคลื่นที่ต่างกัน เลือดที่มีออกซิเจนมากจะดูดซับแสงอินฟราเรดได้มากขึ้น ในขณะที่เลือดที่มีออกซิเจนต่ำจะดูดซับแสงสีแดงมากขึ้น ในบริเวณของร่างกายที่ผิวหนังบางเพียงพอและมีหลอดเลือดอยู่ข้างใต้ ความแตกต่างนี้สามารถใช้เพื่อกำหนดระดับความอิ่มตัวของออกซิเจนได้

คุณสมบัติของโมดูล MAX30102 พร้อมเซ็นเซอร์ชีพจรและออกซิเจนในเลือด

MAX30102 ประกอบด้วย:

  • ไฟ LED 2 ดวง สีแดงหนึ่งดวง (660 นาโนเมตร) และอินฟราเรดหนึ่งดวง (880 นาโนเมตร)
  • โฟโตไดโอด 2x เพื่อวัดแสงสะท้อน
  • ตัวแปลง ADC 18 บิตพร้อมอัตราการสุ่มตัวอย่าง 50 ถึง 3200 ตัวอย่างต่อวินาที
  • นอกจากนี้ ยังมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการขยายและการกรองสัญญาณ การยกเลิกแสงโดยรอบ การปฏิเสธความถี่ 50-60Hz (แสงประดิษฐ์) และการชดเชยอุณหภูมิ

ปริมาณการใช้โมดูล สามารถเข้าถึงได้ถึง 50mA ในระหว่างการวัด แม้ว่าสามารถปรับความเข้มได้โดยทางโปรแกรม โดยมีโหมดพลังงานต่ำที่ 0.7µA ในระหว่างการวัด

Precio y dóndeประกอบด้วย

เซ็นเซอร์ MAX30102 เพื่อวัดชีพจรและออกซิเจนในเลือด พวกเขาค่อนข้างถูก. โมดูลเหล่านี้สามารถเป็นของคุณได้ในราคาเพียงไม่กี่ยูโรบนเว็บไซต์เช่น eBay, Aliexpress หรือ Amazon คุณจะเห็นว่ามีหลายประเภทและเราขอแนะนำดังต่อไปนี้:

การเชื่อมต่อและตัวอย่างกับ Arduino

Arduino IDE, ชนิดข้อมูล, การเขียนโปรแกรม

ในการทดสอบ MAX30102 กับ Arduino สิ่งแรกคือการเชื่อมต่อโมดูลนี้เข้ากับบอร์ด Arduino นี้ การเชื่อมต่อนั้นง่ายมากคุณเพียงแค่ต้องเชื่อมต่อสิ่งต่อไปนี้:

  1. Vcc ของโมดูลต้องเชื่อมต่อกับเอาต์พุต 5V ของบอร์ด Arduino
  2. GND ของโมดูลจะต้องเชื่อมต่อกับซ็อกเก็ต GND ของบอร์ด Arduino
  3. ต้องเชื่อมต่อ SCL ของโมดูลเข้ากับอินพุตอะนาล็อกตัวใดตัวหนึ่งของบอร์ด Arduino เช่น A5
  4. SDA ของโมดูลจะต้องเชื่อมต่อกับอินพุตอะนาล็อกอื่นของบอร์ด Arduino เช่น A4

เมื่อสร้างการเชื่อมต่อที่เหมาะสมระหว่างบอร์ด MAX30102 และบอร์ด Arduino แล้ว สิ่งต่อไปคือการเขียนซอร์สโค้ดหรือภาพร่างเพื่อให้ทำงานได้ และเริ่มรับข้อมูลไบโอเมตริกซ์จากบุคคลที่เป็นปัญหา ง่ายเหมือนกับการเขียนโค้ดต่อไปนี้ลงไป Arduino IDE และตั้งโปรแกรมบอร์ด:

คุณต้องติดตั้งไลบรารีใน Arduino IDE เพื่อใช้งาน ห้องสมุดได้รับการพัฒนาโดย SparkFun และมีให้บริการที่ https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library.
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"

MAX30102 pulsioximetro;


#define MAX_BRIGHTNESS 255


#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno no tiene suficiente SRAM para almacenar 100 muestreos, por lo que hay que truncar las muestras en 16-bit MSB.
uint16_t pulsoBuffer[100]; //infrared LED sensor data
uint16_t oxiBuffer[100];  //red LED sensor data

#else
uint32_t pulsoBuffer[100]; //Sensores
uint32_t oxiBuffer[100];  

#endif

int32_t BufferLongitud; //Longitud de datos
int32_t spo2; //Valor de SPO2
int8_t SPO2valido; //Indicador de validez del valor SPO2
int32_t rangopulsacion; //PR BPM o pulsaciones
int8_t validrangopulsacion; //Indicador de validez del valor PR BPM

byte pulsoLED = 11; //Pin PWM
byte lecturaLED = 13; //Titila con cada lectura

void setup()
{
  Serial.begin(115200); // Inicia la comunicación con el microcontrolador a 115200 bits/segundo

  pinMode(pulsoLED, OUTPUT);
  pinMode(lecturaLED, OUTPUT);

  // Inicializar sensores
  if (!pulsioximetro.begin(Wire, I2C_SPEED_FAST)) //Usar el bus I2C a 400kHz 
  {
    Serial.println(F("MAX30102 no encontrado. Por favor, comprueba la conexión y alimentación del módulo."));
    while (1);
  }

  Serial.println(F("Pon el sensor en contacto con tu dedo y presiona cualquier tecla para iniciar la conversión."));
  while (Serial.available() == 0) ; //Esperar hasta que se pulsa una tecla
  Serial.read();

  byte brilloLED = 60; //Opciones: 0=Apagado hasta 255=50mA
  byte mediaMuestreo = 4; //Opciones: 1, 2, 4, 8, 16, 32
  byte ModoLED = 2; //Opciones: 1 = Rojo solo, 2 = Rojo + IR, 3 = Rojo + IR + Verde
  byte rangoMuestreo = 100; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int anchoPulso = 411; //Opciones: 69, 118, 215, 411
  int rangoADC = 4096; //Opciones: 2048, 4096, 8192, 16384

  pulsioximetro.setup(brilloLED, mediaMuestreo, ModoLED, rangoMuestreo, anchoPulso, rangoADC); //Configuración del módulo
}

void loop()
{
  BufferLongitud = 100; //10 almacenamientos en el buffer con 4 segundos corriendo a 25sps

  //Leer las primeras 100 muestras
  for (byte i = 0 ; i < BufferLongitud ; i++)
  {
    while (pulsioximetro.available() == false) //Comprobar nuevos datos
      pulsioximetro.check(); 
    oxiBuffer[i] = pulsioximetro.getRed();
    pulsoBuffer[i] = pulsioximetro.getIR();
    pulsioximetro.siguienteMuestreo(); //Muestreo terminado, ir al siguiente muestreo

    Serial.print(F("red="));
    Serial.print(oxiBuffer[i], DEC);
    Serial.print(F(", ir="));
    Serial.println(pulsoBuffer[i], DEC);
  }

  //Calcular el valor del pulso PM y SpO2 tras los primeros 100 samples
  maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);

  //Calcular muestreos continuos
  while (1)
  {
    //Volcar los 25 primeros valores en memoria y desplazar los últimos 75 arriba
    for (byte i = 25; i < 100; i++)
    {
      oxiBuffer[i - 25] = oxiBuffer[i];
      pulsoBuffer[i - 25] = pulsoBuffer[i];
    }

    for (byte i = 75; i < 100; i++)
    {
      while (pulsioximetro.available() == false) //Comprobar si existen nuevos datos
        pulsioximetro.check(); 

      digitalWrite(lecturaLED, !digitalRead(lecturaLED)); //Parpadea el LED on-board con cada dato

      oxiBuffer[i] = pulsioximetro.getRed();
      pulsoBuffer[i] = pulsioximetro.getIR();
      pulsioximetro.siguienteMuestreo(); //Al finalizar, moverse al siguiente muestreo

      Serial.print(F("Oxígeno="));
      Serial.print(oxiBuffer[i], DEC);
      Serial.print(F(", Pulso="));
      Serial.print(pulsoBuffer[i], DEC);

      Serial.print(F(", HR="));
      Serial.print(rangopulsacion, DEC);

      Serial.print(F(", HRvalid="));
      Serial.print(validrangopulsacion, DEC);

      Serial.print(F(", SPO2="));
      Serial.print(spo2, DEC);

      Serial.print(F(", SPO2 válido="));
      Serial.println(SPO2valido, DEC);
    }

    //Recalcular tras los primeros muestreos
    maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);
  }
}

แน่นอนว่าคุณสามารถแก้ไขโค้ดได้ตามความต้องการ นี่เป็นเพียงตัวอย่าง...


เป็นคนแรกที่จะแสดงความคิดเห็น

แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา