MAX30102: merilnik srčnega utripa in modul oksimetra za Arduino

MAX30102

V vsem tem času smo prikazali veliko število Elektronske komponente kompatibilen z plošče, kot je Arduino ali združljive, kot tudi za številna druga dela izdelovalcev ali DIY. Zdaj vam bomo predstavili modul MAX30102, ki vključuje senzor za merjenje pulza in kisika v krvi.

Na ta način lahko ustvarite tudi nosljive predmete, kot so zapestnice za dejavnosti, ki jih sami izdelate, ali strojna oprema za spremljati zdravstveno stanje osebe, ki zagotavlja biometrične podatke ali telemetrijo omenjene osebe zahvaljujoč integraciji merilnika srčnega utripa in oksimetra v to napravo...

Kaj je merilnik srčnega utripa? Kako deluje?

Un senzor pulza ali merilnik srčnega utripa Je elektronska naprava, ki se uporablja za merjenje srčnega utripa osebe v realnem času. Uporablja se predvsem na športnem področju za spremljanje učinkovitosti in napora med treningom ali vsakodnevno. Merilniki srčnega utripa so priljubljeni med športniki, vendar so tudi temeljna naprava v zdravstvenih centrih za poznavanje srčnega utripa, to je srčnega utripa ali utripov na minuto:

  • PR Bpm: prikazuje srčni utrip, to je število utripov na minuto.

V vseh primerih je Senzorji zajamejo spremembe volumna krvi z vsakim srčnim utripom. Ta sprememba se prevede v električni signal, ki se obdela za pridobitev srčnega utripa. Nekateri merilniki srčnega utripa vključujejo tudi vezja za ojačanje in odpravljanje hrupa za izboljšanje natančnosti odčitkov.

Kaj je oksimeter? Kako deluje?

Un oksimeter je medicinski ali športni pripomoček ki se uporablja za merjenje nasičenosti krvi s kisikom. Ta naprava ponuja podatke o nasičenosti krvi s kisikom z vrednostmi od 0 do 100 %. Običajno je, da ista naprava vključuje tudi možnost srčnega utripa, ki prikazuje vse informacije za spremljanje ali snemanje.

Podatki, ki meri oksimeter je:

  • % SpO2: se nanaša na odstotek nasičenosti krvi s kisikom.

Oksimeter namestimo kot objemko tako, da je prilagojen morfologiji našega prsta ali pa ga namestimo tudi na druga mesta na telesu, kot velja za merilnik srčnega utripa, na primer zapestje, npr. je mogoče videti v številnih zapestnicah za dejavnosti. ,

Glede na delovanje oksimetri oddajajo različno valovne dolžine svetlobe ki gredo skozi kožo. Na to svetlobo vpliva hemoglobin, krvna molekula, odgovorna za prenos kisika, ki absorbira različne količine svetlobe, odvisno od količine kisika, ki jo prenaša. Podroben postopek je naslednji:

  1. oddajanje svetlobe- Oksimeter oddaja dve valovni dolžini svetlobe, eno rdečo in eno infrardečo, ki prehajata skozi prst, nameščen na napravi.
  2. Absorpcija svetlobe: Hemoglobin, molekula v rdečih krvničkah, ki prenaša kisik, absorbira različne količine teh svetlob. S kisikom obremenjen hemoglobin (oksihemoglobin) in hemoglobin brez kisika (deoksihemoglobin) imata različne lastnosti absorpcije svetlobe.
  3. Zaznavanje svetlobe: Detektor na nasprotni strani oddajnika svetlobe zbira svetlobo, ki je prešla skozi prst.
  4. Izračun nasičenosti s kisikom- Naprava izračuna razmerje med oksihemoglobinom in celotno količino prisotnega hemoglobina, tako oksihemoglobina kot deoksihemoglobina. Ta delež je predstavljen kot odstotek nasičenosti krvi s kisikom (%SpO2). To se izvede s pomočjo procesorja, ki je sposoben interpretirati te električne signale in jih prevesti v številsko vrednost.

Kaj je modul MAX30102?

Senzor MAX30102, proizvajalec Maxim Integrated, je integrirana naprava, ki združuje funkcionalnosti merilnika srčnega utripa in oksimetra. Ta senzor je enostavno uporabiti z mikrokrmilnikom, kot je Arduino. MAX30102 spada v serijo optičnih senzorjev MAX3010x tega podjetja.

Njegovo delovanje temelji na spreminjanju absorpcije svetlobe v krvi, odvisno od njenega raven nasičenosti s kisikom in utrip kot sem omenil v prejšnjih dveh razdelkih. Ta senzor je opremljen z dvema LED diodama, eno rdečo in eno infrardečo. Namesti se na kožo, na primer na prst ali zapestje, in zaznava odbito svetlobo, da določi stopnjo nasičenosti s kisikom.

Komunikacija z MAX30102 se izvaja prek vodila I2C, kar olajša povezavo z mikrokrmilnikom, kot je Arduino. MAX30102 potrebuje dvojno napajanje: 1.8 V za logiko in 3.3 V za LED. Običajno se nahaja na 5V modulih, ki že vključujejo potrebno ujemanje ravni.

MAX30102 je senzor, ki se uporablja v domačih ali športnih projektih, kar pomeni, da morda nima zadostne zanesljivosti in občutljivosti za profesionalno medicinsko uporabo.

La optična pulzna oksimetrija Je neinvazivna metoda za določanje odstotka nasičenosti krvi s kisikom. Kot sem že omenil, temelji na razliki v koeficientih absorpcije svetlobe hemoglobina (Hb) in oksihemoglobina (HbO2) za različne valovne dolžine. Kri, bogata s kisikom, absorbira več infrardeče svetlobe, medtem ko kri z nizko vsebnostjo kisika absorbira več rdeče svetlobe. Na delih telesa, kjer je koža dovolj tanka in so pod njo krvne žile, lahko to razliko uporabimo za določitev stopnje nasičenosti s kisikom.

Lastnosti modula MAX30102 s senzorjem pulza in kisika v krvi

MAX30102 vključuje:

  • 2x LED, ena rdeča (660nm) in ena infrardeča (880nm)
  • 2x fotodiode za merjenje odbite svetlobe
  • 18-bitni ADC pretvornik s hitrostjo vzorčenja od 50 do 3200 vzorcev na sekundo.
  • Poleg tega ima potrebno elektroniko za ojačanje in filtriranje signala, izničenje svetlobe okolice, zavrnitev frekvenc 50-60Hz (umetna svetloba) in temperaturno kompenzacijo.

Poraba modula lahko doseže do 50mA med merjenjem, čeprav je mogoče intenzivnost prilagoditi programsko, z načinom nizke porabe 0.7 µA med meritvami.

Cena in kje kupiti

Senzorji MAX30102 za merjenje pulza in kisika v krvi so precej poceni. Ti moduli so lahko vaši že za nekaj evrov na spletnih mestih, kot so eBay, Aliexpress ali Amazon. Videli boste, da obstaja več vrst in priporočamo naslednje:

Povezave in primer z Arduinom

Arduino IDE, vrste podatkov, programiranje

Če želite preizkusiti MAX30102 z Arduinom, najprej ta modul povežete s ploščo Arduino. to povezava je zelo preprosta, morate samo povezati naslednje:

  1. Vcc modula mora biti priključen na 5V izhod plošče Arduino.
  2. GND modula mora biti priključen na vtičnico GND na plošči Arduino.
  3. SCL modula mora biti priključen na enega od analognih vhodov plošče Arduino, kot je A5.
  4. SDA modula je treba povezati z drugim od analognih vhodov plošče Arduino, kot je A4.

Ko bodo vzpostavljene ustrezne povezave med ploščo MAX30102 in ploščo Arduino, bo naslednja stvar pisanje izvorne kode ali skice, da bo delovala, in začetek prejemanja biometričnih podatkov od zadevne osebe. To je tako enostavno kot pisanje naslednje kode Arduino IDE in programirajte ploščo:

Za uporabo morate v Arduino IDE namestiti tudi knjižnico. Knjižnico je razvil SparkFun in je na voljo na 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);
  }
}

Seveda lahko kodo spremenite glede na svoje potrebe, to je samo primer ...


Bodite prvi komentar

Pustite svoj komentar

Vaš e-naslov ne bo objavljen. Obvezna polja so označena z *

*

*

  1. Za podatke odgovoren: Miguel Ángel Gatón
  2. Namen podatkov: Nadzor neželene pošte, upravljanje komentarjev.
  3. Legitimacija: Vaše soglasje
  4. Sporočanje podatkov: Podatki se ne bodo posredovali tretjim osebam, razen po zakonski obveznosti.
  5. Shranjevanje podatkov: Zbirka podatkov, ki jo gosti Occentus Networks (EU)
  6. Pravice: Kadar koli lahko omejite, obnovite in izbrišete svoje podatke.