MAX30102: מד דופק ומודול אוקסימטר עבור Arduino

MAX30102

במהלך כל הזמן הזה, הראינו מספר רב של רכיבים אלקטרוניים מותאם ל לוחות כמו Arduino או תואמים, כמו גם עבור עבודות יצרניות רבות אחרות או עשה זאת בעצמך. כעת נציג בפניכם את המודול MAX30102, הכולל חיישן למדידת דופק וחמצן בדם.

בדרך זו, תוכלו גם ליצור פריטים לבישים כמו צמידי פעילות מתוצרת עצמית או חומרה עבור לעקוב אחר מצב הבריאות של אדם, מתן נתונים ביומטריים או טלמטריה של אותו אדם הודות לשילוב של מד הדופק והאוקסימטר במכשיר זה...

מהו מד דופק? איך זה עובד?

Un חיישן דופק או מד דופק זהו מכשיר אלקטרוני המשמש למדידת קצב הלב של אדם בזמן אמת. הוא משמש בעיקר בתחום הספורט לניטור ביצועים ומאמץ במהלך האימון או על בסיס יומיומי. מדי דופק פופולריים בקרב ספורטאים, אבל הם גם מכשיר בסיסי במרכזים רפואיים כדי לדעת את הדופק, כלומר את הדופק או הפעימות לדקה:

  • PR Bpm: מציג את קצב הלב, כלומר את הפעימות לדקה.

בכל המקרים, ה חיישנים לוכדים שינויים בנפח הדם עם כל פעימת לב. וריאציה זו מתורגמת לאות חשמלי המעובד להשגת קצב הלב. חלק ממוני הדופק כוללים גם מעגלי הגברה וביטול רעשים כדי לשפר את דיוק הקריאות.

מהו אוקסימטר? איך זה עובד?

Un אוקסימטר הוא מכשיר רפואי או ספורט המשמש למדידת ריווי החמצן בדם. מכשיר זה מציע נתוני ריווי חמצן בדם עם ערכים מ-0 עד 100%. מקובל שאותו מכשיר כולל גם את אפשרות הדופק, המציינת את כל המידע לניטור או להקלטה.

הנתונים ש מודד אוקסימטר הוא:

  • %SpO2: מתייחס לאחוז ריווי החמצן בדם.

האוקסימטר ממוקם כמו מהדק בצורה כזו שהוא מותאם למורפולוגיה של האצבע שלנו או שניתן למקם אותו גם במקומות אחרים בגוף, כפי שקורה במד הדופק, כמו שורש כף היד, כמו ניתן לראות בצמידי פעילות רבים. ,

לגבי פעולתם, אוקסימטרים פולטים שונים אורכי גל אור שעוברים דרך העור. מה שפועל על האור הזה הוא המוגלובין, מולקולת דם האחראית על הובלת חמצן, הסופגת כמויות שונות של אור בהתאם לרמת החמצן שהוא מעביר. התהליך המפורט הוא כדלקמן:

  1. פליטת אור- האוקסימטר פולט שני אורכי גל של אור, אחד אדום ואחד אינפרא אדום, העוברים דרך האצבע המונחת על המכשיר.
  2. ספיגת אור: המוגלובין, מולקולה בתאי דם אדומים הנושאת חמצן, סופגת כמויות שונות של האורות הללו. להמוגלובין עמוס בחמצן (אוקסיהמוגלובין) ולהמוגלובין נטול חמצן (דאוקסיהמוגלובין) יש תכונות ספיגת אור שונות.
  3. זיהוי אור: גלאי בצד הנגדי של פולט האור אוסף את האור שעבר דרך האצבע.
  4. חישוב ריווי חמצן- המכשיר מחשב את היחס בין האוקסיהמוגלובין לכמות ההמוגלובין הכוללת הקיימת, הן אוקסיהמוגלובין והן דאוקסיהמוגלובין. שיעור זה מוצג כאחוז ריווי החמצן בדם (%SpO2). זה נעשה באמצעות מעבד המסוגל לפרש את האותות החשמליים הללו כדי לתרגם אותם לערך מספרי.

מהו מודול MAX30102?

החיישן MAX30102, מיוצר על ידי Maxim Integrated, הוא מכשיר משולב המשלב את הפונקציות של מד דופק ואוקסימטר. חיישן זה יכול לשמש בקלות עם מיקרו-בקר כגון Arduino. ה-MAX30102 שייך לסדרת החיישנים האופטיים MAX3010x של חברה זו.

פעולתו מבוססת על השונות של ספיגת האור בדם, בהתאם לו רמת ריווי חמצן, ודופק כפי שציינתי בשני הסעיפים הקודמים. חיישן זה מצויד בשתי נוריות LED, אחת אדומה ואחת אינפרא אדום. הוא מונח על העור, כמו על האצבע או פרק כף היד, ומזהה אור מוחזר כדי לקבוע את מידת ריווי החמצן.

תקשורת עם MAX30102 מתבצעת באמצעות אוטובוס I2C, מה שמקל על החיבור למיקרו-בקר כגון Arduino. ה-MAX30102 זקוק לאספקת חשמל כפולה: 1.8V ללוגיקה ו-3.3V ללדים. נמצא בדרך כלל במודולי 5V שכבר כוללים את התאמת הרמות הדרושה.

ה-MAX30102 הוא חיישן המשמש בפרויקטים ביתיים או ספורטיביים, כלומר, ייתכן שאין לו אמינות ורגישות מספקות לשימוש רפואי מקצועי.

La אוקסימטריית דופק אופטית זוהי שיטה לא פולשנית לקביעת אחוז ריווי החמצן בדם. כפי שציינתי קודם, הוא מבוסס על ההבדל במקדמי ספיגת האור של המוגלובין (Hb) ואוקסיהמוגלובין (HbO2) עבור אורכי גל שונים. דם עשיר בחמצן סופג יותר אור אינפרא אדום, בעוד שדם דל בחמצן סופג יותר אור אדום. באזורים בגוף שבהם העור דק מספיק ויש כלי דם מתחת, ניתן להשתמש בהבדל זה כדי לקבוע את מידת ריווי החמצן.

תכונות של מודול MAX30102 עם חיישן דופק וחמצן בדם

ה-MAX30102 כולל:

  • 2 נוריות LED, אחת אדומה (660 ננומטר) ואחת אינפרא אדום (880 ננומטר)
  • 2x פוטודיודות למדידת אור מוחזר
  • ממיר ADC 18 סיביות עם קצב דגימה של 50 עד 3200 דגימות בשנייה.
  • בנוסף, יש לו את האלקטרוניקה הדרושה להגברת אותות וסינון, ביטול אור הסביבה, דחיית תדרים של 50-60Hz (אור מלאכותי) ופיצוי טמפרטורה.

צריכת מודול יכול להגיע עד 50mA במהלך המדידה, אם כי ניתן לכוונן את העוצמה באופן תוכנתי, עם מצב הספק נמוך של 0.7µA במהלך המדידות.

מחיר ואיפה לקנות

חיישני MAX30102 למדידת דופק וחמצן בדם הם די זולים. המודולים האלה יכולים להיות שלך תמורת כמה יורו בלבד באתרים כמו eBay, Aliexpress או Amazon. אתה תראה שיש כמה סוגים, ואנו ממליצים על הדברים הבאים:

חיבורים ודוגמה עם ארדואינו

Arduino IDE, סוגי נתונים, תכנות

כדי לבדוק את ה-MAX30102 עם Arduino, הדבר הראשון הוא לחבר את המודול הזה ללוח Arduino. זֶה החיבור פשוט מאוד, אתה רק צריך לחבר את הדברים הבאים:

  1. ה-Vcc של המודול חייב להיות מחובר לפלט 5V של לוח Arduino.
  2. יש לחבר את GND של המודול לשקע GND של לוח Arduino.
  3. SCL של המודול חייב להיות מחובר לאחת מהכניסות האנלוגיות של לוח Arduino, כגון A5.
  4. יש לחבר את ה-SDA של המודול לכניסה אחרת מהכניסות האנלוגיות של לוח Arduino, כגון A4.

לאחר שנוצרו החיבורים המתאימים בין לוח MAX30102 ללוח Arduino, הדבר הבא יהיה לכתוב קוד מקור או סקיצה כדי לגרום לזה לעבוד ולהתחיל לקבל נתונים ביומטריים מהאדם הנדון. זה קל כמו לכתוב את הקוד הבא Arduino IDE ותכנת את הלוח:

אתה גם צריך להתקין ספרייה ב- Arduino IDE כדי להשתמש בה. הספרייה פותחה על ידי SparkFun, והיא זמינה בכתובת 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);
  }
}

כמובן, אתה יכול לשנות את הקוד בהתאם לצרכים שלך, זו רק דוגמה...


היה הראשון להגיב

השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.