MAX30102: heart rate monitor at oximeter module para sa Arduino

MAX30102

Sa lahat ng oras na ito, nagpakita kami ng malaking bilang ng Mga elektronikong sangkap katugma sa mga board tulad ng Arduino o katugma, pati na rin para sa maraming iba pang maker o DIY na trabaho. Ngayon ay ipakikilala namin sa iyo ang modyul MAX30102, na kinabibilangan ng sensor para sukatin ang pulso at oxygen ng dugo.

Sa ganitong paraan, maaari ka ring gumawa ng mga naisusuot tulad ng mga self-made na pulseras ng aktibidad o hardware para sa subaybayan ang kalagayan ng kalusugan ng isang tao, na nagbibigay ng biometric data o telemetry ng nasabing tao salamat sa pagsasama ng heart rate monitor at oximeter sa device na ito...

Ano ang heart rate monitor? Paano ito gumagana?

Un pulse sensor o heart rate monitor Ito ay isang elektronikong aparato na ginagamit upang sukatin ang tibok ng puso ng isang tao sa real time. Pangunahing ginagamit ito sa larangan ng palakasan upang subaybayan ang pagganap at pagsisikap sa panahon ng pagsasanay o sa araw-araw. Ang mga heart rate monitor ay sikat sa mga atleta, ngunit isa rin silang pangunahing aparato sa mga medikal na sentro upang malaman ang tibok ng puso, iyon ay, ang tibok ng puso o mga tibok bawat minuto:

  • PR Bpm: nagpapakita ng rate ng puso, iyon ay, ang mga beats bawat minuto.

Sa lahat ng kaso, ang Kinukuha ng mga sensor ang pagkakaiba-iba sa dami ng dugo sa bawat tibok ng puso. Ang pagkakaiba-iba na ito ay isinalin sa isang de-koryenteng signal na pinoproseso upang makuha ang tibok ng puso. Kasama rin sa ilang heart rate monitor ang amplification at noise cancellation circuit para mapahusay ang katumpakan ng mga pagbabasa.

Ano ang isang oximeter? Paano ito gumagana?

Un Ang oximeter ay isang medikal o kagamitang pang-sports na ginagamit upang sukatin ang saturation ng oxygen sa dugo. Nag-aalok ang device na ito ng data ng blood oxygen saturation na may mga halaga mula 0 hanggang 100%. Karaniwan para sa parehong device na isama rin ang opsyon sa tibok ng puso, na nagsasaad ng lahat ng impormasyon para sa pagsubaybay o pagre-record.

Ang datos na sumusukat ng oximeter ay:

  • % SpO2: tumutukoy sa porsyento ng saturation ng oxygen sa dugo.

Ang oximeter ay inilalagay tulad ng isang clamp sa paraang ito ay iniangkop sa morpolohiya ng ating daliri o maaari rin itong ilagay sa ibang mga lugar sa katawan, tulad ng kaso sa monitor ng rate ng puso, tulad ng pulso, tulad ng makikita sa maraming activity bracelets. ,

Tungkol sa kanilang operasyon, ang mga oximeter ay naglalabas ng iba light wavelength na dumadaan sa balat. Ang kumikilos sa liwanag na ito ay hemoglobin, isang molekula ng dugo na responsable sa pagdadala ng oxygen, na sumisipsip ng iba't ibang dami ng liwanag depende sa antas ng oxygen na dinadala nito. Ang detalyadong proseso ay ang mga sumusunod:

  1. liwanag na paglabas- Ang oximeter ay naglalabas ng dalawang wavelength ng liwanag, isang pula at isang infrared, na dumadaan sa daliri na nakalagay sa device.
  2. Banayad na pagsipsip: Ang Hemoglobin, isang molekula sa mga pulang selula ng dugo na nagdadala ng oxygen, ay sumisipsip ng iba't ibang dami ng mga ilaw na ito. Ang oxygen-laden hemoglobin (oxyhemoglobin) at oxygen-free hemoglobin (deoxyhemoglobin) ay may magkakaibang katangian ng pagsipsip ng liwanag.
  3. Magaan na pagtuklas: Kinokolekta ng isang detector sa tapat ng light emitter ang liwanag na dumaan sa daliri.
  4. Pagkalkula ng oxygen saturation- Kinakalkula ng device ang ratio ng oxyhemoglobin sa kabuuang halaga ng hemoglobin na naroroon, parehong oxyhemoglobin at deoxyhemoglobin. Ang proporsyon na ito ay ipinakita bilang porsyento ng saturation ng oxygen ng dugo (%SpO2). Ginagawa ito sa pamamagitan ng isang processor na may kakayahang magbigay-kahulugan sa mga electrical signal na ito upang isalin ang mga ito sa isang numerical na halaga.

Ano ang MAX30102 module?

Ang sensor MAX30102, ginawa ng Maxim Integrated, ay isang pinagsamang device na pinagsasama ang mga functionality ng heart rate monitor at oximeter. Ang sensor na ito ay madaling magamit sa isang microcontroller tulad ng Arduino. Ang MAX30102 ay kabilang sa MAX3010x series ng optical sensors mula sa firm na ito.

Ang operasyon nito ay batay sa pagkakaiba-iba ng liwanag na pagsipsip ng dugo, depende sa nito antas ng oxygen saturation, at pulso gaya ng nabanggit ko sa dalawang naunang seksyon. Ang sensor na ito ay nilagyan ng dalawang LED, isang pula at isang infrared. Ito ay inilalagay sa balat, tulad ng sa daliri o pulso, at nakakakita ng sinasalamin na liwanag upang matukoy ang antas ng saturation ng oxygen.

Ang komunikasyon sa MAX30102 ay isinasagawa sa pamamagitan ng I2C bus, na ginagawang madali ang pagkonekta sa isang microcontroller tulad ng Arduino. Ang MAX30102 ay nangangailangan ng double power supply: 1.8V para sa logic at 3.3V para sa LEDs. Karaniwang makikita sa 5V modules na kasama na ang kinakailangang level matching.

Ang MAX30102 ay isang sensor na ginagamit sa mga proyekto sa bahay o sports, ibig sabihin, maaaring wala itong sapat na pagiging maaasahan at sensitivity para sa propesyonal na medikal na paggamit.

La optical pulse oximetry Ito ay isang non-invasive na paraan upang matukoy ang porsyento ng oxygen saturation sa dugo. Tulad ng nabanggit ko dati, ito ay batay sa pagkakaiba sa light absorption coefficients ng hemoglobin (Hb) at oxyhemoglobin (HbO2) para sa iba't ibang wavelength. Ang dugong mayaman sa oxygen ay sumisipsip ng mas maraming infrared na ilaw, habang ang dugong mababa sa oxygen ay sumisipsip ng mas maraming pulang ilaw. Sa mga bahagi ng katawan kung saan ang balat ay sapat na manipis at may mga daluyan ng dugo sa ilalim, ang pagkakaibang ito ay maaaring gamitin upang matukoy ang antas ng saturation ng oxygen.

Mga tampok ng MAX30102 module na may pulse at blood oxygen sensor

Kasama sa MAX30102 ang:

  • 2x LEDs, isang pula (660nm) at isang infrared (880nm)
  • 2x photodiodes para sukatin ang naaninag na liwanag
  • 18-bit ADC converter na may sampling rate na 50 hanggang 3200 sample bawat segundo.
  • Bilang karagdagan, mayroon itong mga kinakailangang electronics para sa pagpapalakas at pag-filter ng signal, pagkansela ng ilaw sa paligid, pagtanggi sa mga frequency na 50-60Hz (artipisyal na ilaw) at kabayaran sa temperatura.

Pagkonsumo ng module maaaring umabot ng hanggang 50mA sa panahon ng pagsukat, kahit na ang intensity ay maaaring iakma sa programmatically, na may mababang power mode na 0.7µA sa panahon ng mga pagsukat.

Presyo at saan bibili

Ang MAX30102 sensor upang sukatin ang pulso at oxygen ng dugo ang mga ito ay medyo mura. Ang mga module na ito ay maaaring maging sa iyo para sa ilang euro lamang sa mga site tulad ng eBay, Aliexpress o Amazon. Makikita mo na mayroong ilang mga uri, at inirerekomenda namin ang sumusunod:

Mga koneksyon at halimbawa sa Arduino

Arduino IDE, mga uri ng data, programming

Upang subukan ang MAX30102 sa Arduino, ang unang bagay ay ikonekta ang module na ito sa Arduino board. Ito ang koneksyon ay napaka-simple, kailangan mo lang ikonekta ang sumusunod:

  1. Ang Vcc ng module ay dapat na konektado sa 5V output ng Arduino board.
  2. Ang GND ng module ay dapat na konektado sa GND socket ng Arduino board.
  3. Ang SCL ng module ay dapat na konektado sa isa sa mga analog input ng Arduino board, tulad ng A5.
  4. Ang SDA ng module ay dapat na konektado sa isa pang analog input ng Arduino board, tulad ng A4.

Kapag naitatag na ang mga naaangkop na koneksyon sa pagitan ng MAX30102 board at ng Arduino board, ang susunod na bagay ay ang magsulat ng source code o sketch para gumana ito at magsimulang makatanggap ng biometric data mula sa taong pinag-uusapan. Ito ay kasingdali ng pagsulat ng sumusunod na code sa Arduino IDE at i-program ang board:

Kailangan mo ring mag-install ng library sa Arduino IDE para magamit ito. Ang library ay binuo ng SparkFun, at available sa 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);
  }
}

Siyempre, maaari mong baguhin ang code ayon sa iyong mga pangangailangan, ito ay isang halimbawa lamang...


Maging una sa komento

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.