- MAX30100 Сензор
- Необходими компоненти
- Взаимодействие на MAX30100 оксиметър с ESP32
- Adafruit IO с ESP32 за мониторинг на сърдечната честота
- Обяснение на кода
- Демонстрация на импулсен оксиметър на базата на IoT
Пулсовата оксиметрия е широко използван медицински инструмент за измерване и е неинвазивен и безболезнен тест, който измерва нивото на насищане на кислорода в кръвта ни, което може лесно да открие малки промени в кислорода. В настоящата ситуация с Covid-19 стана важно да се проследява нивото на кислород на множество пациенти едновременно от разстояние, без да се влиза в контакт с пациента.
И така, в този проект ние изграждаме пулсов оксиметър, използвайки MAX30100 пулсов оксиметър и ESP32, които ще проследяват нивото на кислород в кръвта и ще изпращат данните през интернет чрез свързване към Wi-Fi мрежа. По този начин можем да наблюдаваме множество пациенти от разстояние, като поддържаме социална дистанция с пациентите. Получените данни ще бъдат показани като графика, която улеснява проследяването и анализа на състоянието на пациента. Преди това сме изградили и други монитори за сърдечен ритъм, използващи импулсни сензори. И ако се интересувате от други проекти, свързани с Covid-19, можете да разгледате термометъра на човешкото тяло, интелигентния IR термометър за наблюдение на треска и скенера за температура на стената, който изграждаме по-рано.
Освен приложението Covid-19, този проект може да бъде широко използван и при хронична обструктивна белодробна болест (ХОББ), астма, пневмония, рак на белия дроб, анемия, инфаркт или сърдечна недостатъчност или при вродени сърдечни дефекти.
Имайте предвид, че сензорът, използван в този проект, не е медицински класиран и проектът не е тестван за приложения, устойчиви на откази. Винаги използвайте пулсов оксиметър с медицинска оценка, за да определите пулса и нивото на кислород на пациента и да го обсъдите с лекар. Обсъденият тук проект е само с образователна цел.
MAX30100 Сензор
Сензорът MAX30100 е интегрирана пулсова оксиметрия и модул за монитор на пулса. Той комуникира с линията за данни I2C и предоставя информация SpO2 и Pulse на хост микроконтролера. Той използва фотодетектори, оптични елементи, където червеният, зеленият IR модулира LED импулсите. Светодиодният ток може да се конфигурира от 0 до 50mA. Долното изображение показва сензора MAX30100.
Горният сензорен модул работи с 1.8V до 5.5V диапазон. Издърпващите резистори за I2C щифтовете са включени в модула.
Необходими компоненти
- WiFi връзка
- ESP32
- MAX30100 Сензор
- Идент. № на потребителя на Adafruit IO и създадено по поръчка табло за управление (ще го направи допълнително)
- 5V адекватен захранващ блок с номинален ток най-малко 1A
- USB кабел Micro USB към USBA
- Компютър с Arduino IDE с програмна среда ESP32.
Взаимодействие на MAX30100 оксиметър с ESP32
Пълната електрическа схема за MAX30100 с ESP32 е дадена по-долу.
Това е много проста схема. Пиновете 21 и 22 на ESP32 devkit C са свързани с сензор за импулсен оксиметър MAX30100 с SDA и SCL щифтове. Оксиметърът също се захранва от 5V щифт на платката за развитие на ESP32. Направих връзката си чрез макет и свързващи проводници и настройката ми за тестване изглежда така-
Adafruit IO с ESP32 за мониторинг на сърдечната честота
Преди това сме изградили много проекти за Adafruit IO за различни приложения на IoT. Adafruit IO е отлична платформа, където може да се създаде персонализирано табло за управление. За да създадете персонализирано табло за управление, базирано на IoT сензор за импулсен оксиметър, използвайте стъпките по-долу -
Стъпка 1: Първо се регистрирайте в adafruit IO, след като дадете името на Fist, фамилното име, имейл адреса, потребителското име и паролата.
Стъпка 2: Празният прозорец на таблото ще се отвори след приключване на процеса на влизане. В този сегмент ще трябва да създадем табло за показване на данните по различни начини. По този начин е време да създадете новото табло за управление и да предоставите името на таблото и описанието.
Стъпка 3: След попълване на горния формуляр е време да създадете графиката и контролната секция за сензора.
Изберете блока за превключване. Това ще е необходимо за включване или изключване на сензора за пулсоксиметър.
Стъпка 4: Запишете името на блока. Както виждаме на горното изображение, функцията за превключване ще осигури две състояния, ВКЛ и ИЗКЛ. В същия процес изберете графичния блок.
Този графичен раздел трябва да бъде избран два пъти, тъй като ще бъдат показани две графики, Heart bit и SpO2. И двата раздела са създадени. Както виждаме, ние сме избрали цялата функционалност за въвеждане и извеждане.
Стъпка 5: Следващата и последна стъпка е да имате ключ за адафрут. Както виждаме, получаваме ключа adafruit и това трябва да бъде добавено в кода.
Adafruit IO вече е конфигуриран. Време е да подготвите хардуера и да създадете фърмуера за този проект.
Обяснение на кода
Този код използва много библиотеки и всички са важни. Библиотеките са MAX30100 библиотека с импулсен оксиметър, Wire.h за I2C, WiFi.h за свързаната с WiFi поддръжка в ESP32, Adafruit MQTT и MQTT Client библиотека. Пълната програма може да бъде намерена в долната част на тази страница.
Тези библиотеки, споменати по-горе, са включени в началото на кода.
#include
Следващите две определения са 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. Тя ще бъде различна за всички и трябва да се генерира, както е описано в раздела за настройка на адафрут.
Портовете I2C се дефинират след това, както е показано в схемата.
#define I2C_SDA 21 #define I2C_SCL 22
След това се използват три променливи за съхраняване на последния отчет и стойностите bpm и spo2.
uint32_t tsLastReport = 0; плуване bpm_dt = 0; плувка 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, свързваме WiFi с предварително зададените SSID и парола и стартираме процеса на абонамент за MQTT за състоянието на превключване (Бутонът за превключване, създаден в таблото за управление на Adafruit IO).
void setup () {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 ("FAILED"); за(;;); } else {Serial.println ("УСПЕХ"); } // Токът по подразбиране за IR светодиода е 50mA и той може да бъде променен // чрез коментиране на следния ред. Проверете MAX30100_Registers.h за всички // налични опции. шарка.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Регистрирайте обратно извикване за детектор за биене pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
След всичко това, max30100 се стартира с настройка на светодиоден ток. Различни текущи настройки са налични и в заглавните файлове MAX30100 за различни конфигурации. Стартирана е и функция за обратно извикване на сърдечен ритъм. След всички тези настройки сензорът за оксиметър е спрян.
В примка функция, връзка MQTT е започнало и абонаментният модел се проверява във всеки 5000 милисекунди. В тази ситуация, ако превключвателят е включен, той започва да чете сензора за оксиметър и да публикува данните за Heartbeat и стойността на SPO2. Ако ключът е изключен, той спира всички задачи, свързани със сензора на пулсовия оксиметър.
невалиден цикъл () {MQTT_connect (); Абонамент Adafruit_MQTT_Subscribe *; while ((абонамент = mqtt.readSubscription (5000))) {if (абонамент == & sw_sub) {Serial.print (F ("Получих:")); 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); / * Използва се за предаване на манипулатора на създадената задача. * /}} else {Serial.print (("Спиране на POX…")); // Откриване на задача за четене на POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Изтриване на MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Използва се за предаване на манипулатора на създадената задача. * /}} else {Serial.print (("Спиране на POX…")); // Откриване на задача за четене на POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Изтриване на MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Използва се за предаване на манипулатора на създадената задача. * /}} else {Serial.print (("Спиране на POX…")); // Откриване на задача за четене на POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Изтриване на MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Демонстрация на импулсен оксиметър на базата на IoT
Веригата е свързана правилно в макет и програмата, дадена по-долу, се качва в ESP32. Уверете се, че сте променили съответно идентификационните данни за Wi-Fi и Adafruit в кода си, за да работи за вас.
След връзката с WiFi и Adafruit IO сървъра той започна да работи според очакванията.
Както виждаме, нивото на SPO2 показва 96%, а сърдечният ритъм показва 78 до 81 бита в минута. Той също така предоставя времето, когато данните се улавят.
Както виждаме на изображението по-горе, превключвателят е изключен и данните са 0. Пълното работно видео на проекта също може да бъде намерено в долната част на тази страница.
Надявам се, че статията ви е харесала и сте научили нещо полезно, ако имате въпроси, моля, оставете ги в раздела за коментари по-долу или ги публикувайте в нашите форуми.