MAX30102: širdies ritmo monitorius ir oksimetro modulis, skirtas Arduino

MAX30102

Per visą šį laiką parodėme daugybę Elektroniniai komponentai suderinama su tokios plokštės kaip Arduino arba suderinamos, taip pat daugeliui kitų gamintojų ar „pasidaryk pats“ darbų. Dabar supažindinsime jus su moduliu MAX30102, kuriame yra jutiklis pulsui ir kraujo deguoniui matuoti.

Tokiu būdu taip pat galite sukurti nešiojamų daiktų, pvz., pačių pasigamintų veiklos apyrankių ar aparatinę įrangą stebėti sveikatos būklę asmens, teikiančio minėto asmens biometrinius ar telemetrijos duomenis, nes šiame įrenginyje yra integruotas širdies ritmo monitorius ir oksimetras...

Kas yra širdies ritmo monitorius? Kaip tai veikia?

Un pulso jutiklis arba širdies ritmo monitorius Tai elektroninis prietaisas, naudojamas žmogaus širdies ritmui matuoti realiu laiku. Jis daugiausia naudojamas sporto srityje, norint stebėti našumą ir pastangas treniruočių metu arba kasdien. Širdies ritmo monitoriai yra populiarūs tarp sportininkų, tačiau jie taip pat yra pagrindinis prietaisas medicinos centruose, norint sužinoti širdies susitraukimų dažnį, ty širdies susitraukimų dažnį arba dūžius per minutę:

  • PR Bpm: rodo širdies susitraukimų dažnį, ty dūžių skaičių per minutę.

Visais atvejais, Jutikliai fiksuoja kraujo tūrio pokyčius su kiekvienu širdies plakimu. Šis pokytis paverčiamas elektriniu signalu, kuris apdorojamas širdies ritmui gauti. Kai kurie širdies ritmo monitoriai taip pat turi stiprinimo ir triukšmo slopinimo grandines, kad pagerintų rodmenų tikslumą.

Kas yra oksimetras? Kaip tai veikia?

Un oksimetras yra medicinos ar sporto prietaisas kuris naudojamas kraujo prisotinimui deguonimi matuoti. Šis prietaisas pateikia kraujo prisotinimo deguonimi duomenis, kurių reikšmės yra nuo 0 iki 100%. Įprasta, kad tame pačiame įrenginyje yra ir širdies ritmo parinktis, nurodanti visą stebėjimo ar įrašymo informaciją.

Los datos eilė matuoja oksimetrą yra:

  • %SpO2: nurodo deguonies prisotinimo kraujyje procentą.

Oksimetras dedamas kaip spaustukas taip, kad būtų pritaikytas mūsų piršto morfologijai arba galėtų būti dedamas ir kitose kūno vietose, kaip yra širdies ritmo monitoriaus atveju, pavyzdžiui, ant riešo, pvz. galima pamatyti daugelyje veiklos apyrankių.

Kalbant apie jų veikimą, oksimetrai skleidžia skirtingus šviesos bangos ilgiai kurie praeina per odą. Šią šviesą veikia hemoglobinas – kraujo molekulė, atsakinga už deguonies pernešimą, sugerianti skirtingą šviesos kiekį, priklausomai nuo pernešamo deguonies lygio. Išsamus procesas yra toks:

  1. šviesos emisija- Oksimetras skleidžia dviejų bangų ilgių šviesą, vieną raudoną ir vieną infraraudonųjų spindulių, kurios praeina per pirštą, uždėtą ant prietaiso.
  2. Šviesos absorbcija: Hemoglobinas, raudonųjų kraujo kūnelių molekulė, pernešanti deguonį, sugeria skirtingą šių šviesų kiekį. Deguonies pripildytas hemoglobinas (oksihemoglobinas) ir hemoglobinas be deguonies (deoksihemoglobinas) turi skirtingas šviesos sugerties savybes.
  3. Šviesos aptikimas: Detektorius, esantis priešingoje šviesos skleidėjo pusėje, surenka šviesą, pratekusią per pirštą.
  4. Deguonies prisotinimo skaičiavimas- Prietaisas apskaičiuoja oksihemoglobino santykį su visu esamu hemoglobino kiekiu, tiek oksihemoglobinu, tiek deoksihemoglobinu. Ši proporcija pateikiama kaip kraujo prisotinimo deguonimi procentinė dalis (%SpO2). Tai atliekama naudojant procesorių, galintį interpretuoti šiuos elektrinius signalus ir paversti juos skaitine verte.

Kas yra MAX30102 modulis?

Jutiklis MAX30102, gamintojas Maxim Integrated, yra integruotas prietaisas, apjungiantis širdies ritmo monitoriaus ir oksimetro funkcijas. Šis jutiklis gali būti lengvai naudojamas su mikrovaldikliu, pvz., Arduino. MAX30102 priklauso šios firmos MAX3010x optinių jutiklių serijai.

Jo veikimas pagrįstas šviesos sugerties kraujyje svyravimais, priklausomai nuo jo deguonies prisotinimo lygis ir pulsas kaip minėjau dviejuose ankstesniuose skyriuose. Šis jutiklis turi du šviesos diodus, vieną raudoną ir vieną infraraudonųjų spindulių. Jis dedamas ant odos, pavyzdžiui, ant piršto ar riešo, ir aptinka atspindėtą šviesą, kad nustatytų deguonies prisotinimo laipsnį.

Vykdomas ryšys su MAX30102 per I2C magistralę, todėl lengva prisijungti prie mikrovaldiklio, pvz., Arduino. MAX30102 reikia dvigubo maitinimo šaltinio: 1.8 V logikai ir 3.3 V šviesos diodams. Paprastai randama 5 V moduliuose, kuriuose jau yra būtinas lygio suderinimas.

MAX30102 yra jutiklis, naudojamas namų ar sporto projektuose, tai yra, jis gali nepasižymėti pakankamu patikimumu ir jautrumu profesionaliam medicinos naudojimui.

La optinė pulso oksimetrija Tai neinvazinis metodas, leidžiantis nustatyti deguonies prisotinimo procentą kraujyje. Kaip jau minėjau anksčiau, jis pagrįstas hemoglobino (Hb) ir oksihemoglobino (HbO2) šviesos sugerties koeficientų skirtumu skirtingiems bangos ilgiams. Kraujas, kuriame gausu deguonies, sugeria daugiau infraraudonųjų spindulių, o mažai deguonies turintis kraujas sugeria daugiau raudonos šviesos. Kūno vietose, kur oda pakankamai plona ir po ja yra kraujagyslės, pagal šį skirtumą galima nustatyti deguonies prisotinimo laipsnį.

Modulio MAX30102 su pulso ir kraujo deguonies jutikliu savybės

MAX30102 apima:

  • 2x šviesos diodai, vienas raudonas (660 nm) ir vienas infraraudonasis (880 nm)
  • 2x fotodiodai atspindėtai šviesai matuoti
  • 18 bitų ADC keitiklis, kurio diskretizavimo dažnis yra nuo 50 iki 3200 mėginių per sekundę.
  • Be to, jame yra reikalinga elektronika signalo stiprinimui ir filtravimui, aplinkos šviesos panaikinimui, 50-60Hz dažnių (dirbtinės šviesos) atmetimui ir temperatūros kompensavimui.

Modulio suvartojimas gali siekti iki 50mA matavimo metu, nors intensyvumą galima reguliuoti programiškai, naudojant mažos galios režimą 0.7 µA matavimų metu.

Kaina ir kur nusipirkti

MAX30102 jutikliai pulsui ir kraujo deguoniui matuoti jie yra gana pigūs. Šie moduliai gali būti jūsų vos už kelis eurus tokiose svetainėse kaip „eBay“, „Aliexpress“ ar „Amazon“. Pamatysite, kad yra keletas tipų, todėl rekomenduojame:

Ryšiai ir pavyzdys su Arduino

Arduino IDE, duomenų tipai, programavimas

Norint išbandyti MAX30102 su Arduino, pirmas dalykas yra prijungti šį modulį prie Arduino plokštės. Tai ryšys yra labai paprastas, tereikia prijungti šiuos dalykus:

  1. Modulio Vcc turi būti prijungtas prie Arduino plokštės 5V išvesties.
  2. Modulio GND turi būti prijungtas prie Arduino plokštės GND lizdo.
  3. Modulio SCL turi būti prijungtas prie vieno iš analoginių Arduino plokštės įėjimų, pvz., A5.
  4. Modulio SDA turi būti prijungtas prie kitų Arduino plokštės analoginių įėjimų, tokių kaip A4.

Kai bus sukurti atitinkami ryšiai tarp MAX30102 plokštės ir Arduino plokštės, kitas dalykas bus parašyti šaltinio kodą arba eskizą, kad jis veiktų, ir pradėti gauti biometrinius duomenis iš atitinkamo asmens. Tai taip paprasta, kaip įrašyti šį kodą „Arduino IDE“ ir užprogramuokite lentą:

Taip pat turite įdiegti biblioteką Arduino IDE, kad galėtumėte ją naudoti. Biblioteką sukūrė „SparkFun“ ir ją galima rasti adresu 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);
  }
}

Žinoma, kodą galite modifikuoti pagal savo poreikius, tai tik pavyzdys...


Būkite pirmas, kuris pakomentuos

Palikite komentarą

Jūsų elektroninio pašto adresas nebus skelbiamas. Privalomi laukai yra pažymėti *

*

*

  1. Atsakingas už duomenis: Miguel Ángel Gatón
  2. Duomenų paskirtis: kontroliuoti šlamštą, komentarų valdymą.
  3. Įteisinimas: jūsų sutikimas
  4. Duomenų perdavimas: Duomenys nebus perduoti trečiosioms šalims, išskyrus teisinius įsipareigojimus.
  5. Duomenų saugojimas: „Occentus Networks“ (ES) talpinama duomenų bazė
  6. Teisės: bet kuriuo metu galite apriboti, atkurti ir ištrinti savo informaciją.