MAX30102: modul monitora srdcového tepu a oxymetra pre Arduino

MAX30102

Za celý ten čas sme ukázali veľké množstvo Elektronické komponenty kompatibilný s dosky ako Arduino alebo kompatibilné, ako aj pri mnohých iných tvorivých alebo domácich prácach. Teraz vám predstavíme modul MAX30102, ktorá obsahuje senzor na meranie pulzu a kyslíka v krvi.

Týmto spôsobom môžete vytvárať aj nositeľné zariadenia, ako sú náramky na aktivity alebo hardvér pre vlastné použitie sledovať zdravotný stav osoby, poskytujúce biometrické údaje alebo telemetriu uvedenej osoby vďaka integrácii pulzomera a oxymetra v tomto zariadení...

Čo je monitor srdcovej frekvencie? Ako to funguje?

Un snímač pulzu alebo monitor srdcového tepu Ide o elektronické zariadenie používané na meranie srdcového tepu človeka v reálnom čase. Používa sa najmä v športovej oblasti na sledovanie výkonu a námahy počas tréningu alebo na dennej báze. Monitory srdcovej frekvencie sú obľúbené medzi športovcami, ale sú tiež základným zariadením v lekárskych centrách na zistenie srdcovej frekvencie, teda srdcovej frekvencie alebo úderov za minútu:

  • PR Bpm: zobrazuje srdcovú frekvenciu, teda počet úderov za minútu.

Vo všetkých prípadoch, Senzory zachytávajú zmeny v objeme krvi pri každom údere srdca. Táto zmena sa prevedie na elektrický signál, ktorý sa spracuje na získanie srdcovej frekvencie. Niektoré monitory srdcovej frekvencie obsahujú aj obvody na zosilnenie a potlačenie hluku na zlepšenie presnosti nameraných hodnôt.

Čo je oxymeter? Ako to funguje?

Un oxymeter je lekárske alebo športové zariadenie ktorý sa používa na meranie saturácie krvi kyslíkom. Tento prístroj ponúka údaje o saturácii krvi kyslíkom s hodnotami od 0 do 100%. Je bežné, že rovnaké zariadenie obsahuje aj možnosť srdcovej frekvencie, ktorá označuje všetky informácie na sledovanie alebo nahrávanie.

Údaje, ktoré meria oxymeter Je to:

  • %SpO2: označuje percento nasýtenia krvi kyslíkom.

Oxymeter sa umiestňuje ako svorka tak, že sa prispôsobí morfológii nášho prsta alebo sa dá umiestniť aj na iné miesta na tele, ako je to v prípade pulzomera, ako je zápästie, napr. možno vidieť v mnohých náramkoch na aktivity.,

Pokiaľ ide o ich fungovanie, oxymetre vyžarujú rôzne vlnové dĺžky svetla ktoré prechádzajú cez kožu. To, čo pôsobí na toto svetlo, je hemoglobín, molekula krvi zodpovedná za transport kyslíka, ktorá absorbuje rôzne množstvá svetla v závislosti od hladiny kyslíka, ktoré transportuje. Podrobný postup je nasledujúci:

  1. vyžarovanie svetla- Oxymeter vyžaruje dve vlnové dĺžky svetla, jednu červenú a jednu infračervenú, ktoré prechádzajú cez prst umiestnený na zariadení.
  2. Absorpcia svetla: Hemoglobín, molekula v červených krvinkách, ktorá prenáša kyslík, absorbuje rôzne množstvá týchto svetiel. Hemoglobín zaťažený kyslíkom (oxyhemoglobín) a hemoglobín bez kyslíka (deoxyhemoglobín) majú odlišné vlastnosti absorpcie svetla.
  3. Detekcia svetla: Detektor na opačnej strane žiariča zbiera svetlo, ktoré prešlo prstom.
  4. Výpočet nasýtenia kyslíkom- Prístroj vypočíta pomer oxyhemoglobínu k celkovému množstvu prítomného hemoglobínu, oxyhemoglobínu aj deoxyhemoglobínu. Tento podiel je prezentovaný ako percento nasýtenia krvi kyslíkom (%SpO2). To sa deje pomocou procesora schopného interpretovať tieto elektrické signály a previesť ich na číselnú hodnotu.

Čo je modul MAX30102?

Senzor MAX30102, vyrába Maxim Integrated, je integrované zariadenie, ktoré kombinuje funkcie monitora srdcovej frekvencie a oxymetra. Tento senzor možno ľahko použiť s mikrokontrolérom, ako je Arduino. MAX30102 patrí do série optických snímačov MAX3010x od tejto firmy.

Jeho činnosť je založená na kolísaní absorpcie svetla krvou v závislosti od jej úroveň saturácie kyslíkom a pulz ako som už spomenul v dvoch predchádzajúcich častiach. Tento senzor je vybavený dvomi LED diódami, jednou červenou a jednou infračervenou. Umiestňuje sa na kožu, napríklad na prst alebo zápästie, a detekuje odrazené svetlo, aby určil stupeň nasýtenia kyslíkom.

Prebieha komunikácia s MAX30102 cez zbernicu I2C, čo uľahčuje pripojenie k mikrokontroléru, akým je napríklad Arduino. MAX30102 potrebuje dvojité napájanie: 1.8 V pre logiku a 3.3 V pre LED. Zvyčajne sa vyskytuje na 5V moduloch, ktoré už obsahujú potrebné prispôsobenie úrovne.

MAX30102 je snímač používaný v domácich alebo športových projektoch, to znamená, že nemusí mať dostatočnú spoľahlivosť a citlivosť na profesionálne lekárske použitie.

La optická pulzná oxymetria Je to neinvazívna metóda na stanovenie percenta nasýtenia krvi kyslíkom. Ako som už spomínal, vychádza z rozdielu koeficientov absorpcie svetla hemoglobínu (Hb) a oxyhemoglobínu (HbO2) pre rôzne vlnové dĺžky. Krv bohatá na kyslík absorbuje viac infračerveného svetla, zatiaľ čo krv s nízkym obsahom kyslíka absorbuje viac červeného svetla. V oblastiach tela, kde je koža dostatočne tenká a pod ňou sú krvné cievy, možno tento rozdiel použiť na určenie stupňa nasýtenia kyslíkom.

Vlastnosti modulu MAX30102 s pulzným a krvným kyslíkovým senzorom

MAX30102 obsahuje:

  • 2x LED, jedna červená (660nm) a jedna infračervená (880nm)
  • 2x fotodiódy na meranie odrazeného svetla
  • 18-bitový ADC prevodník so vzorkovacou rýchlosťou 50 až 3200 vzoriek za sekundu.
  • Okrem toho má potrebnú elektroniku na zosilnenie a filtrovanie signálu, zrušenie okolitého svetla, potlačenie frekvencií 50-60Hz (umelé svetlo) a teplotnú kompenzáciu.

Spotreba modulu môže dosiahnuť až 50 mA počas merania, hoci intenzitu je možné nastaviť programovo, s režimom nízkej spotreby 0.7 µA počas meraní.

Cena a kde kúpiť

Senzory MAX30102 na meranie pulzu a kyslíka v krvi sú dosť lacné. Tieto moduly môžu byť vaše len za pár eur na stránkach ako eBay, Aliexpress alebo Amazon. Uvidíte, že existuje niekoľko typov a my odporúčame nasledovné:

Pripojenia a príklad s Arduinom

Arduino IDE, dátové typy, programovanie

Ak chcete otestovať MAX30102 s Arduino, prvá vec je pripojiť tento modul k doske Arduino. Toto pripojenie je veľmi jednoduché, stačí pripojiť nasledovné:

  1. Vcc modulu musí byť pripojený k 5V výstupu dosky Arduino.
  2. GND modulu musí byť pripojené k GND pätici dosky Arduino.
  3. SCL modulu musí byť pripojený k jednému z analógových vstupov dosky Arduino, ako je napríklad A5.
  4. SDA modulu musí byť pripojený k inému z analógových vstupov dosky Arduino, ako je napríklad A4.

Po vytvorení vhodných spojení medzi doskou MAX30102 a doskou Arduino bude ďalšou vecou napísať zdrojový kód alebo náčrt, aby to fungovalo a začať prijímať biometrické údaje od príslušnej osoby. Je to také jednoduché, ako napísať nasledujúci kód Arduino IDE a naprogramujte dosku:

Ak ju chcete používať, musíte si do Arduino IDE nainštalovať knižnicu. Knižnicu vyvinula spoločnosť SparkFun a je dostupná na adrese 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);
  }
}

Kód si samozrejme môžete upraviť podľa svojich potrieb, toto je len príklad...


Buďte prvý komentár

Zanechajte svoj komentár

Vaša e-mailová adresa nebude zverejnená. Povinné položky sú označené *

*

*

  1. Zodpovedný za údaje: Miguel Ángel Gatón
  2. Účel údajov: Kontrolný SPAM, správa komentárov.
  3. Legitimácia: Váš súhlas
  4. Oznamovanie údajov: Údaje nebudú poskytnuté tretím stranám, iba ak to vyplýva zo zákona.
  5. Ukladanie dát: Databáza hostená spoločnosťou Occentus Networks (EU)
  6. Práva: Svoje údaje môžete kedykoľvek obmedziť, obnoviť a vymazať.