آموزش مقدماتی آشنایی با آردینو با ببینید.
مقدار طبیعی اکسيژن خون و ضربان قلب
همانطور که گفته شد، یکی از علائم ابتلا به بیماری کرونا، کاهش میزان اکسیژن خون است.
در حالت عادی و برای یک فرد سالم، درصد وجود اکسیژن در خون، باید بالای ۹۳ درصد باشد. چنانچه کمتر از این مقدار، اکسیژن در خون وجود داشته باشد، فرد مشکوک به بیماری کرونا خواهد بود. البته سایر علائم، نطیر سرفه خشک، تب و سردرد می تواند از علایم دیگر ابتلا به این بیماری باشد. اما میزان اکسیژن خون، در شرایط فعلی، امری مهم است.
ضربان قلب نرمال یکی از علائم حیاتی بدن است، که به کمک بررسی آن میتوان به وضعیت سلامت بدن پی برد. در انسان به طور طبیعی، ضربان قلب نرمال 70 بار در دقیقه است و اگر بیش از 100 تپش باشد، تاکی کاردی و اگر کمتر از 50 ضربان باشد به آن برادی کاردی میگوییم.
اما در ورزشکاران و قهرمانان، تعداد ضربان قلب کمتر از افراد عادی است، چون قلب آنها قوی است و با یک ضربان، خون را به تمام اعضای بدن میرساند.
در رابطه با ضربان قلب، این مقدار در سنین مختلف، متفاوت خواهد بود. مطابق جدول زیر، میزان استاندارد ضربان قلب برای سنین مختلف، مشخص شده است.
برد توسعه NodeMCU
برد NodeMCU یک برد توسعه مبتنی بر ESP8266 هست؛ ماژول ESP8266 یک میکروکنترلر ۳۲ بیتی، با قابلیت اتصال به شبکه است. در حقیقت این ماژول، در حکم یک (System On Chip) عمل می کند. از دیگر ویژگی های مثبت این ماژول، برنامه نویسی آن به کمک کامپایلر آردوینو است.
به عبارت دیگر، برای کار و راه اندازی این ماژول، نیازی به یادگیری زبان برنامه نویسی جدید نداشته و با همان کدها و دستورات آردوینو می توانید از این ماژول استفاده نمایید. ماژول ESP8266 می تواند از سنسورها و ماژول هایی که با آردوینو راه اندازی می شود، پشتیبانی نماید. سنسور های دما، رطوبت، نمایشگرهای OLED و… همگی به سادگی با این ماژول راه اندازی می شوند.
آموزش راه اندازی NodeMCU را ببینید
سنسور 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
نمایشگر OLED
نمایشگرهای OLED نسل جدید از نمایشگرها در حوزه الکترونیک و کامپیوتر هستند. نمایشگر هایی با کانتراست و رزولوشن بالا ، از این رو قابلیت خوانایی زیادی را برای کاربر فراهم میکند.
این نوع ماژولها فاقد Backlight میباشند و نور پسزمینه را خودشان ایجاد میکنند از این رو نسبت به LCD ها باریکتر ، شفافتر و شکیل تر به نظر میرسند. این نوع ماژول یک نوع نمایشگر تک رنگ با رزولوشن 128*64 میباشد که برای کنترل آن از درایور SSD1306 استفاده شده است.
ماژول OLED با پروتکل ارتباطی I2C قابلیت ارتباط با میکروکنترلر و آردوینو توسط پروتکل I2C را دارد. زاویه دید حداکثر 160 درجه و همچنین کنتراست بالای این نوع نمایشگرها از ویژگیهایی است که باعث برتری این نوع نمایشگر می شود.
از این نمایشگر ها در ساعت های هوشمند، گجت های پوشیدنی و… به وفور استفاده می گردد. در این پروژه ما هم از این نمایشگر برای نمایش اطلاعات مربوط به میزان ضربان قلب و اکسیژن خون کاربر، استفاده می نماییم.
مدار پروژه اکسی متر با 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 به صورت موازی است.
کد های پروژه اکسی متر NodeMCU با کامپایلر آردوینو
#include
#include "MAX30100_PulseOximeter.h"
#include
#include
#include
#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 قرار دارد.
برای استفاده از ابزار آنلاین تبدیل عکس به کد هگز کلیک کنید.
سلام و عرض ادب
ماژول نمایشگر رو میشه تک رنگ گذاشت یا باید دو رنگ باشد
سلام نمایشگر فقط جنبه ظاهری داره و هر دو مدل رو میتونید استفاده کنید!
سلام خسته نباشید
من کد رو آپلود کردم و بعد آپلود نود ام سی یو فقط ال ای دیش وای فاش چشمک میزنه اما وقتی من در فیلم که شما تستش میکردید در سایت اونجوری نبود مشکلی نداره
با تشکر از شما
سلام، مشکلی نداره LED روی برد فقط یک نشانگر هست. عملکرد پروژه اگر خوبه اوکیع
سلام من همه کتابخانه ها رو زدم اما خط پنج که یک کتابخانه داره میزنم نمیاره میشه راهنماییم کنید یا در یک پیام رسان فیلم آموزشی بفرستید مرسی اینم خطایی هست که میده تشکر 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
برنامتون رو از چه منبعی نوشتید؟ فکر میکنم در ابتدای برنامه اسم کتابخانه را ناقص وارد کرده باشید؛ MAX30100_PulseOximeter.h را تست کنید!
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
این خطا به این دلیل رخ میدهد که کتابخانه Adafruit_I2CDevice در پروژه شما وجود ندارد و یا به درستی وارد نشده است. برای رفع این مشکل، مراحل زیر را انجام دهید:
ابتدا اطمینان حاصل کنید که کتابخانه Adafruit_I2CDevice به صورت صحیح در سیستم شما نصب شده باشد.
اگر کتابخانه را قبلاً نصب کردهاید، مطمئن شوید که به درستی در پروژه شما وارد شده باشد.
اگر هنوز کتابخانه را نصب نکردهاید، میتوانید از منوی Sketch > Include Library > Manage Libraries در نرمافزار آردوینو استفاده کنید تا کتابخانه را جستجو کنید و نصب کنید.
سلام و عرص ادب عالی بود تشکر فقط نمیدونم چرا خطا میده میشه راهنماییم کنید خیلی متشکرم
سلام لطفا خطا رو بنویسید تا برسی کنم!
سلام بعد اجرا همچین اروری برای من میاد
grpc: error while marshaling: proto: Marshal called with nil
Compilation error: grpc: error while marshaling: proto: Marshal called with nil
سلام تصویر کامل ارور رو داخل واتساپ برام بفرستید برسی کنم 09140360836
ممنون از اظلاعات مفید و صحیح و درستتان ادمین عزیز.کد برنامه نویسی برای اجرای پالس عالی و پرفکت بود منتهی من برای ماکس سی صد دوتا کتابخانه دان کردم چونکه در ابتدا خطا دریافت کردم.
خوشحالم براتون مفید بوده، برای استفاده از برنامه کتابخانه های لازم باید نصب بشن!