آموزش Espآموزش ESP32آموزش اینترنت اشیاپروژه های Espپروژه های اینترنت اشیا

ثبت ضربان قلب در اینترنت با پالس اکسیمتر MAX30100

پالس اکسیمتری یک ابزار اندازه گیری پزشکی است که به طور گسترده ای مورد استفاده قرار می گیرد و یک تست بی ضرر و بدون درد است. سطح اشباع اکسیژن را در خون ما اندازه گیری می کند و به راحتی می تواند تغییرات کوچک در اکسیژن را تشخیص دهد. با توجه به جریان داشتن Covid-19 ، ردیابی سطح اکسیژن چندین بیمار به طور همزمان از راه دور بدون تماس با بیمار یک مسئله مهم است.

بنابراین، در این پروژه، ما یک اکسیمتر پالس با استفاده از ماژول MAX30100 و ESP32 می سازیم که سطح اکسیژن خون را ردیابی می کند و داده ها را از طریق اینترنت با اتصال به شبکه Wi-Fi ارسال می کند. به این ترتیب، ما می توانیم چندین بیمار را از راه دور با حفظ فاصله اجتماعی از بیماران نظارت کنیم. داده های به دست امده به صورت یک نمودار نشان داده می شود که ردیابی و تجزیه و تحلیل وضعیت بیمار را آسان تر می کند. همچنین پیش از این، ما چند نمایشگر ضربان قلب را با استفاده از سنسورهای پالس ساخته ایم.

به غیر از کاربرد در اپیدمی Covid-19، این پروژه همچنین می تواند به طور گسترده ای در بیماری مزمن انسدادی ریه (COPD)، آسم، ذات الریه، سرطان ریه، کم خونی، حمله قلبی یا نارسایی قلبی یا نقص مادرزادی قلب استفاده شود.

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

سنسور MAX30100

MAX30100 سنسور یکپارچه پالس اکسیمتری و ماژول مانیتور ضربان قلب است. این ماژول از طریق ارتباط I2C متصل میشود و اطلاعات SpO2 و Pulse را به واحد میکروکنترلر میزبان ارائه می دهد. این ماژول از حسگرهای نوری استفاده می کند، جایی که المان های نوری سبز، قرمز باشند IR LED پالس های LED را شناسایی می کند. جریان LED از 0 تا 50mA قابل تنظیم است. تصویر زیر سنسور MAX30100 را نشان می دهد.

پالس اکسیمتر

ماژول فوق با محدوده ولتاژی 1.8V تا 5.5V کار می کند. مقاومت های pull-up برای پین های I2C در ماژول گنجانده شده است.

قطعات مورد نیاز

  1. یک اتصال WiFi
  2. ESP32
  3. سنسور MAX30100
  4. شناسه کاربری Adafruit IO و ایجاد داشبورد مورد نیاز (آموزش ایجاد در همین مقاله داده میشود)
  5. منبع تغذیه 5V با جریان نامی حداقل 1A
  6. کابل میکرو USB) USB به USBA)
  7. یک کامپیوتر دارای Arduino IDE با قابلیت برنامه نویسی ESP32

مدار اکسیمتر MAX30100 با ESP32

ترسیم مداری کامل برای MAX30100 با ESP32 در زیر آورده شده است.

مدار اکسیمتر MAX30100 با ESP32

این یک ترسیم مداری بسیار ساده است. پین 21 و 22 از ESP32 devkit به سنسور اکسیمتر پالس MAX30100 با پین SDA و SCL متصل می شود. اکسیمتر همچنین توسط پین 5V برد توسعه ESP32 تغذیه می شود. اتصالات گفته شده را با استفاده از یک برد بورد و سیم راه اندازی کردیم و به صورت زیر در آمده است.

اتصال پالس اکسیمتر به esp32

Adafruit IO برای ESP32 برای مانیتورینگ ضربان قلب

ما قبلا بسیاری از پروژه های Adafruit IO را برای پروژه های مختلف IoT ایجاد کرده ایم. Adafruit IO یک پلتفرم عالی است که در آن می توان داشبورد شخصی سازی شده ایجاد کرد. برای ایجاد این چنین داشبورد برای سنسور Pulse-Oximeter مبتنی بر IoT، از مراحل زیر استفاده کنید

مرحله 1: ابتدا پس از وارد کردن نام ، نام خانوادگی، ادرس ایمیل، نام کاربری و رمز عبور، در adafruit IO ثبت نام کنید.

Adafruit IO برای ESP32 برای مانیتورینگ ضربان قلب

مرحله 2: پنجره داشبورد خالی پس از اتمام فرایند ورود به سیستم باز خواهد شد. در این بخش، ما باید یک داشبورد ایجاد کنیم تا داده ها را به روش های مختلف نشان دهیم. پس، الان باید داشبورد جدید را ایجاد کنیم و برای آن یک نام  و توضیحات وارد کنیم.

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

ایجاد داشبرد آدافروت

مرحله 3: پس از پر کردن فرم فوق، وقت ایجاد نمودار و بخش کنترل برای سنسور است.

اضافه کردن بلاک به داشبرد اینترنت اشیا

در این مرحله بلوک سوئیچ را انتخاب کنید. ( برای روشن یا خاموش کردن سنسور پالس اکسیمتر)

پروژه esp32 iot

مرحله 4: نام بلوک ایجاد شده را بنویسید. همانطور که در تصویر بالا می بینیم، این سویچ برای ما دو حالت روشن و خاموش را فراهم می کند. دوباره همین مراحل را طی کنید، این بار بلوک گراف را انتخاب کنید.

اضافه کردن نمودار

بر روی گراف دو بار کلیک کنید تا دو گراف ایجاد شود، یکی برای ضربان قلب و دیگری برای SpO2. بعد از آن هر دو بخش ایجاد می شود. الان ما تمام امکانات مورد نیازمان برای نمایش و کنترل سنسور ایجاد کردیم.

انتخاب فید ها

مرحله 5: گام بعدی و نهایی این است که key adafruit را دریافت کنیم. همانطور که می بینید ، ما key adafruit را دریافت کردیم و در نهایت این key باید در کد اضافه شود.

اطلاعات آدافروت

بعد از پیکربندی Adafruit IO وقت آن است که سخت افزار را آماده کنید و کد ها را برای این پروژه ایجاد کنیم.

توضیحات کد

این کد از بسیاری از کتابخانه ها استفاده می کند و همه آن ها مهم هستند. این کتابخانه ها شامل کتاب خانه سنسور MAX30100 پالس اکسیمتر Wire.h برای I2C و WiFi.h برای پشتیبانی مربوط به WiFi در ESP32 و Adafruit MQTT و  کتابخانه Client MQTT هستند. کد کامل کتابخانه ها را می توان در پایین این صفحه ببینید.

کتابخانه هایی که در بالا ذکر شد در ابتدای کد گنجانده شده اند.

#include <stdint.h>
#include <Wire.h>
#include <WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "MAX30100_PulseOximeter.h"  //used arduino builtin MAX30100 lib (https://github.com/oxullo/Arduino-MAX30100)

حال نوبت به اتصال به وای فای میرسد WLAN SSID و WLAN Password دو مقداری هستند که تعریف میکنیم. این مقادیر باید ثابت باشد و از آن توسط ESP32 برای اتصال به شبکه WiFi استفاده می شود.

#define WLAN_SSID  "xxxxxxxxx"
#define WLAN_PASS  "2581xxxxx2"

در گام بعد تنظیمات Adafruit io را انجام میدهیم.

#define AIO_UPDATE_RATE_SEC 5
#define AIO_SERVER  "io.adafruit.com"
#define AIO_SERVERPORT  1883                
#define AIO_USERNAME  "xxxxxxxxxxxxx"
#define AIO_KEY "abcdefgh"

نرخ به روز رسانی داده ها را بر روی هر 5 ثانیه تنطیم میکنیم، پورت سرور برای io.adafruit.com را روی عدد 1883 تنظیم میکنیم. نام کاربری و رمز عبور همان نام کاربری و رمز عبور تولید شده از داشبورد adafruit IO می باشد. این مقدار برای همه متفاوت خواهد بود و باید با توجه به توضیحات در بخش adafruit تولید شود و پس از ان در کد وارد شود.

پورت های I2C را همانطور که در شماتیک نشان داده شده است تعریف می میکنیم .

#define I2C_SDA 21
#define I2C_SCL 22

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

uint32_t tsLastReport = 0;
float bpm_dt=0;
float spo2_dt = 0;

MQTT با یک مدل pub-sub کار می کند (publish and subscribe). در این مدل کاری، دستگاهی که داده ها را به سرور Adafruit ارسال می کند، در حالت انتشار (publish)باقی می ماند که سرور Adafruit IO مشترک (subscribe) همان نقاط داده است (که داده ها به انجا ارسال میشود). در چنین اثری، هر زمان که دستگاه هر گونه داده جدید را منتشر می کند، سرور، همانطور که مشترک همان نقطه است، داده ها را دریافت می کند و اقدامات لازم را انجام می دهد.

همین اتفاق زمانی می افتد که سرور داده ها را منتشر (publish) می کند و دستگاه به ان نقطه مشترک (subscribe) می شود. در برنامه ما، دستگاه داده های SPO2 و BPM را به سرور ارسال می کند، بنابراین داده را منتشر(publish) می کند و حالت ON-OFF را از سرور دریافت می کند، بنابراین به این نقطه مشترک (subscribe) می شود. این اتفاق در کد زیر شرح داده شده است.

WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);         
Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/switch");
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Publish bpm_pub = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/bpm");
Adafruit_MQTT_Publish spo2_pub = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/SpO2");

در  تابع setup ، ما I2C را شروع می کنیم، WiFi را با SSID و رمز عبور از پیش تعریف شده متصل می کنیم و فرایند مشترک(subscribe) شدن MQTT را برای حالت سوئیچ شروع می کنیم (دکمه سوئیچ ایجاد شده در داشبورد Adafruit IO).

void setup()
{
            Serial.begin(115200);
            Wire.begin(I2C_SDA, I2C_SCL);
            WiFi.begin(WLAN_SSID, WLAN_PASS);
            while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
            }
            Serial.println();
            Serial.println("WiFi connected");
            Serial.println("IP address: "); Serial.println(WiFi.localIP());
            mqtt.subscribe(&sw_sub);
            Serial.print("Initializing pulse oximeter..");
            // Initialize the PulseOximeter instance
            // Failures are generally due to an improper I2C wiring, missing power supply
            // or wrong target chip
            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_7_6MA);
            // Register a callback for the beat detection
            pox.setOnBeatDetectedCallback(onBeatDetected);
            stopReadPOX();
}

پس از همه اینها، max30100 را با تنظیم led curren فعال می کنیم. تنظیمات مختلف دیگری نیز در هدر فایل های MAX30100 برای حالت های مختلف دیگر در دسترس هستند. یک تابع call back تشخیص ضربان قلب  نیز فعال شده است. پس از تمام این تنظیمات، سنسور اکسیمتر متوقف می شود.

در تابع  loop ، اتصال MQTT فعال می شود و مدل اشتراک(subscribe) در هر 5000 میلی ثانیه بررسی می شود. در این وضعیت، اگر سوئیچ روشن شود، شروع به خواندن سنسور اکسیمتر و انتشار(publish) داده های ضربان قلب و مقدار SPO2 می کند. اگر سوئیچ خاموش شود، تمام وظایف مربوط به سنسور اکسیمتر پالس را متوقف می کند.

void loop() {
  MQTT_connect();
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000)))
  {
            if (subscription == &sw_sub)
            {
            Serial.print(F("Got: "));
            Serial.println((char *)sw_sub.lastread);
            if (!strcmp((char*) sw_sub.lastread, "ON"))
            {
            Serial.print(("Starting POX... "));
            startReadPOX();
            BaseType_t xReturned;
            if(poxReadTaskHld == NULL){
            xReturned = xTaskCreate(
                        poxReadTask, /* Function that implements the task. */
                        "pox_read", /* Text name for the task. */
                        1024*3,    /* Stack size in words, not bytes. */
                        NULL,  /* Parameter passed into the task. */
                        2,/* Priority at which the task is created. */
                        &poxReadTaskHld ); /* Used to pass out the created task's handle. */
            }
            delay(100);
            if(mqttPubTaskHld == NULL){
            xReturned = xTaskCreate(
                        mqttPubTask, /* Function that implements the task. */
                        "mqttPub",  /* Text name for the task. */
                        1024*3,    /* Stack size in words, not bytes. */
                        NULL, /* Parameter passed into the task. */
                        2,/* Priority at which the task is created. */
                        &mqttPubTaskHld ); /* Used to pass out the created task's handle. */
            }
            }
            else
            {
            Serial.print(("Stoping POX... "));
            // Detele POX read task
            if(poxReadTaskHld != NULL)
            vTaskDelete(poxReadTaskHld);
            poxReadTaskHld = NULL;
            }
            // Delete the MQTT Pub Task
            if(mqttPubTaskHld != NULL){
            vTaskDelete(mqttPubTaskHld);
            mqttPubTaskHld = NULL;
            }
            stopReadPOX();
            }
            }
  }
}

نمایش کارکرد پالس اکسیمتر مبتنی بر IoT

مدار به درستی بر روی یک برد بورد متصل شده است و برنامه زیر بر روی ESP32 اپلود شده است. ( اطمینان حاصل کنید که اطلاعات Wi-Fi و Adafruit را مطابق با کد خود تغییر دهید تا برای شما هم کار کند)

عملکرد پالس اکسیمتر ضربان قلب esp32

پس از اتصال با سرور Adafruit IO از طریق WiFi، همانطور که انتظار می رفت شروع به کار کرد میکند.

همانطور که می بینیم سطح SPO2 بر روی 96٪ و ضربان قلب از 78 تا 81 بیت در دقیقه را نشان می دهد. همچنین زمان جمع آوری داده ها (زمان دریافت در Adafruit) را نشان میدهد.

گزارشات ضربان قلب IoT

همانطور که در تصویر بالا می بینیم، هنگامی که سوئیچ خاموش است داده ها 0 می شود. ویدئوی کامل کار پروژه را می توان در پایین این صفحه مشاهده کنید.

امیدوارم از این مقاله لذت برده باشید و چیزی های مفیدی آموخته باشید، اگر سوالی دارید، لطفا انها را در بخش نظرات زیر بگذارید یا آنها را در انجمن های ما ارسال کنید.

موارد موجود در فایل : سورس کامل

5 (2 نفر)

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

محمد رحیمی

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

1 دیدگاه

  1. سلام وقت بخیر
    من این مدار رو بستم به همین شکل ولی سنسور من بعد از وصل شدن به منبع 5 ولت روشن نشد
    مشکل کجاست؟

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

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