MAX30102: sykemittari ja oksimetrimoduuli Arduinolle

MAX30102

Koko tämän ajan olemme näyttäneet suuren määrän Elektroniset komponentit yhteensopiva levyt kuten Arduino tai yhteensopivia, sekä moniin muihin tekijöihin tai tee-se-itse-töihin. Nyt esittelemme sinulle moduulin MAX30102, joka sisältää anturin pulssin ja veren hapen mittaamiseen.

Tällä tavalla voit myös luoda puettavia esineitä, kuten itsetehtyjä aktiviteettirannekkeita tai tarvikkeita seurata terveydentilaa henkilön biometrisiä tietoja tai telemetriaa tarjoamalla tämän laitteen sykemittarin ja oksimetrin integroinnin ansiosta...

Mikä on sykemittari? Kuinka se toimii?

Un pulssianturi tai sykemittari Se on elektroninen laite, jolla mitataan henkilön syke reaaliajassa. Sitä käytetään pääasiassa urheilukentällä suorituskyvyn ja rasituksen seuraamiseen harjoittelun aikana tai päivittäin. Sykemittarit ovat suosittuja urheilijoiden keskuudessa, mutta ne ovat myös peruslaite lääketieteellisissä keskuksissa sykkeen, eli sykkeen tai lyöntien minuutissa:

  • PR Bpm: näyttää sykkeen, eli lyöntejä minuutissa.

Kaikissa tapauksissa Anturit tallentavat veren tilavuuden vaihtelua jokaisella sydämenlyönnillä. Tämä vaihtelu muunnetaan sähköiseksi signaaliksi, joka käsitellään sykkeen saamiseksi. Jotkut sykemittarit sisältävät myös vahvistus- ja melunvaimennuspiirit lukemien tarkkuuden parantamiseksi.

Mikä on oksimetri? Kuinka se toimii?

Un oksimetri on lääketieteellinen tai urheilulaite jota käytetään veren happisaturaation mittaamiseen. Tämä laite tarjoaa veren happisaturaatiotiedot arvoilla 0 - 100%. On tavallista, että samassa laitteessa on myös sykevaihtoehto, joka ilmaisee kaikki tiedot seurantaa tai tallennusta varten.

Los datos -jono mittaa oksimetriä on:

  • % SpO2: viittaa veren happisaturaatioprosenttiin.

Oksimetri on sijoitettu puristin tavoin siten, että se on mukautettu sormemme morfologiaan tai se voidaan sijoittaa myös muihin paikkoihin kehossa, kuten sykemittarin tapauksessa, kuten ranteeseen, kuten voidaan nähdä monissa aktiviteettirannekoruissa.

Oksimetrit lähettävät erilaista toimintaansa valon aallonpituudet jotka kulkevat ihon läpi. Tähän valoon vaikuttaa hemoglobiini, hapen kuljettamisesta vastaava veren molekyyli, joka absorboi erilaisia ​​valomääriä sen kuljettaman happitason mukaan. Yksityiskohtainen prosessi on seuraava:

  1. valon emissio- Oksimetri lähettää kaksi aallonpituutta valoa, yksi punainen ja yksi infrapuna, jotka kulkevat laitteeseen asetetun sormen läpi.
  2. Valon imeytyminen: Hemoglobiini, punasolujen molekyyli, joka kuljettaa happea, imee erilaisia ​​määriä näitä valoja. Happipitoisella hemoglobiinilla (oksihemoglobiinilla) ja hapettomalla hemoglobiinilla (deoksihemoglobiinilla) on erilaiset valon absorptioominaisuudet.
  3. Valon tunnistus: Valolähettimen vastakkaisella puolella oleva ilmaisin kerää sormen läpi kulkeneen valon.
  4. Happisaturaation laskeminen- Laite laskee oksihemoglobiinin suhteen läsnä olevan hemoglobiinin, sekä oksihemoglobiinin että deoksihemoglobiinin, kokonaismäärään. Tämä osuus esitetään veren happisaturaatioprosenttina (%SpO2). Tämä tapahtuu prosessorin kautta, joka pystyy tulkitsemaan nämä sähköiset signaalit ja muuttamaan ne numeerisiksi arvoiksi.

Mikä on MAX30102-moduuli?

Anturi MAX30102, valmistaja Maxim Integrated, on integroitu laite, joka yhdistää sykemittarin ja oksimetrin toiminnot. Tätä anturia voidaan helposti käyttää mikro-ohjaimen, kuten Arduino, kanssa. MAX30102 kuuluu tämän yrityksen MAX3010x-sarjaan.

Sen toiminta perustuu veren valon absorption vaihteluun sen mukaan happisaturaatiotaso ja pulssi kuten olen maininnut kahdessa edellisessä jaksossa. Tämä anturi on varustettu kahdella LEDillä, yhdellä punaisella ja yhdellä infrapunalla. Se asetetaan iholle, kuten sormeen tai ranteeseen, ja se havaitsee heijastuneen valon määrittääkseen happisaturaatioasteen.

Yhteydenpito MAX30102:n kanssa suoritetaan I2C-väylän kautta, mikä helpottaa yhteyden muodostamista mikro-ohjaimeen, kuten Arduinoon. MAX30102 tarvitsee kaksinkertaisen virtalähteen: 1.8 V logiikkaa ja 3.3 V LEDejä varten. Tavallisesti löytyy 5V-moduuleista, jotka sisältävät jo tarvittavan tasovastaavuuden.

MAX30102 on koti- tai urheiluprojekteissa käytettävä anturi, eli sen luotettavuus ja herkkyys ei välttämättä ole riittävää ammattimaiseen lääketieteelliseen käyttöön.

La optinen pulssioksimetria Se on ei-invasiivinen menetelmä veren happisaturaatioprosentin määrittämiseksi. Kuten aiemmin mainitsin, se perustuu hemoglobiinin (Hb) ja oksihemoglobiinin (HbO2) valon absorptiokertoimien eroihin eri aallonpituuksilla. Happirikas veri absorboi enemmän infrapunavaloa, kun taas vähän happipitoinen veri absorboi enemmän punaista valoa. Kehon alueilla, joilla iho on tarpeeksi ohut ja sen alla on verisuonia, tätä eroa voidaan käyttää happisaturaatioasteen määrittämiseen.

Pulssi- ​​ja veren happianturilla varustetun MAX30102-moduulin ominaisuudet

MAX30102 sisältää:

  • 2x LEDiä, yksi punainen (660nm) ja yksi infrapuna (880nm)
  • 2x valodiodia heijastuneen valon mittaamiseen
  • 18-bittinen ADC-muunnin, jonka näytteenottotaajuus on 50-3200 näytettä sekunnissa.
  • Lisäksi siinä on tarvittava elektroniikka signaalin vahvistamiseen ja suodattamiseen, ympäristön valon vaimentamiseen, 50-60 Hz:n taajuuksien (keinovalo) hylkäämiseen ja lämpötilan kompensointiin.

Moduulin kulutus voi saavuttaa jopa 50mA mittauksen aikana, vaikka intensiteettiä voidaan säätää ohjelmallisesti, alhaisen tehon tilalla 0.7 µA mittausten aikana.

Hinta ja mistä ostaa

MAX30102-anturit pulssin ja veren hapen mittaamiseen ne ovat melko halpoja. Nämä moduulit voivat olla sinun muutamalla eurolla sellaisilla sivustoilla kuin eBay, Aliexpress tai Amazon. Huomaat, että tyyppejä on useita, ja suosittelemme seuraavaa:

Yhteydet ja esimerkki Arduinon kanssa

Arduino IDE, tietotyypit, ohjelmointi

Testaaksesi MAX30102:ta Arduinon kanssa, ensimmäinen asia on liittää tämä moduuli Arduino-korttiin. Tämä yhteys on hyvin yksinkertainen, sinun tarvitsee vain liittää seuraavat:

  1. Moduulin Vcc on kytkettävä Arduino-kortin 5V lähtöön.
  2. Moduulin GND on kytkettävä Arduino-kortin GND-liitäntään.
  3. Moduulin SCL on kytkettävä johonkin Arduino-kortin analogisiin tuloihin, kuten A5.
  4. Moduulin SDA on kytkettävä toiseen Arduino-levyn analogiseen tuloon, kuten A4.

Kun sopivat yhteydet on muodostettu MAX30102-kortin ja Arduino-levyn välille, seuraavaksi kirjoitetaan lähdekoodi tai luonnos, jotta se toimisi ja aloitetaan biometristen tietojen vastaanottaminen kyseiseltä henkilöltä. Tämä on yhtä helppoa kuin seuraavan koodin kirjoittaminen Arduino IDE ja ohjelmoi taulu:

Sinun on myös asennettava kirjasto Arduino IDE:hen käyttääksesi sitä. Kirjaston on kehittänyt SparkFun, ja se on saatavilla osoitteessa 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);
  }
}

Tietysti voit muokata koodia tarpeidesi mukaan, tämä on vain esimerkki...


Ole ensimmäinen kommentti

Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.