MAX30102: monitor kadar jantung dan modul oksimeter untuk Arduino

MAX30102

Sepanjang masa ini, kami telah menunjukkan sejumlah besar Komponen elektronik bersesuaian dengan papan seperti Arduino atau serasi, serta untuk banyak kerja pembuat atau DIY yang lain. Sekarang kami akan memperkenalkan anda kepada modul MAX30102, yang termasuk sensor untuk mengukur nadi dan oksigen darah.

Dengan cara ini, anda juga boleh mencipta barang boleh pakai seperti gelang aktiviti atau perkakasan buatan sendiri untuk memantau status kesihatan seseorang, menyediakan data biometrik atau telemetri orang tersebut terima kasih kepada penyepaduan monitor kadar jantung dan oksimeter dalam peranti ini...

Apakah monitor kadar jantung? Bagaimanakah ia berfungsi?

Un penderia nadi atau pemantau kadar jantung Ia adalah peranti elektronik yang digunakan untuk mengukur kadar denyutan jantung seseorang dalam masa nyata. Ia digunakan terutamanya dalam bidang sukan untuk memantau prestasi dan usaha semasa latihan atau setiap hari. Pemantau kadar jantung popular di kalangan atlet, tetapi ia juga merupakan peranti asas di pusat perubatan untuk mengetahui kadar denyutan jantung, iaitu, kadar denyutan jantung atau degupan seminit:

  • PR Bpm: menunjukkan kadar denyutan jantung, iaitu degupan seminit.

Dalam semua kes, Penderia menangkap variasi dalam jumlah darah dengan setiap degupan jantung. Variasi ini diterjemahkan kepada isyarat elektrik yang diproses untuk mendapatkan kadar denyutan jantung. Sesetengah pemantau kadar jantung juga termasuk litar penguatan dan pembatalan hingar untuk meningkatkan ketepatan bacaan.

Apakah oksimeter? Bagaimanakah ia berfungsi?

Un oksimeter ialah peranti perubatan atau sukan yang digunakan untuk mengukur ketepuan oksigen dalam darah. Peranti ini menawarkan data ketepuan oksigen darah dengan nilai dari 0 hingga 100%. Ia adalah perkara biasa bagi peranti yang sama untuk turut menyertakan pilihan kadar denyutan jantung, yang menunjukkan semua maklumat untuk pemantauan atau rakaman.

Data yang hilang mengukur oksimeter Ia adalah:

  • % SpO2: merujuk kepada peratusan ketepuan oksigen dalam darah.

Oksimeter diletakkan seperti pengapit dengan cara yang disesuaikan dengan morfologi jari kita atau ia juga boleh diletakkan di tempat lain pada badan, seperti yang berlaku dengan monitor denyutan jantung, seperti pergelangan tangan, sebagai boleh dilihat dalam banyak gelang aktiviti. ,

Mengenai operasi mereka, oksimeter memancarkan berbeza panjang gelombang cahaya yang melalui kulit. Apa yang bertindak pada cahaya ini ialah hemoglobin, molekul darah yang bertanggungjawab untuk mengangkut oksigen, menyerap jumlah cahaya yang berbeza bergantung pada tahap oksigen yang diangkut. Proses terperinci adalah seperti berikut:

  1. pelepasan cahaya- Oksimeter memancarkan dua panjang gelombang cahaya, satu merah dan satu inframerah, yang melalui jari yang diletakkan pada peranti.
  2. Penyerapan cahaya: Hemoglobin, molekul dalam sel darah merah yang membawa oksigen, menyerap jumlah cahaya yang berbeza. Hemoglobin yang sarat oksigen (oksihemoglobin) dan hemoglobin bebas oksigen (deoksihemoglobin) mempunyai sifat penyerapan cahaya yang berbeza.
  3. Pengesanan cahaya: Pengesan di bahagian bertentangan pemancar cahaya mengumpul cahaya yang telah melalui jari.
  4. Pengiraan ketepuan oksigen- Peranti mengira nisbah oksihemoglobin kepada jumlah hemoglobin yang ada, kedua-dua oksihemoglobin dan deoksihemoglobin. Perkadaran ini ditunjukkan sebagai peratusan ketepuan oksigen darah (%SpO2). Ini dilakukan melalui pemproses yang mampu mentafsir isyarat elektrik ini untuk menterjemahkannya kepada nilai berangka.

Apakah modul MAX30102?

Sensor MAX30102, dihasilkan oleh Maxim Integrated, ialah peranti bersepadu yang menggabungkan fungsi monitor denyutan jantung dan oksimeter. Sensor ini boleh digunakan dengan mudah dengan mikropengawal seperti Arduino. MAX30102 tergolong dalam siri penderia optik MAX3010x daripada firma ini.

Operasinya adalah berdasarkan variasi penyerapan cahaya oleh darah, bergantung padanya tahap ketepuan oksigen, dan nadi seperti yang telah saya nyatakan dalam dua bahagian sebelum ini. Sensor ini dilengkapi dengan dua LED, satu merah dan satu inframerah. Ia diletakkan pada kulit, seperti pada jari atau pergelangan tangan, dan mengesan cahaya yang dipantulkan untuk menentukan tahap ketepuan oksigen.

Komunikasi dengan MAX30102 dijalankan melalui bas I2C, menjadikannya mudah untuk menyambung kepada mikropengawal seperti Arduino. MAX30102 memerlukan bekalan kuasa berganda: 1.8V untuk logik dan 3.3V untuk LED. Biasanya ditemui pada modul 5V yang sudah termasuk padanan tahap yang diperlukan.

MAX30102 ialah penderia yang digunakan dalam projek rumah atau sukan, iaitu, ia mungkin tidak mempunyai kebolehpercayaan dan sensitiviti yang mencukupi untuk kegunaan perubatan profesional.

La oksimetri nadi optik Ia adalah kaedah bukan invasif untuk menentukan peratusan ketepuan oksigen dalam darah. Seperti yang saya nyatakan sebelum ini, ia adalah berdasarkan perbezaan dalam pekali penyerapan cahaya hemoglobin (Hb) dan oksihemoglobin (HbO2) untuk panjang gelombang yang berbeza. Darah yang kaya dengan oksigen menyerap lebih banyak cahaya inframerah, manakala darah rendah oksigen menyerap lebih banyak cahaya merah. Di kawasan badan yang kulitnya cukup nipis dan terdapat saluran darah di bawahnya, perbezaan ini boleh digunakan untuk menentukan tahap ketepuan oksigen.

Ciri-ciri modul MAX30102 dengan sensor nadi dan oksigen darah

MAX30102 termasuk:

  • 2x LED, satu merah (660nm) dan satu inframerah (880nm)
  • 2x fotodiod untuk mengukur cahaya yang dipantulkan
  • Penukar ADC 18-bit dengan kadar pensampelan 50 hingga 3200 sampel sesaat.
  • Di samping itu, ia mempunyai elektronik yang diperlukan untuk penguatan dan penapisan isyarat, pembatalan cahaya ambien, penolakan frekuensi 50-60Hz (cahaya buatan) dan pampasan suhu.

Penggunaan modul boleh mencapai sehingga 50mA semasa pengukuran, walaupun keamatan boleh dilaraskan secara pengaturcaraan, dengan mod kuasa rendah 0.7μA semasa pengukuran.

Precio y dónde compar

Penderia MAX30102 untuk mengukur nadi dan oksigen darah mereka agak murah. Modul ini boleh menjadi milik anda hanya dengan beberapa euro di tapak seperti eBay, Aliexpress atau Amazon. Anda akan melihat bahawa terdapat beberapa jenis, dan kami mengesyorkan yang berikut:

[amazon box=”B07QG9HF4J, B0CD73CPNJ, B09L4SN5J6″ item=”3″ grid=”3″ image_size=”large” description_items=”0″ template=”widget”]

Sambungan dan contoh dengan Arduino

Arduino IDE, jenis data, pengaturcaraan

Untuk menguji MAX30102 dengan Arduino, perkara pertama ialah menyambungkan modul ini ke papan Arduino. ini sambungan sangat mudah, anda hanya perlu menyambung yang berikut:

  1. Vcc modul mesti disambungkan ke output 5V papan Arduino.
  2. GND modul mesti disambungkan ke soket GND papan Arduino.
  3. SCL modul perlu disambungkan kepada salah satu input analog papan Arduino, seperti A5.
  4. SDA modul perlu disambungkan ke satu lagi input analog papan Arduino, seperti A4.

Setelah sambungan yang sesuai telah diwujudkan antara papan MAX30102 dan papan Arduino, perkara seterusnya ialah menulis kod sumber atau lakaran untuk menjadikannya berfungsi dan mula menerima data biometrik daripada orang yang berkenaan. Ini semudah menulis kod berikut IDE Arduino dan atur cara papan:

Anda juga perlu memasang perpustakaan dalam IDE Arduino untuk menggunakannya. Perpustakaan ini telah dibangunkan oleh SparkFun, dan boleh didapati di 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);
  }
}

Sudah tentu, anda boleh mengubah suai kod mengikut keperluan anda, ini hanyalah contoh...