MAX30102: monitor otkucaja srca i modul oksimetra za Arduino

MAX30102

Za sve ovo vrijeme prikazali smo veliki broj Elektroničke komponente kompatibilan sa ploče poput Arduino ili kompatibilne, kao i za mnoge druge tvorničke ili DIY poslove. Sada ćemo vas upoznati sa modulom MAX30102, koji uključuje senzor za mjerenje pulsa i kisika u krvi.

Na ovaj način možete kreirati i nosive predmete kao što su narukvice za aktivnosti koje ste sami napravili ili hardver za pratiti zdravstveno stanje osobe, pružajući biometrijske podatke ili telemetriju te osobe zahvaljujući integraciji monitora otkucaja srca i oksimetra u ovaj uređaj...

Šta je monitor otkucaja srca? Kako to radi?

Un senzor pulsa ili monitor otkucaja srca To je elektronski uređaj koji se koristi za mjerenje srčanog ritma osobe u realnom vremenu. Uglavnom se koristi u sportskom polju za praćenje performansi i napora tokom treninga ili na dnevnoj bazi. Mjerači otkucaja srca popularni su među sportistima, ali su i osnovni uređaj u medicinskim centrima za praćenje otkucaja srca, odnosno otkucaja srca ili otkucaja u minuti:

  • PR Bpm: prikazuje broj otkucaja srca, odnosno otkucaje u minuti.

U svim slučajevima, Senzori bilježe varijacije u volumenu krvi sa svakim otkucajem srca. Ova varijacija se prevodi u električni signal koji se obrađuje kako bi se dobio broj otkucaja srca. Neki monitori otkucaja srca takođe uključuju kola za pojačavanje i poništavanje buke kako bi se poboljšala tačnost očitavanja.

Šta je oksimetar? Kako to radi?

Un oksimetar je medicinski ili sportski uređaj koji se koristi za mjerenje saturacije kisika u krvi. Ovaj uređaj nudi podatke o zasićenosti krvi kiseonikom sa vrednostima od 0 do 100%. Uobičajeno je da isti uređaj uključuje i opciju otkucaja srca, što ukazuje na sve informacije za praćenje ili snimanje.

Podaci koji mjeri oksimetar je:

  • %SpO2: odnosi se na postotak zasićenosti kisikom u krvi.

Oksimetar se postavlja kao stezaljka na način da je prilagođen morfologiji našeg prsta ili se može postaviti i na druga mjesta na tijelu, kao što je slučaj sa mjeračem otkucaja srca, kao što je ručni zglob, npr. može se vidjeti u mnogim aktivnostima narukvicama. ,

Što se tiče rada, oksimetri emituju drugačije talasne dužine svetlosti koji prolaze kroz kožu. Ono što djeluje na ovo svjetlo je hemoglobin, molekul krvi odgovoran za transport kisika, apsorbirajući različite količine svjetlosti u zavisnosti od nivoa kiseonika koji prenosi. Detaljan proces je kako slijedi:

  1. emisija svetlosti- Oksimetar emituje dve talasne dužine svetlosti, jednu crvenu i jednu infracrvenu, koje prolaze kroz prst postavljen na uređaj.
  2. Apsorpcija svjetlosti: Hemoglobin, molekul u crvenim krvnim zrncima koji prenosi kiseonik, apsorbuje različite količine ove svetlosti. Hemoglobin opterećen kiseonikom (oksihemoglobin) i hemoglobin bez kiseonika (deoksihemoglobin) imaju različita svojstva apsorpcije svetlosti.
  3. Detekcija svjetla: Detektor na suprotnoj strani emitera svjetlosti prikuplja svjetlost koja je prošla kroz prst.
  4. Proračun zasićenja kisikom- Uređaj izračunava odnos oksihemoglobina prema ukupnoj količini prisutnog hemoglobina, i oksihemoglobina i deoksihemoglobina. Ovaj udio je predstavljen kao postotak zasićenosti krvi kisikom (%SpO2). Ovo se radi preko procesora sposobnog da interpretira ove električne signale kako bi ih preveo u numeričku vrijednost.

Šta je MAX30102 modul?

Senzor MAX30102, proizvođača Maxim Integrated, je integrisani uređaj koji kombinuje funkcije monitora otkucaja srca i oksimetra. Ovaj senzor se lako može koristiti sa mikrokontrolerom kao što je Arduino. MAX30102 pripada MAX3010x seriji optičkih senzora ove firme.

Njegov rad se zasniva na varijaciji apsorpcije svjetlosti u krvi, ovisno o tome nivo zasićenosti kiseonikom i puls kao što sam spomenuo u prethodna dva odeljka. Ovaj senzor je opremljen sa dvije LED diode, jednom crvenom i jednom infracrvenom. Postavlja se na kožu, poput prsta ili ručnog zgloba, i detektuje reflektovanu svjetlost kako bi odredio stupanj zasićenosti kisikom.

Komunikacija sa MAX30102 se obavlja preko I2C sabirnice, što olakšava povezivanje s mikrokontrolerom kao što je Arduino. MAX30102 treba dvostruko napajanje: 1.8 V za logiku i 3.3 V za LED diode. Obično se nalazi na 5V modulima koji već uključuju potrebno usklađivanje nivoa.

MAX30102 je senzor koji se koristi u kućnim ili sportskim projektima, odnosno možda neće imati dovoljnu pouzdanost i osjetljivost za profesionalnu medicinsku upotrebu.

La optička pulsna oksimetrija To je neinvazivna metoda za određivanje postotka zasićenosti kisikom u krvi. Kao što sam ranije spomenuo, zasniva se na razlici u koeficijentima apsorpcije svjetlosti hemoglobina (Hb) i oksihemoglobina (HbO2) za različite talasne dužine. Krv bogata kiseonikom apsorbuje više infracrvene svetlosti, dok krv sa malo kiseonika apsorbuje više crvene svetlosti. U dijelovima tijela gdje je koža dovoljno tanka, a ispod se nalaze krvni sudovi, ova razlika se može koristiti za određivanje stepena zasićenosti kiseonikom.

Karakteristike MAX30102 modula sa senzorom za puls i kiseonik u krvi

MAX30102 uključuje:

  • 2x LED diode, jedna crvena (660nm) i jedna infracrvena (880nm)
  • 2x fotodiode za mjerenje reflektirane svjetlosti
  • 18-bitni ADC pretvarač sa brzinom uzorkovanja od 50 do 3200 uzoraka u sekundi.
  • Osim toga, posjeduje neophodnu elektroniku za pojačanje i filtriranje signala, poništavanje ambijentalnog svjetla, odbijanje frekvencija od 50-60Hz (vještačko svjetlo) i temperaturnu kompenzaciju.

Potrošnja modula može doseći do 50mA tokom merenja, iako se intenzitet može programski podesiti, sa režimom male snage od 0.7µA tokom merenja.

Cijena i gdje kupiti

MAX30102 senzori za mjerenje pulsa i kiseonika u krvi prilično su jeftini. Ovi moduli mogu biti vaši za samo nekoliko eura na stranicama kao što su eBay, Aliexpress ili Amazon. Vidjet ćete da postoji nekoliko vrsta, a mi preporučujemo sljedeće:

Veze i primjer sa Arduinom

Arduino IDE, tipovi podataka, programiranje

Za testiranje MAX30102 sa Arduinom, prva stvar je da spojite ovaj modul na Arduino ploču. Ovo veza je vrlo jednostavna, samo trebate povezati sljedeće:

  1. Vcc modula mora biti spojen na 5V izlaz Arduino ploče.
  2. GND modula mora biti spojen na GND utičnicu Arduino ploče.
  3. SCL modula mora biti spojen na jedan od analognih ulaza Arduino ploče, kao što je A5.
  4. SDA modula mora biti spojen na drugi analogni ulaz Arduino ploče, kao što je A4.

Nakon što se uspostave odgovarajuće veze između MAX30102 ploče i Arduino ploče, sljedeća stvar će biti pisanje izvornog koda ili skice kako bi to funkcioniralo i početak primanja biometrijskih podataka od osobe o kojoj je riječ. Ovo je jednostavno kao pisanje sljedećeg koda Arduino IDE i programirajte ploču:

Također morate instalirati biblioteku u Arduino IDE da biste je koristili. Biblioteku je razvio SparkFun, a dostupna je na adresi 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);
  }
}

Naravno, možete modificirati kod prema vašim potrebama, ovo je samo primjer...


Budite prvi koji komentarišete

Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.