- Senzor MAX30100
- Požadované komponenty
- Prepojenie oxymetra MAX30100 s ESP32
- Adafruit IO s ESP32 na monitorovanie srdcového rytmu
- Vysvetlenie kódu
- Ukážka pulzného oxymetra na báze IoT
Pulzná oximetria je široko používaný lekársky merací prístroj a je to neinvazívny a bezbolestný test, ktorý meria hladinu nasýtenia kyslíkom v našej krvi, ktorá dokáže ľahko zistiť malé zmeny kyslíka. V súčasnej situácii na Covid-19 sa stalo dôležitým sledovať hladinu kyslíka u viacerých pacientov súčasne na diaľku bez toho, aby ste sa dostali do kontaktu s pacientom.
V tomto projekte teda zostavíme pulzný oxymeter pomocou pulzného oxymetra MAX30100 a ESP32, ktorý bude sledovať hladinu kyslíka v krvi a odosielať údaje cez internet pripojením k sieti Wi-Fi. Týmto spôsobom môžeme na diaľku monitorovať viacerých pacientov udržiavaním sociálneho odstupu od pacientov. Získané údaje sa zobrazia ako graf, ktorý uľahčuje sledovanie a analýzu stavu pacienta. Predtým sme tiež vyrábali ďalšie monitory srdcového tepu využívajúce pulzné snímače. A ak vás zaujímajú ďalšie projekty spojené s Covid-19, môžete si pozrieť teplomer ľudského tela, inteligentný IR teplomer na monitorovanie horúčky a skener teploty namontovaný na stenu, ktorý sme vytvorili skôr.
Okrem aplikácie Covid-19 môže byť tento projekt široko používaný aj pri chronickej obštrukčnej chorobe pľúc (COPD), astme, pneumónii, rakovine pľúc, anémii, srdcovom infarkte alebo srdcovom zlyhaní alebo pri vrodených srdcových chybách.
Pamätajte na to, že senzor použitý v tomto projekte nemá lekárske hodnotenie a projekt nie je testovaný na aplikácie zabezpečené proti zlyhaniu. Na stanovenie pulzu a hladiny kyslíka u pacienta vždy používajte pulzný oxymetr s lekárskym hodnotením a prekonzultujte to s lekárom. Projekt, o ktorom sa tu diskutuje, slúži iba na vzdelávacie účely.
Senzor MAX30100
Senzor MAX30100 je integrovaný modul pulznej oxymetrie a snímača srdcového tepu. Komunikuje s dátovou linkou I2C a poskytuje informácie SpO2 a Pulse hostiteľskej jednotke mikrokontroléra. Používa fotodetektory, optické prvky, kde červená, zelená IR LED moduluje impulzy LED. LED prúd je konfigurovateľný od 0 do 50mA. Na nasledujúcom obrázku je snímač MAX30100.
Vyššie uvedený modul snímača pracuje s rozsahom 1,8 V až 5,5 V. V module sú zahrnuté pull-up rezistory pre piny I2C.
Požadované komponenty
- WiFi pripojenie
- ESP32
- Senzor MAX30100
- ID používateľa služby Adafruit IO a vlastnoručne vytvorený informačný panel (urobí to ďalej)
- 5V primeraný napájací zdroj s menovitým prúdom najmenej 1A
- Kábel USB Micro USB na USBA
- Počítač s Arduino IDE s programovacím prostredím ESP32.
Prepojenie oxymetra MAX30100 s ESP32
Kompletná schéma zapojenia pre MAX30100 s ESP32 je uvedená nižšie.
Toto je veľmi jednoduchá schéma. Kolíky 21 a 22 zariadenia ESP32 devkit C sú spojené so snímačom pulzného oxymetra MAX30100 s kolíkmi SDA a SCL. Oximeter je tiež napájaný z 5V konektora na vývojovej doske ESP32. Pripojil som sa pomocou prepojovacej dosky a pripojovacích vodičov a moje testovacie nastavenie vyzerá takto -
Adafruit IO s ESP32 na monitorovanie srdcového rytmu
Predtým sme vytvorili mnoho projektov Adafruit IO pre rôzne aplikácie IoT. Adafruit IO je vynikajúca platforma, kde je možné vytvoriť vlastný informačný panel. Ak chcete vytvoriť vlastný informačný panel pre snímač pulzného oxymetra založený na IoT, použite nasledujúce kroky -
Krok 1: Najprv sa zaregistrujte v adafruit IO po zadaní prvého mena, priezviska, e-mailovej adresy, používateľského mena a hesla.
Krok 2: Po dokončení procesu prihlásenia sa otvorí prázdne okno informačného panela. V tomto segmente budeme musieť vytvoriť informačný panel, ktorý bude údaje zobrazovať rôznymi spôsobmi. Je teda na čase vytvoriť nový informačný panel a uviesť jeho názov a popis.
Krok 3: Po vyplnení vyššie uvedeného formulára je čas vytvoriť grafickú a riadiacu časť pre senzor.
Vyberte prepínací blok. Bude to potrebné pre zapnutie alebo vypnutie snímača pulzného oxymetra.
Krok 4: Zapíšte si názov bloku. Ako vidíme na obrázku vyššie, funkcia prepínania poskytne dva stavy, ZAPNUTÉ a VYPNUTÉ. V rovnakom procese vyberte blok grafu.
Túto časť grafu je potrebné zvoliť dvakrát, pretože sa zobrazia dva grafy, bit srdca a SpO2. Obidve sekcie sú vytvorené. Ako vidíme, vybrali sme všetky vstupné a výstupné funkcie.
Krok 5: Ďalším a posledným krokom je získanie kľúča adafruit. Ako vidíme, dostaneme kľúč adafruit, ktorý je potrebné pridať do kódu.
Adafruit IO je teraz nakonfigurovaný. Je čas pripraviť hardvér a vytvoriť firmvér pre tento projekt.
Vysvetlenie kódu
Tento kód používa veľa knižníc a všetky sú dôležité. Knižnice sú knižnica senzorov pulzného oxymetra MAX30100 , Wire.h pre I2C, WiFi.h pre podporu súvisiacu s WiFi v knižniciach ESP32, Adafruit MQTT a MQTT Client . Celý program nájdete v dolnej časti tejto stránky.
Vyššie uvedené knižnice sú zahrnuté na začiatku kódu.
#include
Nasledujúce dve definície sú WLAN SSID a WLAN heslo. To musí byť presné a použije ho ESP32 na pripojenie k sieti WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Ďalej sme definovali definície 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"
Rýchlosť aktualizácie bude aktualizovať údaje každých 5 sekúnd, serverom bude io.adafruit.com s portom servera 1883. Používateľské meno a heslo bude vygenerované používateľské meno a heslo z informačného panela IO adafruit. Bude sa líšiť od všetkých a je potrebné ho vygenerovať, ako je popísané v časti s nastavením adafruit.
Porty I2C sú definované potom, ako je to znázornené na schéme.
#define I2C_SDA 21 #define I2C_SCL 22
Ďalej sa na uloženie poslednej správy a hodnoty bpm a spo2 použijú tri premenné.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT pracuje s pub-sub modelom (publikovať a prihlásiť sa na odber). V tomto pracovnom modeli zostáva zariadenie, ktoré odosiela údaje na server Adafruit, v režime publikovania, kde si server Adafruit IO predplatí rovnaké dátové body. V takomto prípade vždy, keď zariadenie zverejní akékoľvek nové údaje, server, ktorý si ich predplatil, údaje prijme a vykoná potrebné kroky.
To isté sa stane, keď server zverejní údaje a zariadenie sa prihlási na ich odber. V našej aplikácii zariadenie odosiela údaje SPO2 a BPM na server, takže ich zverejňuje a prijíma zo servera stav ZAPNUTO-VYPNUTÉ, čím sa prihlási na odber týchto údajov. Táto vec je nakonfigurovaná v útržku kódu popísanom nižšie -
Klient 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"); // Všimnite si cesty MQTT pre AIO podľa nasledujúceho formulára:
Vo funkcii nastavenia spúšťame I2C, pripájame WiFi s preddefinovaným SSID a heslom a začíname proces predplatného MQTT pre stav prepnutia (prepínacie tlačidlo vytvorené na prístrojovej doske Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {oneskorenie (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi pripojené"); Serial.println ("IP adresa:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicializácia pulzného oxymetra.."); // Inicializujte inštanciu PulseOximeter // Poruchy sú zvyčajne spôsobené nesprávnym zapojením I2C, chýbajúcim napájaním // alebo nesprávnym cieľovým čipom if (! Pox.begin ()) {Serial.println ("FAILED"); pre (;;); } else {Serial.println ("ÚSPECH"); } // Predvolený prúd pre IR LED je 50mA a je možné ho zmeniť // odkomentovaním nasledujúceho riadku. Skontrolujte všetky dostupné možnosti // v MAX30100_Registers.h. kiahní.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Zaregistrujte spätné volanie pre detekciu rytmu pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Po tom všetkom sa max30100 spustí s nastavením prúdu LED. Rôzne aktuálne nastavenia sú tiež k dispozícii v hlavičkových súboroch MAX30100 pre rôzne konfigurácie. Spustí sa tiež funkcia spätného volania detekcie srdcového rytmu. Po všetkých týchto nastaveniach sa senzor oxymetra zastaví.
Vo funkcii slučky sa spustí pripojenie MQTT a model predplatného sa kontroluje každých 5000 milisekúnd. V tejto situácii, ak je prepínač zapnutý, začne načítať senzor oxymetra a zverejniť údaje srdcového rytmu a hodnoty SPO2. Ak je spínač vypnutý, pozastaví sa všetky úlohy spojené so snímačom pulzného oxymetra.
void loop () {MQTT_connect (); Adafruit_MQTT_Subscribe * predplatné; 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, / * Funkcia, ktorá implementuje úlohu. * / "pox_read", / * Textový názov úlohy. * / 1024 * 3, / * Veľkosť stohu slovami, nie bytes. * / NULL, / * Parameter odovzdaný do úlohy. * / 2, / * Priorita, pri ktorej je úloha vytvorená. * / & poxReadTaskHld); / * Používa sa na rozdávanie popisovača vytvorenej úlohy. * /} oneskorenie (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcia, ktorá implementuje úlohu. * / "mqttPub", / * Textový názov úlohy. * / 1024 * 3, / * Veľkosť stohu v slovách, nie bajtoch. * / NULL, / * Parameter odovzdaný do úlohy. * / 2, / * Priorita, pri ktorej je úloha vytvorená. * / & mqttPubTaskHld); / * Používa sa na rozdávanie popisovača vytvorenej úlohy. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Vymazať úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Používa sa na rozdávanie popisovača vytvorenej úlohy. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Vymazať úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Používa sa na rozdávanie popisovača vytvorenej úlohy. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Vymazať úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Ukážka pulzného oxymetra na báze IoT
Obvod je správne zapojený do prepojovacieho poľa a program uvedený nižšie sa nahrá na ESP32. Uistite sa, že ste v kóde zodpovedajúcim spôsobom zmenili poverenia Wi-Fi a Adafruit, aby vám vyhovovali.
Po spojení so serverom WiFi a Adafruit IO to začalo fungovať podľa očakávaní.
Ako vidíme, úroveň SPO2 ukazuje 96% a srdcový rytmus 78 až 81 bitov za minútu. Poskytuje tiež čas, keď sú údaje zachytené.
Ako vidíme na obrázku vyššie, prepínač je vypnutý a údaje sú 0. Kompletné pracovné video projektu nájdete tiež v spodnej časti tejto stránky.
Dúfam, že sa vám článok páčil a dozvedeli ste sa niečo užitočné, ak máte nejaké otázky, nechajte ich prosím v sekcii komentárov nižšie alebo ich uverejnite na našom fóre.