MAX30102: sirdsdarbības monitors un oksimetra modulis priekš Arduino

MAX30102

Pa visu šo laiku esam parādījuši lielu skaitu Elektroniskās sastāvdaļas savietojams ar dēļi, piemēram, Arduino vai saderīgi, kā arī daudziem citiem maker vai DIY darbiem. Tagad mēs jūs iepazīstināsim ar moduli MAX30102, kas ietver sensoru pulsa un asins skābekļa mērīšanai.

Tādā veidā jūs varat arī izveidot valkājamas preces, piemēram, pašdarinātas aktivitāšu aproces vai aparatūru uzraudzīt veselības stāvokli personas, kas nodrošina minētās personas biometriskos datus vai telemetriju, pateicoties pulsometra un oksimetra integrācijai šajā ierīcē...

Kas ir sirdsdarbības monitors? Kā tas darbojas?

Un pulsa sensors vai pulsometrs Tā ir elektroniska ierīce, ko izmanto, lai mērītu cilvēka sirdsdarbības ātrumu reāllaikā. To galvenokārt izmanto sporta jomā, lai uzraudzītu veiktspēju un piepūli treniņa laikā vai ikdienā. Pulsometri ir populāri sportistu vidū, taču tie ir arī fundamentāla ierīce medicīnas centros, lai uzzinātu sirdsdarbības ātrumu, tas ir, sirdsdarbības ātrumu vai sitienus minūtē:

  • PR Bpm: parāda sirdsdarbības ātrumu, tas ir, sitienus minūtē.

Visos gadījumos, Sensori fiksē asins tilpuma izmaiņas ar katru sirdspukstu. Šī variācija tiek pārvērsta elektriskā signālā, kas tiek apstrādāts, lai iegūtu sirdsdarbības ātrumu. Dažos pulsometros ir iekļautas arī pastiprināšanas un trokšņu slāpēšanas shēmas, lai uzlabotu rādījumu precizitāti.

Kas ir oksimetrs? Kā tas darbojas?

Un oksimetrs ir medicīnas vai sporta ierīce ko izmanto skābekļa piesātinājuma mērīšanai asinīs. Šī ierīce piedāvā datus par asins piesātinājumu ar skābekli ar vērtībām no 0 līdz 100%. Ir ierasts, ka tajā pašā ierīcē ir iekļauta arī pulsa opcija, norādot visu informāciju, kas nepieciešama uzraudzībai vai ierakstīšanai.

Los datos rindā mēra oksimetru ir:

  • %SpO2: attiecas uz skābekļa piesātinājuma procentuālo daudzumu asinīs.

Oksimetrs ir novietots kā skava tā, lai tas būtu pielāgots mūsu pirksta morfoloģijai vai to varētu novietot arī citās ķermeņa vietās, kā tas ir pulsometra gadījumā, piemēram, plaukstas locītavā, kā var redzēt daudzās aktivitāšu rokassprādzēs. ,

Attiecībā uz to darbību oksimetri izstaro atšķirīgi gaismas viļņu garumi kas iziet cauri ādai. Tas, kas iedarbojas uz šo gaismu, ir hemoglobīns, asins molekula, kas ir atbildīga par skābekļa transportēšanu, absorbējot dažādus gaismas daudzumus atkarībā no tā transportētā skābekļa līmeņa. Detalizēts process ir šāds:

  1. gaismas emisija- Oksimetrs izstaro divus gaismas viļņu garumus, vienu sarkano un otru infrasarkano, kas iziet cauri uz ierīces novietotajam pirkstam.
  2. Gaismas absorbcija: Hemoglobīns, sarkano asins šūnu molekula, kas nes skābekli, absorbē dažādu daudzumu šo gaismu. Ar skābekli piesātinātam hemoglobīnam (oksihemoglobīnam) un hemoglobīnam bez skābekļa (deoksihemoglobīnam) ir atšķirīgas gaismas absorbcijas īpašības.
  3. Gaismas noteikšana: Detektors gaismas emitētāja pretējā pusē savāc gaismu, kas izgājusi caur pirkstu.
  4. Skābekļa piesātinājuma aprēķins- Ierīce aprēķina oksihemoglobīna attiecību pret kopējo esošo hemoglobīna daudzumu, gan oksihemoglobīnu, gan deoksihemoglobīnu. Šī proporcija tiek parādīta kā asins skābekļa piesātinājuma procents (%SpO2). Tas tiek darīts, izmantojot procesoru, kas spēj interpretēt šos elektriskos signālus, lai pārvērstu tos skaitliskās vērtībās.

Kas ir MAX30102 modulis?

Sensors MAX30102, ražo Maxim Integrated, ir integrēta ierīce, kas apvieno sirdsdarbības monitora un oksimetra funkcijas. Šo sensoru var viegli izmantot ar mikrokontrolleri, piemēram, Arduino. MAX30102 pieder šīs firmas MAX3010x optisko sensoru sērijai.

Tās darbība balstās uz gaismas absorbcijas izmaiņām asinīs atkarībā no tā skābekļa piesātinājuma līmenis un pulss kā jau minēju divās iepriekšējās sadaļās. Šis sensors ir aprīkots ar divām gaismas diodēm, vienu sarkanu un otru infrasarkano. To novieto uz ādas, piemēram, uz pirksta vai plaukstas locītavas, un nosaka atstaroto gaismu, lai noteiktu skābekļa piesātinājuma pakāpi.

Tiek veikta saziņa ar MAX30102 caur I2C autobusu, atvieglojot savienojumu ar mikrokontrolleru, piemēram, Arduino. MAX30102 ir nepieciešams dubults barošanas avots: 1.8 V loģikai un 3.3 V gaismas diodēm. Parasti atrodams 5 V moduļos, kuros jau ir ietverta nepieciešamā līmeņa saskaņošana.

MAX30102 ir sensors, ko izmanto mājas vai sporta projektos, tas ir, tas var nebūt pietiekami uzticams un jutīgs profesionālai medicīniskai lietošanai.

La optiskā pulsa oksimetrija Tā ir neinvazīva metode, lai noteiktu skābekļa piesātinājuma procentuālo daudzumu asinīs. Kā jau minēju iepriekš, tas ir balstīts uz hemoglobīna (Hb) un oksihemoglobīna (HbO2) gaismas absorbcijas koeficientu atšķirībām dažādiem viļņu garumiem. Ar skābekli bagātas asinis absorbē vairāk infrasarkanās gaismas, savukārt asinis ar zemu skābekļa saturu absorbē vairāk sarkanās gaismas. Ķermeņa zonās, kur āda ir pietiekami plāna un zem tās atrodas asinsvadi, šo atšķirību var izmantot, lai noteiktu skābekļa piesātinājuma pakāpi.

Moduļa MAX30102 īpašības ar pulsa un asins skābekļa sensoru

MAX30102 ietver:

  • 2x gaismas diodes, viena sarkana (660nm) un viena infrasarkanā (880nm)
  • 2x fotodiodes atstarotās gaismas mērīšanai
  • 18 bitu ADC pārveidotājs ar paraugu ņemšanas ātrumu no 50 līdz 3200 paraugiem sekundē.
  • Turklāt tam ir nepieciešamā elektronika signāla pastiprināšanai un filtrēšanai, apkārtējās gaismas atcelšanai, 50-60Hz frekvenču noraidīšanai (mākslīgā gaisma) un temperatūras kompensācijai.

Moduļa patēriņš var sasniegt līdz 50mA mērīšanas laikā, lai gan intensitāti var regulēt programmatiski, ar zemas jaudas režīmu 0.7 µA mērījumu laikā.

Precio y dónde salīdzinātājs

MAX30102 sensori pulsa un asins skābekļa mērīšanai tie ir diezgan lēti. Šie moduļi var būt jūsu rīcībā tikai par dažiem eiro tādās vietnēs kā eBay, Aliexpress vai Amazon. Jūs redzēsit, ka ir vairāki veidi, un mēs iesakām:

Savienojumi un piemērs ar Arduino

Arduino IDE, datu tipi, programmēšana

Lai pārbaudītu MAX30102 ar Arduino, vispirms ir jāpievieno šis modulis Arduino platei. Šis savienojums ir ļoti vienkāršs, jums vienkārši ir jāpievieno sekojošais:

  1. Moduļa Vcc jābūt savienotam ar Arduino plates 5V izeju.
  2. Moduļa GND ir jāpievieno Arduino plates GND ligzdai.
  3. Moduļa SCL ir jāpievieno vienai no Arduino plates analogajām ieejām, piemēram, A5.
  4. Moduļa SDA ir jāpievieno citai no Arduino plates analogajām ieejām, piemēram, A4.

Kad ir izveidoti atbilstošie savienojumi starp MAX30102 plati un Arduino plati, nākamā lieta būs uzrakstīt avota kodu vai skici, lai tas darbotos, un sākt saņemt biometriskos datus no attiecīgās personas. Tas ir tikpat vienkārši, kā ierakstīt tālāk norādīto kodu Arduino IDE un ieprogrammējiet dēli:

Lai to izmantotu, Arduino IDE ir jāinstalē arī bibliotēka. Bibliotēku ir izstrādājis SparkFun, un tā ir pieejama vietnē 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);
  }
}

Protams, kodu var modificēt atbilstoši savām vajadzībām, šis ir tikai piemērs...


Esi pirmais, kas komentārus

Atstājiet savu komentāru

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti ar *

*

*

  1. Atbildīgais par datiem: Migels Ángels Gatóns
  2. Datu mērķis: SPAM kontrole, komentāru pārvaldība.
  3. Legitimācija: jūsu piekrišana
  4. Datu paziņošana: Dati netiks paziņoti trešām personām, izņemot juridiskus pienākumus.
  5. Datu glabāšana: datu bāze, ko mitina Occentus Networks (ES)
  6. Tiesības: jebkurā laikā varat ierobežot, atjaunot un dzēst savu informāciju.