- Датчик MAX30100
- Необхідні компоненти
- Зв'язок оксиметра MAX30100 з ESP32
- Adafruit IO з ESP32 для моніторингу серцевого ритму
- Пояснення коду
- Демонстрація пульсоксиметра на основі IoT
Пульсоксиметрія - це широко використовуваний медичний прилад для вимірювання, і це неінвазивний і безболісний тест, який вимірює рівень насичення киснем у нашій крові, що дозволяє легко виявити незначні зміни в кисні. У нинішній ситуації з Covid-19 стало важливим дистанційно відстежувати рівень кисню у багатьох пацієнтів одночасно, не контактуючи з пацієнтом.
Отже, у цьому проекті ми будуємо пульсоксиметр, використовуючи пульсоксиметр MAX30100 та ESP32, який буде відстежувати рівень кисню в крові та надсилати дані через Інтернет, підключаючись до мережі Wi-Fi. Таким чином, ми можемо відстежувати кількох пацієнтів віддалено, підтримуючи соціальну дистанцію з пацієнтами. Отримані дані будуть показані у вигляді графіка, що полегшує відстеження та аналіз стану пацієнта. Раніше ми також будували інші монітори серцевого ритму за допомогою пульсових датчиків. А якщо ви зацікавлені в інших проектах, пов’язаних із Covid-19, ви можете перевірити термометр людського тіла, розумний ІЧ-термометр для моніторингу лихоманки та настінний сканер температури, який ми побудували раніше.
Крім програми Covid-19, цей проект може також широко використовуватися при хронічній обструктивній хворобі легенів (ХОЗЛ), астмі, пневмонії, раку легенів, анемії, інфаркті або серцевій недостатності або при вроджених вадах серця.
Зверніть увагу, що датчик, що використовується в цьому проекті, не має медичних оцінок, і проект не перевіряється на наявність відмовостійких програм. Завжди використовуйте медичний пульсоксиметр для визначення пульсу та рівня кисню у пацієнта та обговорюйте це з лікарем. Обговорюваний тут проект призначений лише для навчальних цілей.
Датчик MAX30100
Датчик MAX30100 - це вбудована пульсоксиметрія та модуль контролю пульсу. Він взаємодіє з лінією даних I2C і забезпечує інформацію SpO2 та Pulse до головного мікроконтролера. Він використовує фотодетектори, оптичні елементи, де червоний, зелений ІЧ-світлодіод модулює світлодіодні імпульси. Струм світлодіода можна налаштувати від 0 до 50 мА. На зображенні нижче показано датчик MAX30100.
Вищезазначений модуль датчика працює від 1,8 В до 5,5 В. Підтягувальні резистори для штифтів I2C входять в модуль.
Необхідні компоненти
- З’єднання Wi-Fi
- ESP32
- Датчик MAX30100
- Ідентифікатор користувача Adafruit IO та спеціально створена інформаційна панель (зробить це далі)
- Адекватний блок живлення 5 В з номінальним струмом не менше 1 А
- USB-кабель Micro USB до USBA
- ПК з Arduino IDE із середовищем програмування ESP32.
Зв'язок оксиметра MAX30100 з ESP32
Повна електрична схема для MAX30100 з ESP32 наведена нижче.
Це дуже проста схема. Виводи 21 і 22 девкіту ESP32 C з'єднані з датчиком пульсоксиметра MAX30100 з виводами SDA і SCL. Оксиметр також живиться від 5-контактного виводу на платі розробки ESP32. Я встановив з’єднання за допомогою макетної плати та підключення проводів, і моя настройка тестування виглядає так:
Adafruit IO з ESP32 для моніторингу серцевого ритму
Раніше ми створили безліч проектів Adafruit IO для різних програм IoT. Adafruit IO - це відмінна платформа, де можна створити власну інформаційну панель. Щоб створити власну інформаційну панель для датчика пульсоксиметра на основі IoT, виконайте наведені нижче дії.
Крок 1: Спочатку зареєструйтеся в IO Adafruit після введення Імені Кулака, прізвища, адреси електронної пошти, імені користувача та пароля.
Крок 2: Порожнє вікно інформаційної панелі відкриється після завершення процесу входу. У цьому сегменті нам потрібно буде створити інформаційну панель, щоб відображати дані різними способами. Отже, настав час створити нову інформаційну панель та вказати її назву та опис.
Крок 3: Після заповнення вищезазначеної форми настав час створити графік та розділ управління для датчика.
Виберіть блок перемикачів. Це знадобиться для ввімкнення або вимкнення датчика пульсоксиметра.
Крок 4: Запишіть назву блоку. Як ми бачимо на наведеному вище зображенні, функція перемикання забезпечить два стани - ON і OFF. У цьому ж процесі виберіть графічний блок.
Цей розділ графіків потрібно вибрати двічі, оскільки відображатимуться два графіки - Heart bit та SpO2. Створено обидва розділи. Як бачимо, ми вибрали всі функції введення та виведення.
Крок 5: Наступним і останнім кроком є отримання ключа від адаптації фруктів. Як бачимо, ми отримуємо ключ adafruit, і це потрібно додати в код.
Тепер налаштовано Adafruit IO. Настав час підготувати обладнання та створити прошивку для цього проекту.
Пояснення коду
Цей код використовує багато бібліотек, і всі вони важливі. Бібліотеки - це бібліотека датчиків імпульсного оксиметра MAX30100 , Wire.h для I2C, WiFi.h для підтримки, пов’язаної з WiFi, у ESP32, Adafruit MQTT та клієнтській бібліотеці MQTT . Повну програму можна знайти внизу цієї сторінки.
Згадані вище бібліотеки містяться на початку коду.
#включати
Наступні два визначення - це WID 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. Вона буде різною для всіх і її потрібно генерувати, як описано в розділі налаштування адафрута.
Порти I2C визначаються згодом, як показано на схемі.
#define I2C_SDA 21 #define I2C_SCL 22
Далі три змінні використовуються для зберігання останнього звіту та значень bpm та spo2.
uint32_t tsLastReport = 0; плаваючий bpm_dt = 0; float spo2_dt = 0;
MQTT працює з моделлю pub-sub (опублікувати та підписатися). У цій робочій моделі пристрій, який подає дані на сервер Adafruit, залишається в режимі публікації, де сервер Adafruit IO підписується на ті самі точки даних. Таким чином, щоразу, коли пристрій публікує будь-які нові дані, сервер, оскільки він підписаний на них, отримує дані та забезпечує необхідні дії.
Те саме відбувається, коли сервер публікує дані, а пристрій передплачує їх. У нашому додатку пристрій надсилає дані SPO2 та BPM на сервер, тому публікує те саме, і отримує стан ON-OFF від сервера, таким чином підписуючись на цей. Ця річ налаштована у фрагменті коду, описаному нижче -
Клієнт WiFiClient; Adafruit_MQTT_Client mqtt (& клієнт, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ канали / перемикач"); // Зверніть увагу на шляхи MQTT для AIO у формі:
У функції налаштування ми запускаємо I2C, підключаємо Wi-Fi із заздалегідь визначеними SSID та паролем та запускаємо процес підписки на 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) {затримка (500); Serial.print ("."); } Serial.println (); Serial.println ("Wi-Fi підключений"); Serial.println ("IP-адреса:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Ініціалізація пульсоксиметра.."); // Ініціалізуємо екземпляр PulseOximeter // Збої, як правило, через неправильну проводку I2C, відсутність джерела живлення // або неправильну цільову мікросхему, якщо (! Pox.begin ()) {Serial.println ("FAILED"); для (;;); } ще {Serial.println ("УСПІХ"); } // Струм за замовчуванням для ІЧ-світлодіода становить 50 мА, і його можна змінити //, прокоментувавши наступний рядок. Перевірте MAX30100_Registers.h для всіх // доступних опцій. віспа.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Реєстрація зворотного виклику для виявлення биття pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Після всього цього max30100 запускається з налаштуванням світлодіодного струму. Різні поточні налаштування також доступні у файлах заголовків MAX30100 для різних конфігурацій. Також запускається функція зворотного дзвінка виявлення серцебиття. Після всіх цих налаштувань датчик оксиметра зупиняється.
У функції циклу запускається підключення MQTT, а модель підписки перевіряється кожні 5000 мілісекунд. У цій ситуації, якщо перемикач увімкнено, він починає зчитувати датчик оксиметра та публікувати дані серцебиття та значення SPO2. Якщо вимикач вимкнено, він зупиняє всі завдання, пов’язані з датчиком пульсоксиметра.
недійсний цикл () {MQTT_connect (); Передплата Adafruit_MQTT_Subscribe *; 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 (("Запуск POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Функція, що реалізує завдання. * / "pox_read", / * Назва тексту для завдання. * / 1024 * 3, / * Розмір стека в словах, а не байт. * / NULL, / * Параметр передано в завдання. * / 2, / * Пріоритет, за якого створюється завдання. * / & poxReadTaskHld); / * Використовується для передачі дескриптора створеного завдання. * /} затримка (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Функція, яка реалізує завдання. * / "mqttPub", / * Назва тексту для завдання. * / 1024 * 3, / * Розмір стека словами, а не байтами. * / NULL, / * Параметр переданий у завдання. * / 2, / * Пріоритет, при якому створюється завдання. * / & mqttPubTaskHld); / * Використовується для передачі дескриптора створеного завдання. * /}} ще {Serial.print (("Зупинка POX…")); // Визначити завдання читання POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Видалити завдання публікації MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = НУЛЬ; } stopReadPOX (); }}}}/ * Використовується для передачі дескриптора створеного завдання. * /}} ще {Serial.print (("Зупинка POX…")); // Визначити завдання читання POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Видалити завдання публікації MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = НУЛЬ; } stopReadPOX (); }}}}/ * Використовується для передачі дескриптора створеного завдання. * /}} ще {Serial.print (("Зупинка POX…")); // Визначити завдання читання POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Видалити завдання публікації MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = НУЛЬ; } stopReadPOX (); }}}}
Демонстрація пульсоксиметра на основі IoT
Схема правильно підключена до макетної плати, а програма, подана нижче, завантажується на ESP32. Переконайтеся, що ви відповідно змінили облікові дані Wi-Fi та Adafruit у своєму коді, щоб він працював для вас.
Після підключення до WiFi та сервера Adafruit IO він почав працювати належним чином.
Як ми бачимо, рівень SPO2 показує 96%, а серцебиття - від 78 до 81 біт на хвилину. Він також надає час, коли дані збираються.
Як ми бачимо на зображенні вище, перемикач вимкнено, а дані - 0. Повне робоче відео проекту також можна знайти внизу цієї сторінки.
Сподіваємось, вам сподобалась стаття і ви дізналися щось корисне. Якщо у вас виникли запитання, залиште їх у розділі коментарів нижче або опублікуйте на наших форумах.