مقدمه
در این مقاله با روش ساخت پالس اکسیمتر توسط esp8266 و ماژول MAX30100 آشنا میشوید. برنامه به زبان C++ در Arduino IDE نوشته شده است و شما میتوانید از طریق موبایل (برنامه Blynk) و نمایشگر OLED نتیجه تست مقدار اکسیژن خون و ضربان قلب را مشاهده کنید.
چکیده
یکی از فاکتورهای مهم سلامت جسمی SpO2 (درصد اکسیژن در خون) است. با انجام این پروژه میتوانید یک پالس اکسیمتر داشته باشید که در روزهای کرونا میتواند ایزار مفیدی باشد. در انتهای این پروژه میشود درصد اکسیژن خون و ضربان قلب شخص مورد نظر را حتی از راه دور توسط اینترنت و اپلیکیشن Blynk زیر نظر گرفت.
این پالس اکسیمتر با دقت بالا و با قیمت بسیار کمتر از نمونه های بازار قابل تهیه است.
قطعات لازم برای ساخت پالس اکسیمتر
سنسور MAX30100
سنسور MAX30100 یک سنسور است که دوقابلیت پالس اکسیمتری و سنجش سرعت ضربان قلب را در خود دارد. این سنجش ها را از طریق اپتیک انجام میدهد و با یک مبدل آنالوگ به دیجیتال با نویز پایین مقادیر را اندازه میگیرد. ولتاژ تغذیه این سنسور میتواند بین 1.8 تا 3.3 ولت باشد.
این سنسور از مدهای کم مصرف نیز پشتبانی میکند تا مصرف باطری را به حداقل برساند.
ویژگیهای پالس اکسیمتر ESP8266
- 1 – عملکرد با ولتاژ 1.8 تا 3.3
- 2 – مصرف جریان بسیارکم در مد shut-down (حدود 0.7uA)
- 3 – مد اندازه گیری سریع
نحوه عملکرد سنسور MAX30100
دستگاه دارای دو LED است که یکی نور قرمز و دیگری نور مادون قرمز ساطع می کند. برای ضربان نبض، فقط نور مادون قرمز مورد نیاز است. هم نور قرمز و هم نور مادون قرمز برای اندازه گیری سطح اکسیژن خون استفاده می شود.
وقتی قلب خون را پمپاژ می کند، در نتیجه خون بیشتر، خون اکسیژن دار افزایش می یابد. با آرام شدن قلب، حجم خون اکسیژن دار نیز کاهش می یابد. با دانستن زمان بین افزایش و کاهش خون اکسیژن دار، ضربان نبض مشخص می شود.
به نظر می رسد، خون اکسیژن دار نور مادون قرمز بیشتری جذب می کند و نور قرمز بیشتری را از خود عبور می دهد در حالی که خون بدون اکسیژن نور قرمز را جذب می کند و نور مادون قرمز بیشتری را عبور می دهد. این عملکرد اصلی MAX30100 است: سطوح جذب را برای هر دو منبع نور می خواند و آنها را در یک بافر ذخیره می کند که می تواند از طریق I2C خوانده شود.
اتصال MAX30100 به ESP8266
برای اتصال پالس اکسی متر MAX30100 با NodeMCU ESP8266 و صفحه نمایش OLED 0.96 اینچی I2C، نمودار مدار و اتصال در زیر آورده شده است. می توانید دستگاه را دقیقاً مطابق شکل زیر مونتاژ کنید.
هر دو صفحه نمایش MAX30100 و OLED دارای پین های مشترک I2C هستند. بنابراین پایه های SDA آنها را به D2 و پایه های SCL را به D1 برد NodeMCU ESP8266 متصل کنید. منبع تغذیه مورد نیاز OLED Display & NodeMCU 3.3 ولت است. بنابراین ترمینال VCC آنها را به 3.3 ولت NodeMCU متصل کنید.
راه اندازی برنامه اندروید Blynk
Blynk برنامه ای است که روی دستگاه های اندروید و IOS اجرا می شود تا هر برنامه مبتنی بر IOT را با استفاده از تلفن های هوشمند کنترل کند. این به شما امکان می دهد رابط کاربری گرافیکی خود را برای برنامه IoT ایجاد کنید. در اینجا ما برنامه Blynk را برای نظارت بر BPM و SPO2 از طریق Wi-Fi با استفاده از NodeMCU ESP8266 راه اندازی می کنیم.
بنابراین برنامه Blynk را از فروشگاه Play دانلود و نصب کنید. کاربران IOS می توانند از اپ استور دانلود کنند. پس از اتمام نصب، برنامه را باز کنید و با استفاده از شناسه ایمیل و رمز عبور خود ثبت نام کنید.
برای مطالعه کامل در مورد نصب و راه اندازی Blynk به مقاله زیر مراجعه کنید.
روی “New Project” کلیک کنید. در پاپ آپ پارامترهایی مانند نام پروژه، تابلو و نوع اتصال را همانطور که در عکس بالا نشان داده شده است تنظیم کنید. برای این پروژه MAX30100 ESP8266 دستگاه را به عنوان NodeMCU و نوع اتصال را به عنوان Wi-Fi انتخاب کنید. سپس بر روی Create کلیک کنید.
اکنون روی علامت + کلیک کنید تا ویجت ها اضافه شوند. باید مقدار BPM & SpO2 را بخوانیم. بنابراین یک جفت ویجت به نام Value Display & Gauge را انتخاب کنید.
پس از کشیدن ویجت ها، پارامترهای آنها را مانند تصویر بالا تنظیم کنید. روی Value Display کلیک کنید و پین را روی “V7” و “V8” قرار دهید. به طور مشابه، در تنظیمات گیج، پین خروجی را روی “V7” و “V8” تنظیم کنید.
پس از ایجاد موفقیت آمیز پروژه، به تنظیمات برگردید و بر روی ارسال ایمیل کلیک کنید. شما یک شناسه احراز هویت در نامه ثبت شده دریافت خواهید کرد. شناسه Authenticate را برای مراجعات بعدی ذخیره کنید.
کد پروژه پالس اکسیمتر با MAX30100 و ESP8266
پس از انجام تنظیمات سخت افزاری، اکنون باید کد را در برد NodeMCU ESP8266-12E آپلود کنیم. اما قبل از آن باید چند کتابخانه را نصب کنید.
لینک دانلود کتابخانههای مورد نیاز:
#include
#include "MAX30100_PulseOximeter.h"
#define BLYNK_PRINT Serial
#include
#include
#include
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#define REPORTING_PERIOD_MS 1000
OakOLED oled;
char auth[] = "N-81lOStH83VwUeNuKHOzpLVzqjFXhHO"; // You should get Auth Token in the Blynk App.
char ssid[] = "BYNARK"; // Your WiFi credentials.
char pass[] = "bynark@123";
// Connections : SCL PIN - D1 , SDA PIN - D2 , INT PIN - D0
PulseOximeter pox;
float BPM, SpO2;
uint32_t tsLastReport = 0;
const unsigned char bitmap [] PROGMEM=
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x18, 0x00, 0x0f, 0xe0, 0x7f, 0x00, 0x3f, 0xf9, 0xff, 0xc0,
0x7f, 0xf9, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xf7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0x7f, 0xdb, 0xff, 0xe0,
0x7f, 0x9b, 0xff, 0xe0, 0x00, 0x3b, 0xc0, 0x00, 0x3f, 0xf9, 0x9f, 0xc0, 0x3f, 0xfd, 0xbf, 0xc0,
0x1f, 0xfd, 0xbf, 0x80, 0x0f, 0xfd, 0x7f, 0x00, 0x07, 0xfe, 0x7e, 0x00, 0x03, 0xfe, 0xfc, 0x00,
0x01, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void onBeatDetected()
{
Serial.println("Beat Detected!");
oled.drawBitmap( 60, 20, bitmap, 28, 28, 1);
oled.display();
}
void setup()
{
Serial.begin(115200);
oled.begin();
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0, 0);
oled.println("Initializing pulse oximeter..");
oled.display();
pinMode(16, OUTPUT);
Blynk.begin(auth, ssid, pass);
Serial.print("Initializing Pulse Oximeter..");
if (!pox.begin())
{
Serial.println("FAILED");
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0, 0);
oled.println("FAILED");
oled.display();
for(;;);
}
else
{
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0, 0);
oled.println("SUCCESS");
oled.display();
Serial.println("SUCCESS");
pox.setOnBeatDetectedCallback(onBeatDetected);
}
// The default current for the IR LED is 50mA and it could be changed by uncommenting the following line.
//pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
}
void loop()
{
pox.update();
Blynk.run();
BPM = pox.getHeartRate();
SpO2 = pox.getSpO2();
if (millis() - tsLastReport > REPORTING_PERIOD_MS)
{
Serial.print("Heart rate:");
Serial.print(BPM);
Serial.print(" bpm / SpO2:");
Serial.print(SpO2);
Serial.println(" %");
Blynk.virtualWrite(V7, BPM);
Blynk.virtualWrite(V8, SpO2);
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0,16);
oled.println(pox.getHeartRate());
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0, 0);
oled.println("Heart BPM");
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0, 30);
oled.println("Spo2");
oled.setTextSize(1);
oled.setTextColor(1);
oled.setCursor(0,45);
oled.println(pox.getSpO2());
oled.display();
tsLastReport = millis();
}
}
مشاهده مقادیر در نرم افزار Blynk
پس از آپلود کد، می توانید سریال مانیتور را باز کنید و موارد زیر را مشاهده کنید زیرا مقادیر BPM و SpO2 پس از اتصال NodeMCU به وای فای نمایش داده می شوند.
به طور مشابه می توانید صفحه نمایش OLED را بررسی کنید، همان مقادیر روی صفحه نمایش داده می شود.
در برنامه اندروید، مقدار BPM و SpO2 پس از یک ثانیه آپلود می شود و می توانید تغییر در پارامترهای اندازه گیری و نمایشگر را مشاهده کنید.
رفع مشکلات متداول MAX30100
اگر ماژول MAX30100 را که در زیر نشان داده شده است خریداری کرده اید، ممکن است کار نکند زیرا یک مشکل در طراحی دارد. آی سی MAX30100 از 1.8 ولت برای VDD استفاده می کند و این ماژول خاص از دو رگولاتور برای رسیدن به این ولتاژ استفاده می کند. ایرادی ندارد. با این حال، اگر دقت کنید، پین های SCL و SDA از طریق مقاومت های 4.7 کیلو اهم به 1.8 ولت کشیده می شوند! این بدان معناست که با میکروکنترلرهایی با سطوح منطقی بالاتر به خوبی کار نخواهد کرد.
راه حل این است که مقاومت ها را از برد (که در تصویر زیر محاط شده است) بردارید و به جای آن مقاومت های خارجی 4.7k اهم را به SDA، SCL و INT Pin متصل کنید.
پس از حذف تمام مقاومت های 4.7K، پین INT، SDA، SCL را به مقاومت بیرونی 4.7K Pull up متصل کنید، همانطور که در تصویر زیر نشان داده شده است.