- חיישן MAX30100
- רכיבים נדרשים
- ממשק אוקסימטר MAX30100 עם ESP32
- Adafruit IO עם ESP32 לניטור דופק
- הסבר קוד
- הדגמת Oximeter דופק מבוססת IoT
אוקסימטריה של הדופק היא מכשיר מדידה רפואי שנמצא בשימוש נרחב והיא בדיקה לא פולשנית וללא כאבים המודדת את רמת רוויון החמצן בדם שלנו שיכולה לזהות בקלות שינויים קטנים בחמצן. במצב Covid-19 הנוכחי, הפך חשוב לעקוב אחר רמת החמצן של מספר חולים בו זמנית מרחוק מבלי ליצור קשר עם המטופל.
לכן, בפרויקט זה, אנו בונים חמצן דופק באמצעות MAX30100 אוקסימטר דופק ו- ESP32 שיעקוב אחר רמת חמצן בדם וישלח את הנתונים דרך האינטרנט באמצעות חיבור לרשת Wi-Fi. בדרך זו אנו יכולים לפקח על מספר חולים מרחוק על ידי שמירה על מרחק חברתי עם המטופלים. הנתונים שהתקבלו יוצגו כגרף המקל על המעקב וניתוח מצבו של המטופל. בעבר, בנינו גם צגי דופק אחרים באמצעות חיישני דופק. ואם אתה מעוניין בפרויקטים אחרים הקשורים ל- Covid-19, אתה יכול לבדוק את מדחום גוף האדם, מדחום IR חכם לניטור חום וסורק הטמפרטורה על הקיר שבנינו קודם.
פרט ליישום Covid-19, ניתן להשתמש בפרויקט זה באופן נרחב גם במחלות ריאות חסימתיות כרוניות (COPD), אסתמה, דלקת ריאות, סרטן ריאות, אנמיה, התקף לב או אי ספיקת לב, או במומי לב מולדים.
שים לב כי החיישן המשמש בפרויקט זה אינו מדורג רפואית והפרויקט אינו נבדק עבור יישומים חסינים בפני כשלים. השתמש תמיד במדדי דופק בעלי דירוג רפואי כדי לקבוע את רמת הדופק והחמצן של המטופל ודון בכך עם רופא רפואי. הפרויקט הנדון כאן נועד למטרות חינוכיות בלבד.
חיישן MAX30100
חיישן MAX30100 משולב מודול דופק אוקסימטריה ודופק. הוא מתקשר עם קו הנתונים I2C ומספק את מידע ה- SpO2 והדופק ליחידת המיקרו-בקר המארחת. הוא משתמש בגלאי פוטו, אלמנטים אופטיים שבהם נורית ה- IR האדומה והירוקה מווסתת את פעימות LED. ניתן להגדיר את זרם ה- LED בין 0 ל -50 mA. התמונה למטה מציגה את חיישן MAX30100.
מודול החיישן הנ"ל עובד עם 1.8 וולט לטווח 5.5 וולט. נגדי המשיכה לסיכות I2C כלולים במודול.
רכיבים נדרשים
- חיבור WiFi
- ESP32
- חיישן MAX30100
- מזהה משתמש של Adafruit IO ולוח מחוונים שנוצר בהתאמה אישית (יקדם את זה)
- יחידת אספקת חשמל מספקת 5V עם הזרם המדורג של לפחות 1A
- כבל USB מיקרו USB ל- USBA
- מחשב עם ארדואינו IDE עם סביבת תכנות ESP32.
ממשק אוקסימטר MAX30100 עם ESP32
תרשים המעגל השלם עבור MAX30100 עם ESP32 מופיע להלן.
זו סכמה פשוטה מאוד. הסיכה 21 ו- 22 של ה- ESP32 devkit C מחוברים עם חיישן אוקסימטר הדופק MAX30100 עם סיכות SDA ו- SCL. ה- Oximeter מופעל גם באמצעות סיכה 5V בלוח הפיתוח ESP32. יצרתי את החיבור שלי באמצעות לוח לחם וחוטי חיבור והגדרת הבדיקה שלי נראית כך-
Adafruit IO עם ESP32 לניטור דופק
בנינו בעבר פרויקטים רבים של Adafruit IO ליישומי IoT שונים. Adafruit IO היא פלטפורמה מצוינת בה ניתן ליצור לוח מחוונים מותאם אישית. ליצירת לוח המחוונים המותאם אישית עבור חיישן Pulse-Oximeter מבוסס IoT, השתמש בשלבים הבאים -
שלב 1: הירשם תחילה ב- IO של adafruit לאחר מתן שם ה- Fist, שם המשפחה, כתובת הדוא"ל, שם המשתמש והסיסמה.
שלב 2: חלון לוח המחוונים הריק ייפתח לאחר סיום תהליך הכניסה. בקטע זה נצטרך ליצור לוח מחוונים כדי להציג את הנתונים בדרכים שונות. לפיכך, הגיע הזמן ליצור את לוח המחוונים החדש ולספק את שם לוח המחוונים ואת התיאור.
שלב 3: לאחר מילוי הטופס הנ"ל, הגיע הזמן ליצור את הגרף ואת קטע הבקרה עבור החיישן.
בחר את בלוק המתג. זה יידרש להפעלה או כיבוי של חיישן הדופק.
שלב 4: רשמו את שם הבלוק. כפי שניתן לראות בתמונה לעיל, פונקציית ההחלפה תספק שתי מצבים, ON ו- OFF. באותו תהליך, בחר את גוש הגרף.
צריך לבחור קטע גרף זה פעמיים מכיוון שיוצגו שני גרפים, Heart bit ו- SpO2. שני החלקים נוצרים. כפי שאנו רואים, בחרנו את כל פונקציונליות הקלט והפלט.
שלב 5: השלב הבא והאחרון הוא לקבל את מפתח האדפרויט. כפי שאנו רואים, אנו מקבלים את מפתח adafruit ואת זה צריך להוסיף בקוד.
AdOFruit IO מוגדר כעת. הגיע הזמן להכין את החומרה וליצור את הקושחה לפרויקט זה.
הסבר קוד
קוד זה משתמש בספריות רבות וכולם חשובים. הספריות הן ספריית חיישני דופק של MAX30100, Wire.h עבור I2C, WiFi.h לתמיכה הקשורה ל- WiFi בספריית ESP32, Adafruit MQTT ו- MQTT . את התוכנית המלאה תוכלו למצוא בתחתית עמוד זה.
הספריות שהוזכרו לעיל כלולות בתחילת הקוד.
#לִכלוֹל
שתי ההגדרות הבאות הן WLAN SSID וסיסמת WLAN. זה צריך להיות מדויק והוא ישמש את ה- 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; צף bpm_dt = 0; לצוף spo2_dt = 0;
ה- MQTT עובד עם מודל פאב-משנה (פרסם והירשם כמנוי). במודל עבודה זה, המכשיר המגיש את הנתונים לשרת Adafruit נשאר במצב פרסום בו שרת ה- Adafruit IO מנוי לאותן נקודות נתונים. בהשפעה כזו, בכל פעם שהמכשיר מפרסם נתונים חדשים כלשהם, השרת, כמנוי עליו, מקבל את הנתונים ומספק פעולה נדרשת.
אותו דבר קורה כאשר השרת מפרסם את הנתונים, והמכשיר מנוי עליהם. ביישום שלנו, המכשיר שולח את הנתונים של SPO2 ו- BPM לשרת, כך שהוא מפרסם אותו והוא מקבל את מצב ON-OFF מהשרת ובכך מנוי על זה. דבר זה מוגדר בקטע הקוד המתואר להלן-
לקוח WiFiClient; 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"); // שימו לב לנתיבי MQTT עבור AIO עקבו אחר הטופס:
ב התקנת הפונקציה, אנו מתחילים את I2C, חיבור WiFi עם SSID מוגדר מראש סיסמא, ומתחילים את תהליך מינוי MQTT עבור מדינת המתג (הכפתור הבורר נוצר בלוח מחווני Adafruit IO).
הגדרת חלל () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); בעוד (WiFi.status ()! = WL_CONNECTED) {עיכוב (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi מחובר"); Serial.println ("כתובת IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("אתחול אוקסימטר הדופק.."); // אתחל את מופע PulseOximeter // תקלות נובעות בדרך כלל מחיווט I2C לא תקין, חסר ספק כוח // או שבב יעד שגוי אם (! Pox.begin ()) {Serial.println ("נכשל"); ל(;;); } אחר {Serial.println ("הצלחה"); } // זרם ברירת המחדל עבור נורית ה- IR הוא 50mA וניתן לשנות אותה // על ידי ביטול התגובה של השורה הבאה. בדוק ב- MAX30100_Registers.h עבור כל האפשרויות // הזמינות. אֲבַעבּוּעוֹת.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // רשום התקשרות חוזרת לזיהוי פעימות pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
אחרי כל זה, max30100 מתחיל עם הגדרת זרם led. הגדרות זרם שונות זמינות גם בקבצי הכותרת MAX30100 לתצורות שונות. מופעלת גם פונקציית קריאה לזיהוי פעימות לב. לאחר כל ההתקנות הללו, חיישן האוקסימטר נעצר.
ב לולאת הפונקציה, קשר MQTT מותנע, המודל מנוי נבדק ב כול 5000 אלפיות. במצב זה, אם המתג מופעל, הוא מתחיל לקרוא את חיישן האוקסימטר ולפרסם את נתוני פעימות הלב וערך SPO2. אם המתג כבוי, הוא מושעה את כל המשימות הקשורות לחיישן הדופק.
לולאה בטלה () {MQTT_connect (); Adafruit_MQTT_ מנוי * מנוי; while ((מנוי = mqtt.readSubscription (5000))) {if (מנוי == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); אם (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("מתחיל POX…")); startReadPOX (); BaseType_t xReturned; אם (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * פונקציה המיישמת את המשימה. * / "pox_read", / * שם הטקסט למשימה. * / 1024 * 3, / * גודל הערימה במילים, לא בתים. * / NULL, / * פרמטר עבר למשימה. * / 2, / * עדיפות בה נוצרת המשימה. * / & poxReadTaskHld); / * משמש להעברת ידית המשימה שנוצרה. עיכוב * /} (100); אם (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * פונקציה המיישמת את המשימה. * / "mqttPub", / * שם טקסט למשימה. * / 1024 * 3, / * גודל הערימה במילים, ולא בתים. * / NULL, / * פרמטר הועבר למשימה. * / 2, / * עדיפות בה נוצרת המשימה. * / & mqttPubTaskHld); / * משמש להעברת ידית המשימה שנוצרה. * /}} אחר {Serial.print (("עצירת דואר…")); // משימת קריאת POX של Detele אם (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // מחק את משימת הפאב MQTT אם (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * משמש להעברת ידית המשימה שנוצרה. * /}} אחר {Serial.print (("עצירת דואר…")); // משימת קריאת הדואר POX אם (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // מחק את משימת הפאב MQTT אם (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * משמש להעברת ידית המשימה שנוצרה. * /}} אחר {Serial.print (("עצירת דואר…")); // משימת קריאת POX של Detele אם (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // מחק את משימת הפאב MQTT אם (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
הדגמת Oximeter דופק מבוססת IoT
המעגל מחובר כראוי בלוח לחם והתוכנית המפורטת להלן מועלה ל- ESP32. הקפד לשנות את אישורי ה- Wi-Fi ו- Adafruit בהתאם בקוד שלך כדי שזה יעבוד עבורך.
אחרי החיבור לשרת ה- WiFi ו- Adafruit IO, זה התחיל לעבוד כצפוי.
כפי שאנו רואים שרמת SPO2 מציגה 96% ודופק הלב מציג 78 עד 81 ביט לדקה. זה גם מספק את הזמן שבו הנתונים נלכדים.
כפי שניתן לראות בתמונה שלעיל, המתג כבוי והנתונים הם 0. סרטון העבודה המלא של הפרויקט נמצא גם בתחתית דף זה.
מקווה שנהנית מהמאמר ולמדת משהו שימושי, אם יש לך שאלות, השאיר אותן בסעיף ההערות למטה או פרסם אותן בפורומים שלנו.