MAX30102: Arduino için kalp atış hızı monitörü ve oksimetre modülü

MAX30102

Bu süre zarfında çok sayıda şey gösterdik. Elektronik parçalar ile uyumlu Arduino gibi veya uyumlu kartlarve diğer birçok yapımcı veya DIY işi için. Şimdi sizi modülle tanıştıracağız MAX30102Nabzı ve kandaki oksijeni ölçen bir sensör içerir.

Bu sayede kendi kendinize yapabileceğiniz aktivite bileklikleri veya donanımlar gibi giyilebilir ürünler de oluşturabilirsiniz. sağlık durumunu izle Bu cihaza kalp atış hızı monitörü ve oksimetrenin entegrasyonu sayesinde kişinin biyometrik verilerinin veya telemetrisinin sağlanması...

Kalp atış hızı monitörü nedir? O nasıl çalışır?

Un nabız sensörü veya kalp atış hızı monitörü Bir kişinin kalp atış hızını gerçek zamanlı olarak ölçmek için kullanılan elektronik bir cihazdır. Esas olarak spor alanında antrenman sırasında veya günlük olarak performansı ve eforu izlemek için kullanılır. Kalp atış hızı monitörleri sporcular arasında popülerdir, ancak aynı zamanda tıp merkezlerinde kalp atış hızını, yani kalp atış hızını veya dakikadaki atış sayısını bilmek için kullanılan temel bir cihazdır:

  • PR Bpm: Kalp atış hızını, yani dakikadaki atış sayısını gösterir.

Her durumda, Sensörler her kalp atışında kan hacmindeki değişimi yakalar. Bu değişiklik, kalp atış hızını elde etmek için işlenen bir elektrik sinyaline dönüştürülür. Bazı kalp atış hızı monitörleri, okumaların doğruluğunu artırmak için amplifikasyon ve gürültü engelleme devreleri de içerir.

Oksimetre nedir? O nasıl çalışır?

Un Oksimetre tıbbi veya spor amaçlı bir cihazdır Kandaki oksijen doygunluğunu ölçmek için kullanılır. Bu cihaz %0 ila %100 arası değerlerle kan oksijen doygunluğu verilerini sunar. Aynı cihazın, izleme veya kayıt için tüm bilgileri gösteren kalp atış hızı seçeneğini de içermesi yaygındır.

Los Datos Que bir oksimetre ölçer Öyle:

  • %SpO2: Kandaki oksijen doygunluğunun yüzdesini ifade eder.

Oksimetre, parmağımızın morfolojisine uyum sağlayacak şekilde bir kelepçe gibi yerleştirildiği gibi, kalp atış hızı monitöründe olduğu gibi, bilek gibi vücudun başka yerlerine de yerleştirilebilir. birçok aktivite bilekliğinde görülebilmektedir.

Çalışmalarıyla ilgili olarak, oksimetreler farklı yayarlar ışık dalga boyları deriden geçenler. Bu ışığa etki eden şey, oksijenin taşınmasından sorumlu olan ve taşıdığı oksijen seviyesine bağlı olarak farklı miktarlarda ışığı emen bir kan molekülü olan hemoglobindir. Detaylı süreç aşağıdaki gibidir:

  1. Emisyon de luz- Oksimetre, cihaza yerleştirilen parmaktan geçen, biri kırmızı ve biri kızılötesi olmak üzere iki dalga boyunda ışık yayar.
  2. Işık emilimi: Kırmızı kan hücrelerinde oksijen taşıyan bir molekül olan hemoglobin, bu ışıkların farklı miktarlarını emer. Oksijen yüklü hemoglobin (oksihemoglobin) ve oksijensiz hemoglobin (deoksihemoglobin) farklı ışık emme özelliklerine sahiptir.
  3. Işık algılama: Işık yayıcının karşı tarafında bulunan bir dedektör, parmaktan geçen ışığı toplar.
  4. Oksijen doygunluğunun hesaplanması- Cihaz, oksihemoglobinin, hem oksihemoglobin hem de deoksihemoglobin olmak üzere mevcut toplam hemoglobin miktarına oranını hesaplar. Bu oran kan oksijen doygunluğunun yüzdesi (%SpO2) olarak sunulur. Bu, bu elektrik sinyallerini sayısal bir değere çevirmek için yorumlayabilen bir işlemci aracılığıyla yapılır.

MAX30102 modülü nedir?

Sensör MAX30102, Maxim Integrated tarafından üretildi, kalp atış hızı monitörü ve oksimetrenin işlevlerini birleştiren entegre bir cihazdır. Bu sensör Arduino gibi bir mikrodenetleyici ile rahatlıkla kullanılabilir. MAX30102, bu firmanın MAX3010x optik sensör serisine aittir.

Çalışması, ışığın kan tarafından absorbe edilmesinin miktarına bağlı olarak değişmesine dayanmaktadır. oksijen doygunluğu seviyesi ve nabız önceki iki bölümde de belirttiğim gibi. Bu sensör, biri kırmızı ve biri kızılötesi olmak üzere iki LED ile donatılmıştır. Parmak veya bilek gibi cilt üzerine yerleştirilir ve oksijen doygunluğunun derecesini belirlemek için yansıyan ışığı algılar.

MAX30102 ile iletişim gerçekleştirilir I2C veriyolu aracılığıylaArduino gibi bir mikrodenetleyiciye bağlanmayı kolaylaştırır. MAX30102'nin çift güç kaynağına ihtiyacı vardır: mantık için 1.8V ve LED'ler için 3.3V. Genellikle gerekli seviye eşleşmesini zaten içeren 5V modüllerde bulunur.

MAX30102 ev veya spor projelerinde kullanılan bir sensördür yani profesyonel tıbbi kullanım için yeterli güvenilirliğe ve hassasiyete sahip olmayabilir.

La optik nabız oksimetresi Kandaki oksijen doygunluğunun yüzdesini belirlemek için invazif olmayan bir yöntemdir. Daha önce de belirttiğim gibi hemoglobin (Hb) ve oksihemoglobinin (HbO2) farklı dalga boyları için ışık emme katsayılarının farklılığına dayanmaktadır. Oksijen bakımından zengin kan kızılötesi ışığı daha fazla emer, oksijeni düşük kan ise daha fazla kırmızı ışığı emer. Vücudun yeterince ince olduğu ve altında kan damarları bulunan bölgelerde bu fark, oksijen doygunluğunun derecesini belirlemek için kullanılabilir.

Nabız ve kan oksijen sensörlü MAX30102 modülünün özellikleri

MAX30102 şunları içerir:

  • 2x LED, biri kırmızı (660 nm) ve biri kızılötesi (880 nm)
  • Yansıyan ışığı ölçmek için 2x fotodiyot
  • Saniyede 18 ila 50 örnek örnekleme hızına sahip 3200 bit ADC dönüştürücü.
  • Ayrıca sinyal amplifikasyonu ve filtrelemesi, ortam ışığının iptal edilmesi, 50-60Hz frekansların reddedilmesi (yapay ışık) ve sıcaklık telafisi için gerekli elektroniklere sahiptir.

Modül tüketimi 50mA'ya kadar ulaşabilir ölçüm sırasında yoğunluk programlı olarak ayarlanabilse de, ölçümler sırasında 0.7μA düşük güç moduyla ayarlanabilir.

Fiyat ve nereden alınır

Nabız ve kan oksijenini ölçmek için MAX30102 sensörleri oldukça ucuzlar. Bu modüller eBay, Aliexpress veya Amazon gibi sitelerde sadece birkaç avro karşılığında sizin olabilir. Birkaç tür olduğunu göreceksiniz ve aşağıdakileri öneriyoruz:

Arduino ile bağlantılar ve örnek

Arduino IDE, veri tipleri, programlama

MAX30102'yi Arduino ile test etmek için ilk şey bu modülü Arduino kartına bağlamaktır. Bu bağlantı çok basit, aşağıdakileri bağlamanız yeterlidir:

  1. Modülün Vcc'si Arduino kartının 5V çıkışına bağlanmalıdır.
  2. Modülün GND'si Arduino kartının GND soketine bağlanmalıdır.
  3. Modülün SCL'sinin Arduino kartının A5 gibi analog girişlerinden birine bağlanması gerekir.
  4. Modülün SDA'sının Arduino kartının A4 gibi başka bir analog girişine bağlanması gerekir.

MAX30102 kartı ile Arduino kartı arasında uygun bağlantılar kurulduktan sonra, bir sonraki adım, onu çalıştırmak için bir kaynak kodu veya taslak yazmak ve söz konusu kişiden biyometrik verileri almaya başlamak olacaktır. Bu, aşağıdaki kodu yazmak kadar kolaydır. Arduino IDE ve tahtayı programlayın:

Ayrıca kullanmak için Arduino IDE'ye bir kütüphane kurmanız gerekir. Kütüphane SparkFun tarafından geliştirilmiştir ve şu adreste mevcuttur: 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);
  }
}

Elbette ihtiyacınıza göre kodu değiştirebilirsiniz, bu sadece bir örnek...


İlk yorumu siz

Yorumunuzu bırakın

E-posta hesabınız yayınlanmayacak. Gerekli alanlar ile işaretlenmiştir *

*

*

  1. Verilerden sorumlu: Miguel Ángel Gatón
  2. Verilerin amacı: Kontrol SPAM, yorum yönetimi.
  3. Meşruiyet: Onayınız
  4. Verilerin iletilmesi: Veriler, yasal zorunluluk dışında üçüncü kişilere iletilmeyecektir.
  5. Veri depolama: Occentus Networks (AB) tarafından barındırılan veritabanı
  6. Haklar: Bilgilerinizi istediğiniz zaman sınırlayabilir, kurtarabilir ve silebilirsiniz.