آموزش آردوینوپروژه های آردوینو

راه اندازی پالس اکسیمتر MAX30102 با آردوینو

پالس اکسیمتر و سنسور ضربان قلب MAX30102 یک سنسور بیومتریک کم مصرف مبتنی بر پروتکل I2C است. دانش‌آموزان، علاقه‌مندان، مهندسان، تولیدکنندگان و توسعه‌دهندگان بازی و موبایل که می‌خواهند داده‌های زنده ضربان قلب را در پروژه‌های خود بگنجانند، می‌توانند از آن استفاده کنند.

ماژول بیومتریک MAX30102

این ماژول MAX30102 دارای پالس اکسیمتر یکپارچه و آی سی سنسور ضربان قلب است. این ماژول یک LED قرمز و مادون قرمز را به همان یک تشخیص نور ترکیب میکند و میتواند سیگنال‌های پالس اکسیمتری (SpO2) و ضربان قلب (HR) را محاسبه کند.

ماژول بیومتریک MAX30102

اصل کار ماژول این است که ال ای دی را فعال میکند و سپس میزان نوری که به آشکارساز می تابد را تشخیص میدهد، و بر اساس میزان تابش، می تواند سطح اکسیژن خون و ضربان قلب را اندازه گیری کند.

برق مورد نیاز

تراشه MAX30102 به دو ولتاژ تغذیه متفاوت نیاز دارد: 1.8 ولت برای آی سی و 3.3 ولت برای LED های قرمز و مادون قرمز. بنابراین ماژول دارای رگولاتورهای 3.3 ولت و 1.8 ولت است.

در پشت PCB یک جامپر قابل لحیم کاری پیدا خواهید کرد که می توان از آن برای انتخاب سطح منطقی 3.3 ولت و 1.8 ولت استفاده کرد. به طور پیش فرض سطح منطق 3.3 ولت انتخاب شده است که با آردوینو سازگار است. اما شما همچنین می توانید سطح منطقی 1.8 ولت را بر اساس نیاز خود انتخاب کنید. این به شما امکان می دهد ماژول را به هر میکروکنترلر با ورودی/خروجی 5 ولت، 3.3 ولت و حتی 1.8 ولت متصل کنید.

رگولاتورهای بررسی کلی سخت افزار ماژول max30102

یکی از مهم ترین ویژگی های MAX30102 مصرف برق کم آن است: MAX30102 در هنگام اندازه گیری کمتر از 600μA مصرف می کند. همچنین می توان MAX30102 را در حالت آماده به کار قرار داد، جایی که فقط 0.7μA مصرف می کند. این مصرف انرژی کم اجازه می دهد تا در دستگاه های با باتری مانند گوشی ها، پوشیدنی ها یا ساعت های هوشمند اجرا شود.

سنسور دمای روی تراشه

MAX30102 دارای یک سنسور دمای روی تراشه است که می توان از آن برای جبران تغییرات محیطی و کالیبره کردن اندازه گیری ها استفاده کرد. این یک سنسور دمای نسبتا دقیق است که دما را در محدوده -40 درجه سانتیگراد تا +85 درجه سانتیگراد با دقت 1± درجه سانتیگراد اندازه گیری می کند.

رابط I2C:

این ماژول از یک رابط دو سیمه ساده I2C برای ارتباط با میکروکنترلر استفاده می کند. دارای آدرس I2C ثابت: 0xAEHEX (برای عملیات نوشتن) و 0xAFHEX (برای عملیات خواندن) است.

بافر FIFO:

MAX30102 یک بافر FIFO برای ذخیره نمونه داده ها تعبیه می کند. FIFO دارای یک بانک حافظه 32 نمونه است، به این معنی که می تواند تا 32 نمونه SpO2 و ضربان قلب را در خود جای دهد.

وقفه:

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

MAX30102 را می توان طوری برنامه ریزی کرد که یک وقفه ایجاد کند و به میکروکنترلر میزبان امکان انجام کارهای دیگر را در حین جمع آوری داده ها توسط سنسور بدهد. وقفه را می توان برای 5 حالت مختلف فعال کرد:

  • Power Ready: در هنگام روشن شدن یا پس از یک وضعیت خاموشی فعال می شود.
  • New Data Ready: پس از جمع‌ آوری هر نمونه داده‌های SpO2 و HR آغاز می‌شود.
  • Ambient Light Cancellation: زمانی فعال می شود که عملکرد لغو نور محیطی دیود نوری SpO2/HR به حداکثر حد مجاز خود برسد و بر خروجی ADC تأثیر بگذارد.
  • Temperature Ready: هنگامی که تبدیل دمای قالب داخلی به پایان می رسد فعال می شود.
  • FIFO تقریباً کامل: زمانی فعال می شود که FIFO پر می شود و داده های آینده در شرف از بین رفتن است.

پین وقفه نمای کلی سخت افزار ماژول max30102

خط INT توسط یک مقاومت پول آپ به بالا کشیده شده است. هنگامی که یک وقفه رخ می دهد، پین INT به پایین کشیده شده و LOW می شود و تا زمانی که وقفه پاک شود، LOW می ماند.

مشخصات فنی سنسور MAX30102

منبع تغذیه 3.3V to 5.5V
مصرف جریان ~600μA (در حین اندازه گیری)
~0.7μA (در حالت آماده به کار)
طول موج ال ای دی قرمز 660nm
طول موج ال ای دی مادون قرمز 880nm
محدوده دما -40˚C تا +85˚C
دقت دما ±1˚C

شما می توانید اطلاعات گسترده ای را برای سنسور MAX30102 از دیتاشیت آن پیدا کنید.

نحوه کار پالس اکسی متر و سنسور ضربان قلب MAX30102

MAX30102، یا هر پالس اکسیمتر نوری و سنسور ضربان قلب، از یک جفت LED با شدت بالا (قرمز و IR، هر دو با طول موج های مختلف) و یک آشکارساز نوری تشکیل شده است. طول موج این LED ها به ترتیب 660 نانومتر و 880 نانومتر است.

فتوپلتیسموگرام تشخیص پالس max30102

MAX30102 با تابش هر دو نور به انگشت یا لاله گوش (یا اساساً در هر جایی که پوست خیلی ضخیم نیست، بنابراین هر دو نور می توانند به راحتی به بافت نفوذ کنند) و با استفاده از ردیاب نوری، میزان نور منعکس شده را اندازه گیری می کند. این روش تشخیص پالس از طریق نور Photoplethysmogram نامیده می شود.

عملکرد MAX30102 را می توان به دو بخش تقسیم کرد: اندازه گیری ضربان قلب و پالس اکسیمتری (اندازه گیری سطح اکسیژن خون).

اندازه گیری ضربان قلب

هموگلوبین اکسیژن دار (HbO2) در خون شریانی دارای ویژگی جذب نور IR است. هر چه خون قرمزتر باشد (هموگلوبین بالاتر)، نور IR بیشتری جذب می شود. همانطور که خون با هر ضربان قلب از طریق انگشت پمپ می شود، مقدار نور منعکس شده تغییر می کند و یک شکل موج متغیر در خروجی آشکارساز نور ایجاد می کند. همانطور که به تابش نور و خواندن ردیاب نوری ادامه می دهید، شروع به خواندن نبض ضربان قلب (HR) می کنید.

تشخیص نبض سنسور ضربان قلب کار فوتوپلتیسموگرام

پالس اکسیمتری

پالس اکسیمتری بر این اصل استوار است که میزان جذب نور قرمز و مادون قرمز بسته به میزان اکسیژن خون شما متفاوت است. نمودار زیر طیف جذب هموگلوبین اکسیژن (HbO2) و هموگلوبین بدون اکسیژن (Hb) است.

طیف جذب hb و hbo2

همانطور که از نمودار می بینید، خون بدون اکسیژن نور قرمز بیشتری (660 نانومتر) جذب می کند، در حالی که خون اکسیژن دار نور مادون قرمز بیشتری (880 نانومتر) جذب می کند. با اندازه گیری نسبت نور IR و قرمز دریافتی توسط فتودیکتور، سطح اکسیژن (SpO2) در خون محاسبه می شود.

آیا می دانستید؟

اندازه گیری اشباع اکسیژن هموگلوبین (HbO2) با اندازه گیری جذب نور قرمز و IR در سال 1935 توسط یک پزشک آلمانی به نام کارل ماتز معرفی شد. در ابتدا، آشکارسازهای نوری خوبی وجود نداشت، بنابراین به جای باند IR، از نوار سبز طیف نور استفاده شد. با پیشرفت تکنولوژی، روش های قابل اعتمادتری توسعه یافتند و نور سبز جایگزین نور IR شد.

پین اوت ماژول MAX30102

ماژول MAX30102 پین های زیر را دارد.

  • پین اوت ماژول MAX30102VIN پایه پاور است. می توانید آن را به خروجی 3.3 ولت یا 5 ولت از آردوینو متصل کنید.
  • SCL پین ساعت I2C است، به خط ساعت I2C آردوینو متصل کنید.
  • SDA پین داده I2C است، به خط داده I2C آردوینو متصل کنید.
  • INT ماژول MAX30102 را می توان برای ایجاد یک وقفه برای هر پالس برنامه ریزی کرد.
  • IRD ماژول MAX30102 یک درایور LED برای هدایت پالس های LED برای اندازه گیری SpO2 و HR ادغام می کند.
  • RD شبیه پایه IRD است، اما برای راه اندازی LED قرمز استفاده می شود.
  • GND زمین است.

سیم کشی ماژول MAX30102 به آردوینو

اکنون که همه چیز را در مورد ماژول می‌دانیم، می‌توانیم آن را به آردوینو متصل کنیم!

با اتصال پین VCC به منبع تغذیه شروع کنید، 3V-5V خوب است. از همان ولتاژی استفاده کنید که منطق میکروکنترلر شما بر اساس آن است. برای اکثر آردوینوها، این ولتاژ 5 ولت است. برای دستگاه های منطقی 3.3 ولت، از 3.3 ولت استفاده کنید. سپس GND را به GND مشترک وصل کنید.

پایه SCL را به پایه ساعت I2C و پایه SDA را به پایه داده I2C در آردوینو وصل کنید. توجه داشته باشید که هر برد آردوینو دارای پین های I2C متفاوتی است که باید بر اساس آن متصل شوند. در بردهای آردوینو با طرح R3، پایه SDA (خط داده) و SCL (خط ساعت) روی هدرهای پین نزدیک به پایه AREF قرار دارند. آنها همچنین با نام های A5 (SCL) و A4 (SDA) شناخته می شوند.

تصویر زیر سیم کشی را نشان می دهد.

سیم کشی ماژول MAX30102 به آردوینو

نصب کتابخانه سنسور MAX30102

چندین کتابخانه برای سنسور MAX30102 موجود است. با این حال در مثال ما، ما از کتابخانه ساخته شده توسط SparkFun Electronics استفاده می کنیم. این کتابخانه بیشتر ویژگی‌های MAX30102 را نشان می‌دهد و توابع ساده و آسان برای محاسبه ضربان پالس و SpO2 را ارائه می‌دهد. می توانید این کتابخانه را از داخل Arduino IDE Library Manager دانلود کنید.

برای نصب کتابخانه به Sketch > Include Library > Manage Libraries بروید. منتظر بمانید تا  فهرست کتابخانه ها را بارگیری کند و لیست کتابخانه های نصب شده را به روز کند.

کلمه MAX3010x را تایپ کنید. کتابخانه SparkFun MAX3010x Pulse and Proximity Sensor را پیدا کنید. روی آن کلیک کنید و سپس Install را انتخاب کنید.

کد آردوینو اول: خواندن Red & IR

مثال اول مقادیر خام (خوانش های IR و قرمز) را که توسط سنسور خوانده می شود را خروجی می دهد. کد زیر را روی آردوینو خود بارگذاری کنید و سریال مانیتور را باز کنید تا مقادیر چاپ شده را ببینید.

#include <Wire.h>
#include "MAX30105.h"

MAX30105 particleSensor;

void setup() {
	Serial.begin(9600);

	// Initialize sensor
	if (particleSensor.begin() == false) {
		Serial.println("MAX30102 was not found. Please check wiring/power.");
		while (1);
	}

	particleSensor.setup(); //Configure sensor. Use 6.4mA for LED drive
}

void loop() {
	Serial.print(" R[");
	Serial.print(particleSensor.getRed());
	Serial.print("] IR[");
	Serial.print(particleSensor.getIR());
	Serial.println("]");
}

در حالی که سنسور رو به سمت بالا است، دست خود را روی سنسور بکشید. شما باید تغییری را در مقادیر مشاهده کنید زیرا دست شما مقادیر مختلف نور را منعکس می کند.

max30102 قرمز خام و مقادیر ir خروجی

اگر فقط به مقادیر نگاه کنید، تجسم داده های سریال ممکن است سخت باشد. اگر از Arduino IDE v1.6.6+ استفاده می کنید، گزینه ای برای مشاهده داده ها بر روی یک نمودار با استفاده از پلاتر سریال Arduino وجود دارد.

برای شروع، loop() در کد بالا را با این قطعه کد جایگزین کنید:

void loop() {
	Serial.print(particleSensor.getRed());
	Serial.print(", ");
	Serial.println(particleSensor.getIR());
}

در نرم افزار آردوینو، Tools > Serial Plotter را انتخاب کنید. هنگامی که دست خود را روی سنسور بکشید، باید موجی مشابه تصویر زیر مشاهده کنید.

خروجی max30102 در پلاتر سریال

کد آردوینو دوم: تشخیص مجاورت

آزمایش بعدی ما نشان می دهد که چگونه از سنسور MAX30102 به عنوان یک سنسور مجاورت عمومی یا یک سنسور بازتاب استفاده کنیم و می تواند به عنوان پایه ای برای آزمایش ها و پروژه های کاربردی تر باشد.

این مثال با گرفتن تعداد انگشت شماری از خوانش ها در حین راه اندازی و میانگین گیری آنها با هم کار می کند. سپس از این میانگین به عنوان پایه استفاده می کند. اگر حسگر تغییر قابل توجهی نسبت به میانگین تشخیص دهد، ” Something is there!” چاپ می شود. پیش بروید و طرح را امتحان کنید.

#include 
#include "MAX30105.h"

MAX30105 particleSensor;

long samplesTaken = 0; //Counter for calculating the Hz or read rate
long unblockedValue; //Average IR at power up
long startTime; //Used to calculate measurement rate

void setup() {
  Serial.begin(9600);

  // Initialize sensor
  if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) { //Use default I2C port, 400kHz speed
    Serial.println("MAX30102 was not found. Please check wiring/power. ");
    while (1);
  }

  //Setup to sense up to 18 inches, max LED brightness
  byte ledBrightness = 0xFF; //Options: 0=Off to 255=50mA
  byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32
  byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  int sampleRate = 400; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411; //Options: 69, 118, 215, 411
  int adcRange = 2048; //Options: 2048, 4096, 8192, 16384
  
  //Configure sensor with these settings
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange);

  particleSensor.setPulseAmplitudeRed(0); //Turn off Red LED
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

  //Take an average of IR readings at power up
  unblockedValue = 0;
  for (byte x = 0 ; x < 32 ; x++) { unblockedValue += particleSensor.getIR(); //Read the IR value } unblockedValue /= 32; startTime = millis(); } void loop() { samplesTaken++; Serial.print("IR["); Serial.print(particleSensor.getIR()); Serial.print("] Hz["); Serial.print((float)samplesTaken / ((millis() - startTime) / 1000.0), 2); Serial.print("]"); long currentDelta = particleSensor.getIR() - unblockedValue; Serial.print(" delta["); Serial.print(currentDelta); Serial.print("]"); if (currentDelta > (long)100) {
    Serial.print(" Something is there!");
  }

  Serial.println();
}

خروجی سنجش حضور max30102 توجه داشته باشید که MAX30102 قادر است تا 18 بیت یا مقادیر تا 262144 را بخواند. این یعنی حتی یک حرکت بسیار کوچک قابل تشخیص است!

کد آردوینو سوم: اندازه گیری دما

مثال بعدی ما خوانش های سنسور دمای داخل برد را در هر دو واحد سانتیگراد و فارنهایت خروجی می دهد. اگرچه از خوانش دما باید برای کالیبره کردن اندازه‌گیری‌های HR و SpO2 استفاده شود، اما اگر به یک سنسور دما حساس و با پاسخ سریع نیاز دارید، می‌تواند مفید باشد.

#include 

#include "MAX30105.h"
MAX30105 particleSensor;

void setup() {
  Serial.begin(9600);
  Serial.println("Initializing...");

  // Initialize sensor
  if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) { //Use default I2C port, 400kHz speed
    Serial.println("MAX30102 was not found. Please check wiring/power. ");
    while (1);
  }

  //The LEDs are very low power and won't affect the temp reading much but
  //you may want to turn off the LEDs to avoid any local heating
  particleSensor.setup(0); //Configure sensor. Turn off LEDs

  particleSensor.enableDIETEMPRDY(); //Enable the temp ready interrupt. This is required.
}

void loop() {
  float temperature = particleSensor.readTemperature();

  Serial.print("temperatureC=");
  Serial.print(temperature, 4);

  float temperatureF = particleSensor.readTemperatureF();

  Serial.print(" temperatureF=");
  Serial.print(temperatureF, 4);

  Serial.println();
}

حالا سعی کنید سنسور را با انگشت خود گرم کنید.

خروجی سنسور دمای داخلی max30102

کد آردوینو چهارم: اندازه گیری ضربان قلب (BPM)

اینجاست که سرگرمی شروع می شود! در این مثال، ضربان قلب (ضربان در دقیقه یا BPM) فردی را که تحت نظر داریم اندازه می‌گیریم.

هشدار: این طرح ضربان قلب را به صورت نوری تشخیص می دهد. این روش دشوار و مستعد خواندن اشتباه است. بنابراین لطفا از آن برای تشخیص پزشکی واقعی استفاده نکنید.

#include 
#include "MAX30105.h"
#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

void setup() {
  Serial.begin(115200);
  Serial.println("Initializing...");

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println("MAX30102 was not found. Please check wiring/power. ");
    while (1);
  }
  Serial.println("Place your index finger on the sensor with steady pressure.");

  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
}

void loop() {
  long irValue = particleSensor.getIR();

  if (checkForBeat(irValue) == true) {
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20) {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);

  if (irValue < 50000)
    Serial.print(" No finger?");

  Serial.println();
}

پس از آپلود کد، انگشت خود را تا حد امکان روی سنسور ثابت نگه دارید و چند ثانیه صبر کنید تا قرائت ها منطقی شوند. نتیجه ای مثل این را خواهید دید.

خروجی ضربان قلب max30102

با اندازه گیری ضربان قلب مشکل دارید؟

اگر در دیدن ضربان قلب مشکل دارید، در اینجا گفته شده است چه کاری باید انجام دهید.

  • اگر سنسور را خیلی محکم بگیرید، تمام خون انگشتانتان را می فشارید و هیچ علامتی وجود نخواهد داشت! اگر آن را خیلی سبک نگه دارید، نویز ناشی از حرکت و نور محیط را فرا خواهید گرفت. بنابراین فشار انگشت خود را تا حد مناسب قرار بدهید.
  • فشار متغیر می‌تواند باعث شود که خون در انگشت شما جریان متفاوتی داشته باشد و باعث می‌شود خوانش حسگر ضعیف شود. سعی کنید با وصل کردن سنسور به انگشت خود با استفاده از یک کش لاستیکی یا سایر دستگاه های سفت کننده، فشار ثابتی اعمال کنید.
  • سنسور را در قسمت های مختلف بدن خود که دارای بافت مویرگی هستند (مانند لاله گوش یا لب پایین) امتحان کنید.

کد آردوینو پنجم: اندازه گیری اشباع اکسیژن (SpO2)

در آخرین کد، سطح اکسیژن خون (SpO2) فردی را که تحت نظر داریم اندازه گیری می کنیم. پیش بروید و کد را امتحان کنید.

#include 
#include "MAX30105.h"
#include "spo2_algorithm.h"

MAX30105 particleSensor;

#define MAX_BRIGHTNESS 255

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno doesn't have enough SRAM to store 100 samples of IR led data and red led data in 32-bit format
//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples become 16-bit data.
uint16_t irBuffer[100]; //infrared LED sensor data
uint16_t redBuffer[100];  //red LED sensor data
#else
uint32_t irBuffer[100]; //infrared LED sensor data
uint32_t redBuffer[100];  //red LED sensor data
#endif

int32_t bufferLength; //data length
int32_t spo2; //SPO2 value
int8_t validSPO2; //indicator to show if the SPO2 calculation is valid
int32_t heartRate; //heart rate value
int8_t validHeartRate; //indicator to show if the heart rate calculation is valid

byte pulseLED = 11; //Must be on PWM pin
byte readLED = 13; //Blinks with each data read

void setup()
{
  Serial.begin(115200); // initialize serial communication at 115200 bits per second:

  pinMode(pulseLED, OUTPUT);
  pinMode(readLED, OUTPUT);

  // Initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
  {
    Serial.println(F("MAX30105 was not found. Please check wiring/power."));
    while (1);
  }

  Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));
  while (Serial.available() == 0) ; //wait until user presses a key
  Serial.read();

  byte ledBrightness = 60; //Options: 0=Off to 255=50mA
  byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32
  byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  byte sampleRate = 100; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411; //Options: 69, 118, 215, 411
  int adcRange = 4096; //Options: 2048, 4096, 8192, 16384

  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
}

void loop()
{
  bufferLength = 100; //buffer length of 100 stores 4 seconds of samples running at 25sps

  //read the first 100 samples, and determine the signal range
  for (byte i = 0 ; i < bufferLength ; i++)
  {
    while (particleSensor.available() == false) //do we have new data?
      particleSensor.check(); //Check the sensor for new data

    redBuffer[i] = particleSensor.getRed();
    irBuffer[i] = particleSensor.getIR();
    particleSensor.nextSample(); //We're finished with this sample so move to next sample

    Serial.print(F("red="));
    Serial.print(redBuffer[i], DEC);
    Serial.print(F(", ir="));
    Serial.println(irBuffer[i], DEC);
  }

  //calculate heart rate and SpO2 after first 100 samples (first 4 seconds of samples)
  maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

  //Continuously taking samples from MAX30102.  Heart rate and SpO2 are calculated every 1 second
  while (1)
  {
    //dumping the first 25 sets of samples in the memory and shift the last 75 sets of samples to the top
    for (byte i = 25; i < 100; i++)
    {
      redBuffer[i - 25] = redBuffer[i];
      irBuffer[i - 25] = irBuffer[i];
    }

    //take 25 sets of samples before calculating the heart rate.
    for (byte i = 75; i < 100; i++)
    {
      while (particleSensor.available() == false) //do we have new data?
        particleSensor.check(); //Check the sensor for new data

      digitalWrite(readLED, !digitalRead(readLED)); //Blink onboard LED with every data read

      redBuffer[i] = particleSensor.getRed();
      irBuffer[i] = particleSensor.getIR();
      particleSensor.nextSample(); //We're finished with this sample so move to next sample

      //send samples and calculation result to terminal program through UART
      Serial.print(F("red="));
      Serial.print(redBuffer[i], DEC);
      Serial.print(F(", ir="));
      Serial.print(irBuffer[i], DEC);

      Serial.print(F(", HR="));
      Serial.print(heartRate, DEC);

      Serial.print(F(", HRvalid="));
      Serial.print(validHeartRate, DEC);

      Serial.print(F(", SPO2="));
      Serial.print(spo2, DEC);

      Serial.print(F(", SPO2Valid="));
      Serial.println(validSPO2, DEC);
    }

    //After gathering 25 new samples recalculate HR and SP02
    maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
  }
}

پس از آپلود، انگشت خود را تا حد امکان روی سنسور ثابت نگه دارید و چند ثانیه صبر کنید تا قرائت ها منطقی شوند. نتیجه ای مثل این را خواهید دید.

ضربان قلب max30102 و خروجی اشباع اکسیژن

حالا شما به خوبی نحوه کار با سنسور پالس اکسیمتر و ضربان قلب MAX30102 را میدانید!

5 (2 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید قرار بدهم. سوالات مربوط به این مطلب را در قسمت نظرات همین مطلب اعلام کنید. سعی میکنم در اسرع وقت به نظرات شما پاسخ بدهم.

برای ارسال تصاویر از انجمن سایت استفاده کنید.

سوالات فنی را در انجمن سایت مطرح کنید تا در مسابقه شرکت کنید. ورود به انجمن

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *