پرش به محتوا

پروژه آردوینو – اکسی متر و ضربان قلب (MAX30100)

در تجهیزات پزشکی به کمک سنسور ها مقادیر مختلف بدن مخصوصا خون را جهت معاینه، اندازه گیری میکنند. بسیاری از بیماری ها با همین آزمایش های ساده قابل تشخیص هستن؛ مثلا در بیماری کرونا که به شدت با اون درگیر هستیم، درصد اکسیژن خون احتمال ابتدا به این بیماری را نشان می دهد. سنسور های بسیاری برای اکسی متر جهت اندازه گیری اکسیژن خون وجود دارند و در این پروژه ما از MAX30100 استفاده میکنیم و با پردازنده ESP8266 (NodeMCU) و نمایشگر OLED مقدار اکسیژن خون و ضربان قلب را با آردوینو اندازه گیری و نمایش می دهیم.
آردوینو اکسی متر max30100

مقدار طبیعی اکسيژن خون و ضربان قلب

همانطور که گفته شد، یکی از علائم ابتلا به بیماری کرونا، کاهش میزان اکسیژن خون است.
در حالت عادی و برای یک فرد سالم، درصد وجود اکسیژن در خون، باید بالای ۹۳ درصد باشد. چنانچه کمتر از این مقدار، اکسیژن در خون وجود  داشته باشد، فرد مشکوک به بیماری کرونا خواهد بود. البته سایر علائم، نطیر سرفه خشک، تب و سردرد می تواند از علایم دیگر ابتلا به این بیماری باشد. اما میزان اکسیژن خون، در شرایط فعلی، امری مهم است.

آردوینو اکسی متر max30100

ضربان قلب نرمال یکی از علائم حیاتی بدن است، که به کمک بررسی آن می‌توان به وضعیت سلامت بدن پی برد. در انسان به طور طبیعی، ضربان قلب نرمال 70 بار در دقیقه است و اگر بیش از 100 تپش باشد، تاکی کاردی و اگر کمتر از 50 ضربان باشد به آن برادی کاردی می‌گوییم. 
اما در ورزشکاران و قهرمانان، تعداد ضربان قلب کمتر از افراد عادی است، چون قلب آنها قوی است و با یک ضربان، خون را به تمام اعضای بدن می‌رساند.

در رابطه با ضربان قلب، این مقدار در سنین مختلف، متفاوت خواهد بود.  مطابق جدول زیر،  میزان استاندارد ضربان قلب برای سنین مختلف، مشخص شده است.

آردوینو اکسی متر max30100

برد توسعه NodeMCU

برد NodeMCU یک برد توسعه مبتنی بر ESP8266 هست؛ ماژول ESP8266 یک میکروکنترلر ۳۲ بیتی، با قابلیت اتصال به شبکه است. در حقیقت این ماژول، در حکم یک (System On Chip) عمل می کند. از دیگر ویژگی های مثبت این ماژول، برنامه نویسی آن به کمک کامپایلر آردوینو است.
به عبارت دیگر، برای کار و راه اندازی این ماژول، نیازی به یادگیری زبان برنامه نویسی جدید نداشته و با همان کدها و دستورات آردوینو می توانید از این ماژول استفاده نمایید. ماژول ESP8266 می تواند از سنسورها و ماژول هایی که با آردوینو راه اندازی می شود، پشتیبانی نماید. سنسور های دما، رطوبت، نمایشگرهای OLED و… همگی به سادگی با این ماژول راه اندازی می شوند.

آموزش راه اندازی NodeMCU را ببینید

آردوینو اکسی متر max30100

سنسور MAX30100

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

آردوینو اکسی متر max30100

مشخصات فنی و ویژگی های کلی MAX30100

  • ولتاژ کاری 1.8 الی 3.3
  • قابلیت اندازه گیری ضربان قلب
  • قابلیت اندازه گیری اکسیژن خون
  • تنظیم مدکاری در حالت فعال و یا خاموش
  • دارای پورت ارتباطی I2C
  • جهت دریافت فرمان و ارسال داده
  • جریان مصرفی بسیار پایین و در حدود 0.7 میکروآمپر در حالت خاموش (بدون در نظر گرفتن سایر المان های ماژول)

الزامات و نکات فنی MAX30100

ماژول پالس اکسی متر MAX30100، دارای پورت ارتباط I2C جهت ارتباط با بردهای آردوینو، ESP وسایر میکروکنترلرها است. از آنجایی که سطح ولتاژ منطقی پورت I2C این ماژول در حدود 1.8 برای یک منطقی است، بنابراین جهت ارتباط با میکروکنترلرها، دقت نظر لازم را در نظر داشته باشید.

روش ساده و پیشنهادی ما حذف مقاومت های پول آپ پایه های I2C ماژول هست؛ 3مقاومت 4.7 کیلو اهمی روی برد هست که به ولتاژ 1.8 پول آپ است. 

پس از حذف این 3 مقاومت باید در طراحی خود مقاومت های 4.7 کیلو اهمی جهت پول آپ پایه های I2C در نظر بگیرید که به ولتاژ 3.3 ولت پول آپ شود.

در پروژه اکسی متر MAX30100 با آردوینو به دلیل استفاده از ESP8266 به عنوان پردازنده که ولتاژ کاری آن 3.3 ولت است، مقاومت های پول آپ را به 3.3 ولت متصل کردیم ولی اگر از پردازنده دیگری استفاده میکنید که با 5 ولت کار میکند باید مقاومت های پول آپ به 5 ولت متصل شود.

کتابخانه های استفاده شده آردوینو

 (MAX30100_PulseOximeter.h) جهت دریافت اطلاعات از سنسور

(Wire.h) برای راه اندازی پورت I2C و اتصال سنسور و نمایشگر به صورت موازی به این پورت

(Adafruit_GFX.h) و (Adafruit_SSD1306.h) برای نمایش اطلاعات و تصاویر بر روی نمایشگر OLED

آردوینو اکسی متر max30100

نمایشگر OLED

نمایشگرهای OLED نسل جدید از نمایشگرها در حوزه الکترونیک و کامپیوتر هستند. نمایشگر هایی با کانتراست و رزولوشن بالا ، از این رو قابلیت خوانایی زیادی را برای کاربر فراهم می‌کند.
این نوع ماژول‌ها فاقد Backlight  می‌باشند و نور پس‌زمینه را خودشان ایجاد می‌کنند از این رو نسبت به LCD ها باریک‌تر ، شفاف‌تر و شکیل تر به نظر می‌رسند. این نوع ماژول یک نوع نمایشگر تک رنگ  با رزولوشن 128*64 می‌باشد که برای کنترل آن از درایور SSD1306 استفاده شده است.  
ماژول OLED با پروتکل ارتباطی I2C
قابلیت ارتباط با میکروکنترلر و آردوینو توسط پروتکل I2C را دارد. زاویه دید حداکثر 160 درجه و همچنین کنتراست بالای این نوع نمایشگر‌ها از ویژگی‌هایی است که باعث برتری این نوع نمایشگر می شود.
از این نمایشگر ها در ساعت های هوشمند، گجت های پوشیدنی و… به وفور استفاده می گردد. در این پروژه ما هم از این نمایشگر برای نمایش اطلاعات مربوط به میزان ضربان قلب و اکسیژن خون کاربر، استفاده می نماییم.

آموزش جامع راه اندازی OLED با آردوینو

ماژول نمایشگر Oled 1306 تبدیل عکس به هگز oled آردوینو

مدار پروژه اکسی متر با Nodemcu و آردوینو

اتصالات MAX30100 را به صورت زیر، در نظر بگیرید.

vin سنسور MAX30100 به پایه 3.3 ولت برد NodeMCU
GND سنسور MAX30100 به پایه GND برد NodeMCU
SCL سنسور MAX30100 به پایه D1 برد NodeMCU
SDA سنسور MAX30100 به پایه  D2 برد NodeMCU

  • بین پایه های SCL  و VIN مقاومت 4.7k اهم به عنوان پول آپ قرار بدید.
  • بین پایه های SDA  و VIN مقاومت 4.7k اهم به عنوان پول آپ قرار بدید.

همچنین، اتصالات نمایشگر OLED را به صورت زیر، در نظر بگیرید.

vin نمایشگر OLED به پایه 3.3 ولت برد NodeMCU
GND نمایشگر OLED به پایه GND برد NodeMCU
SCL نمایشگر OLED به پایه D1 برد NodeMCU
SDA نمایشگر OLED به پایه  D2 برد NodeMCU

توجه داشته باشید اتصال سنسور و نمایشگر به پورت I2C به صورت موازی است.

آردوینو اکسی متر max30100

کد های پروژه اکسی متر NodeMCU با کامپایلر آردوینو

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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/Picopixel.h>

#define OLED_RESET LED_BUILTIN // 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

Adafruit_SSD1306 display(128, 64, &Wire ,OLED_RESET);
//Adafruit_SSD1306 display(OLED_RESET);

#define REPORTING_PERIOD_MS     500
// PulseOximeter is the higher level interface to the sensor
// it offers:
//  * beat detection reporting
//  * heart rate calculation
//  * SpO2 (oxidation level) calculation
PulseOximeter pox;

uint32_t tsLastReport = 0;
// Callback (registered below) fired when a pulse is detected

static const unsigned char test_bits[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x1f, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 
  0xe0, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1f, 0x07, 0xf8, 0x3c, 0x00, 
  0x00, 0x00, 0x3c, 0x3f, 0xfe, 0x1e, 0x00, 0x00, 0x00, 0x78, 0xff, 0xff, 0x87, 0x00, 0x00, 0x00, 
  0x73, 0xe0, 0x03, 0xf0, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x0f, 0x0f, 
  0xf8, 0x78, 0x00, 0x00, 0x00, 0x1c, 0x7f, 0xff, 0x8e, 0x00, 0x00, 0x00, 0x38, 0xf8, 0x07, 0x87, 
  0x00, 0x00, 0x00, 0x71, 0xe0, 0x03, 0xc7, 0x00, 0x00, 0x00, 0x73, 0xc1, 0xc0, 0xe3, 0x80, 0x00, 
  0x00, 0xe7, 0x1f, 0xfc, 0x78, 0x00, 0x00, 0x01, 0xcf, 0x3e, 0x3e, 0x38, 0x00, 0x00, 0x00, 0x8e, 
  0x78, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x0e, 0xf0, 0x03, 0x9c, 0x80, 0x00, 0x00, 0x18, 0xe7, 0xf1, 
  0x8c, 0xc0, 0x00, 0x00, 0x39, 0xcf, 0xf9, 0xce, 0xc0, 0x00, 0x00, 0x71, 0x9e, 0x3c, 0xc6, 0xc0, 
  0x00, 0x01, 0xe3, 0x1c, 0x1c, 0xc6, 0xe0, 0x00, 0x01, 0xc7, 0x18, 0x8c, 0xc6, 0xe0, 0x00, 0x01, 
  0x8f, 0x39, 0xcc, 0xc6, 0xe0, 0x00, 0x00, 0x0e, 0x71, 0xcc, 0xcc, 0xe0, 0x00, 0x00, 0x3c, 0xe3, 
  0x8c, 0xcc, 0xe0, 0x00, 0x00, 0x78, 0xe3, 0x1c, 0xcc, 0xe0, 0x00, 0x00, 0xf1, 0xc7, 0x1d, 0xcc, 
  0xe0, 0x00, 0x01, 0xc7, 0x9e, 0x39, 0x9c, 0xc0, 0x00, 0x01, 0x8f, 0x1e, 0x31, 0x98, 0xc0, 0x00, 
  0x00, 0x0f, 0x1c, 0x71, 0x98, 0xc0, 0x00, 0x00, 0x3e, 0x38, 0xe1, 0x9c, 0xc0, 0x00, 0x00, 0x70, 
  0xe1, 0xdd, 0x8c, 0x00, 0x00, 0x01, 0xf0, 0xe3, 0xdd, 0x8e, 0x00, 0x00, 0x01, 0xc3, 0xc7, 0x9d, 
  0x87, 0x00, 0x00, 0x00, 0x0f, 0x1e, 0x38, 0xc7, 0x80, 0x00, 0x00, 0x0f, 0x1e, 0x38, 0xe3, 0x80, 
  0x00, 0x00, 0x3c, 0x38, 0x38, 0x70, 0x00, 0x00, 0x00, 0x78, 0x70, 0x1c, 0x78, 0x00, 0x00, 0x00, 
  0x61, 0xe7, 0x9c, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xdf, 0xce, 0x04, 0x00, 0x00, 0x00, 0x07, 0x9f, 
  0xc7, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x3c, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x30, 0x61, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

void onBeatDetected()
{
Serial.println("Beat!");
}
void setup()
{
  Serial.begin(115200);
  Serial.println("SSD1306 128x64 OLED TEST");
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
  
  //display.setFont(&Picopixel);    
  lcd_start(pox.begin());
  delay(2000);
  if (!pox.begin()) {
    Serial.println("FAILED");
    for(;;);
  } else {
    Serial.println("SUCCESS");
  }
  // The default current for the IR LED is 50mA and it could be changed
  //   by uncommenting the following line. Check MAX30100_Registers.h for all the
  //   available options.
  pox.setIRLedCurrent(MAX30100_LED_CURR_50MA);
  // Register a callback for the beat detection
  pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
  pox.update();
  int bpm = 0;
  int spo2 = 0;
  // Asynchronously dump heart rate and oxidation levels to the serial
  // For both, a value of 0 means "invalid"
  if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
    //Serial.print("Heart rate:");
    bpm = pox.getHeartRate();
    spo2 = pox.getSpO2();
    Serial.println(bpm);
    //Serial.print("bpm / SpO2:");
    Serial.println(spo2);
    //Serial.println("%");
    tsLastReport = millis();
    lcd(bpm, spo2);
  }
}

void lcd(int hr , int spo2)
{ 
display.clearDisplay();
if(hr==0 || spo2==0 )
    { 
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);  
    display.print("MAX30100 Oximeter...");
    display.drawBitmap( 70, 16, test_bits, 50, 50, WHITE);
    display.setTextSize(3);
    display.setCursor(0, 25);  
    display.print("Scan");     
    } 
else
    {  
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0, 0);
    display.println("MAX30100 Oximeter...");
    display.setTextSize(2);
    display.println("");
    display.setCursor(0, 20);  //تنظیم موقعیت جهت نمایش داده
    display.print("S:");  //عبارت s بیانگر اکسیژن خون است
    display.print(spo2);
    display.setTextSize(1);display.print(" %");display.setTextSize(2);
    display.setCursor(0, 46);   //تنظیم موقعیت صفحه برای نمایش متغیر ضربان قلب
    display.print("H:");  
    display.print(hr);
    display.setTextSize(1);display.print(" BPM");display.setTextSize(2); 
    }
display.display(); 
//pox.resume();    
}

void lcd_start(bool check)
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("MAX30100.."); 
display.setTextSize(2); 
display.setTextColor(WHITE);
display.setCursor(0, 20);
while (!check) 
    {
    display.print("FAILED!!!");  
    display.display(); 
    ESP.restart();
    } 
if(check) 
    {
    display.println("SUCCESS>>");  
    }       
display.setTextSize(1);
display.setTextColor(WHITE);     
display.setCursor(28, 50);
display.print(">WELCOME<");     
display.display();    
}
				
			

در این پروژه از یک تصویر (اثر انگشت) در نمایشگر برای جلوه بیشتر قرار گرفه است؛ که کد های عکس مذکور در برنامه بالا از خط 25 الی 48 قرار دارد.
برای استفاده از ابزار آنلاین تبدیل عکس به کد هگز کلیک کنید.

دانلود فایل های پروژه اکسی متر و ضربان قلب با Nodemcu به زبان آردوینو

دانشجوی رشته مکاترونیک صنعتی هستم و در زمینه اتوماسیون و توسعه صنعت فعالیت میکنم. سعی میکنم تجربیات و خورده دانشی که از الکترونیک دارم را با شما به اشتراک بگذارم.

شاید این مطالب براتون جذاب باشه!

14 دیدگاه دربارهٔ «پروژه آردوینو – اکسی متر و ضربان قلب (MAX30100)»

  1. سلام خسته نباشید
    من کد رو آپلود کردم و بعد آپلود نود ام سی یو فقط ال ای دیش وای فاش چشمک میزنه اما وقتی من در فیلم که شما تستش میکردید در سایت اونجوری نبود مشکلی نداره
    با تشکر از شما

  2. سلام من همه کتابخانه ها رو زدم اما خط پنج که یک کتابخانه داره میزنم نمیاره میشه راهنماییم کنید یا در یک پیام رسان فیلم آموزشی بفرستید مرسی اینم خطایی هست که میده تشکر C:\Users\metait\AppData\Local\Temp\Rar$DIa16372.41179\Source\Source.ino:5:10: fatal error: PulseOximeter.h: No such file or directory
    5 | #include “PulseOximeter.h”
    | ^~~~~~~~~~~~~~~~~
    compilation terminated.

    exit status 1

    Compilation error: PulseOximeter.h: No such file or directory

  3. In file included from C:\Users\metait\AppData\Local\Temp\Rar$DIa15736.48958\Source\Source.ino:7:
    c:\Users\metait\Documents\Arduino\libraries\Adafruit_GFX_Library/Adafruit_GFX.h:12:10: fatal error: Adafruit_I2CDevice.h: No such file or directory
    12 | #include
    | ^~~~~~~~~~~~~~~~~~~~~~
    compilation terminated.

    exit status 1

    Compilation error: exit status 1

    1. این خطا به این دلیل رخ می‌دهد که کتابخانه Adafruit_I2CDevice در پروژه شما وجود ندارد و یا به درستی وارد نشده است. برای رفع این مشکل، مراحل زیر را انجام دهید:

      ابتدا اطمینان حاصل کنید که کتابخانه Adafruit_I2CDevice به صورت صحیح در سیستم شما نصب شده باشد.
      اگر کتابخانه را قبلاً نصب کرده‌اید، مطمئن شوید که به درستی در پروژه شما وارد شده باشد.
      اگر هنوز کتابخانه را نصب نکرده‌اید، می‌توانید از منوی Sketch > Include Library > Manage Libraries در نرم‌افزار آردوینو استفاده کنید تا کتابخانه را جستجو کنید و نصب کنید.

  4. سلام و عرص ادب عالی بود تشکر فقط نمیدونم چرا خطا میده میشه راهنماییم کنید خیلی متشکرم

  5. سلام بعد اجرا همچین اروری برای من میاد
    grpc: error while marshaling: proto: Marshal called with nil

    Compilation error: grpc: error while marshaling: proto: Marshal called with nil

  6. ممنون از اظلاعات مفید و صحیح و درستتان ادمین عزیز.کد برنامه نویسی برای اجرای پالس عالی و پرفکت بود منتهی من برای ماکس سی صد دوتا کتابخانه دان کردم چونکه در ابتدا خطا دریافت کردم.

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

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

تماس با ما

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید

ورود به حساب کاربری