- Senzor MAX30100
- Požadované komponenty
- Propojení oxymetru MAX30100 s ESP32
- Adafruit IO s ESP32 pro monitorování srdeční frekvence
- Vysvětlení kódu
- Demonstrace pulzního oxymetru na základě IoT
Pulzní oxymetrie je široce používaný lékařský měřicí přístroj a je to neinvazivní a bezbolestný test, který měří hladinu nasycení kyslíkem v naší krvi, která dokáže snadno detekovat malé změny kyslíku. V současné situaci Covid-19 se stalo důležitým sledovat hladinu kyslíku u více pacientů současně na dálku bez kontaktu s pacientem.
V tomto projektu tedy postavíme pulzní oxymetr pomocí pulzního oxymetru MAX30100 a ESP32, který bude sledovat hladinu krevního kyslíku a odesílat data přes internet připojením k síti Wi-Fi. Tímto způsobem můžeme vzdáleně sledovat více pacientů udržováním sociálního odstupu od pacientů. Získaná data budou zobrazena jako graf, který usnadní sledování a analýzu stavu pacienta. Dříve jsme také postavili další monitory srdeční frekvence využívající pulzní senzory. A pokud vás zajímají další projekty související s Covid-19, můžete si prohlédnout teploměr lidského těla, inteligentní IR teploměr pro monitorování horečky a skener teploty na zeď, který jsme dříve sestavili.
Kromě aplikace Covid-19 může být tento projekt široce využíván při chronické obstrukční plicní nemoci (COPD), astmatu, pneumonii, rakovině plic, anémii, srdečním infarktu nebo srdečním selhání nebo při vrozených srdečních vadách.
Nezapomeňte, že senzor použitý v tomto projektu není lékařsky hodnocen a projekt není testován na aplikace odolné proti selhání. K určení pulzu a hladiny kyslíku u pacienta vždy používejte pulsní oxymetr s lékařským hodnocením a prodiskutujte to s lékařem. Zde diskutovaný projekt slouží pouze pro vzdělávací účely.
Senzor MAX30100
Senzor MAX30100 je integrovaný modul pulzní oxymetrie a monitoru srdečního tepu. Komunikuje s datovou linkou I2C a poskytuje informace SpO2 a Pulse hostitelské jednotce mikrokontroléru. Používá fotodetektory, optické prvky, kde červená, zelená IR LED moduluje pulzy LED. Proud LED je konfigurovatelný od 0 do 50 mA. Na následujícím obrázku je snímač MAX30100.
Výše uvedený senzorový modul pracuje s rozsahem 1,8 V až 5,5 V. Pull-up rezistory pro piny I2C jsou součástí modulu.
Požadované komponenty
- WiFi připojení
- ESP32
- Senzor MAX30100
- ID uživatele Adafruit IO a vlastní vytvořený řídicí panel (bude to dále)
- 5V odpovídající napájecí zdroj se jmenovitým proudem nejméně 1A
- Kabel USB Micro USB na USBA
- Počítač s Arduino IDE s programovacím prostředím ESP32.
Propojení oxymetru MAX30100 s ESP32
Kompletní schéma zapojení pro MAX30100 s ESP32 je uvedeno níže.
Toto je velmi jednoduché schéma. Kolíky 21 a 22 zařízení ESP32 devkit C jsou spojeny se snímačem pulzního oxymetru MAX30100 s kolíky SDA a SCL. Oximeter je také napájen 5V kolíkem na vývojové desce ESP32. Vytvořil jsem připojení pomocí prkénka a připojovacích vodičů a moje testovací nastavení vypadá takto -
Adafruit IO s ESP32 pro monitorování srdeční frekvence
Dříve jsme vytvořili mnoho projektů Adafruit IO pro různé aplikace IoT. Adafruit IO je vynikající platforma, kde lze vytvořit vlastní řídicí panel. Chcete-li vytvořit vlastní řídicí panel pro snímač pulzního oxymetru založený na IoT, použijte níže uvedené kroky -
Krok 1: Nejprve se přihlaste do I / O adafruit po zadání prvního jména, příjmení, e-mailové adresy, uživatelského jména a hesla.
Krok 2: Po dokončení procesu přihlášení se otevře prázdné okno řídicího panelu. V tomto segmentu budeme muset vytvořit řídicí panel, který bude data zobrazovat různými způsoby. Je tedy čas vytvořit nový řídicí panel a poskytnout název řídicího panelu a popis.
Krok 3: Po vyplnění výše uvedeného formuláře je čas vytvořit graf a ovládací sekci pro senzor.
Vyberte spínací blok. Bude to vyžadováno pro zapnutí nebo vypnutí snímače pulzního oxymetru.
Krok 4: Zapište si název bloku. Jak vidíme na obrázku výše, přepínací funkce poskytne dva stavy, ZAPNUTO a VYPNUTO. Ve stejném procesu vyberte blok grafu.
Tuto část grafu je třeba vybrat dvakrát, protože se zobrazí dva grafy, Heart bit a SpO2. Obě sekce jsou vytvořeny. Jak vidíme, vybrali jsme všechny vstupní a výstupní funkce.
Krok 5: Dalším a posledním krokem je mít klíč adafruit. Jak vidíme, dostaneme klíč adafruit a ten je třeba přidat do kódu.
Adafruit IO je nyní nakonfigurován. Je čas připravit hardware a vytvořit firmware pro tento projekt.
Vysvětlení kódu
Tento kód používá mnoho knihoven a všechny jsou důležité. Knihovny jsou knihovna senzorů pulzního oxymetru MAX30100 , Wire.h pro I2C, WiFi.h pro podporu související s WiFi v knihovnách ESP32, Adafruit MQTT a MQTT Client . Kompletní program naleznete ve spodní části této stránky.
Výše uvedené knihovny jsou zahrnuty na začátku kódu.
#zahrnout
Další dvě definice jsou WLAN SSID a WLAN heslo. To musí být přesné a použije jej ESP32 pro připojení k WiFi síti.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Dále jsme definovali definice 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"
Rychlost aktualizace aktualizuje data každých 5 sekund, server bude io.adafruit.com s portem serveru 1883. Uživatelské jméno a heslo bude vygenerované uživatelské jméno a heslo z řídicího panelu adafruit IO. Bude se lišit pro všechny a je třeba jej vygenerovat, jak je popsáno v části nastavení adafruit.
Porty I2C jsou definovány později, jak je znázorněno na schématu.
#define I2C_SDA 21 #define I2C_SCL 22
Dále se používají tři proměnné k uložení posledního přehledu a hodnoty bpm a spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT pracuje s modelem pub-sub (publikovat a přihlásit se k odběru). V tomto pracovním modelu zařízení, které odesílá data na server Adafruit, zůstane v režimu publikování, kde se server Adafruit IO přihlásí k odběru stejných datových bodů. V takovém případě, kdykoli zařízení publikuje nová data, server, který je přihlášen k odběru stejných dat, data přijme a provede nezbytnou akci.
Totéž se stane, když server publikuje data a zařízení se k nim přihlásí. V naší aplikaci zařízení odesílá data SPO2 a BPM na server, takže je publikuje stejně a přijímá stav ON-OFF ze serveru, čímž se přihlásí k odběru tohoto. Tato věc je nakonfigurována ve fragmentu kódu popsaném níže -
WiFiClient klient; 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šimněte si, že cesty MQTT pro AIO následují ve tvaru:
Ve funkci nastavení spouštíme I2C, připojujeme WiFi s předdefinovaným SSID a heslem a spouštíme proces předplatného MQTT pro stav přepínače (Přepínací tlačítko vytvořené na řídicím panelu Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {zpoždění (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi připojeno"); Serial.println ("IP adresa:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicializace pulzního oxymetru.."); // Inicializace instance PulseOximeter // Poruchy jsou obvykle způsobeny nesprávným zapojením I2C, chybějícím napájením // nebo nesprávným cílovým čipem if (! Pox.begin ()) {Serial.println ("FAILED"); pro(;;); } else {Serial.println ("ÚSPĚCH"); } // Výchozí proud pro IR LED je 50mA a lze jej změnit // odkomentováním následujícího řádku. Zkontrolujte všechny dostupné možnosti // MAX30100_Registers.h. neštovice.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Zaregistrujte zpětné volání pro detekci rytmu pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Poté se max30100 spustí s nastavením proudu LED. Různá aktuální nastavení jsou také k dispozici v souborech záhlaví MAX30100 pro různé konfigurace. Spustí se také funkce zpětného volání detekce srdečního rytmu. Po všech těchto nastaveních je senzor oxymetru zastaven.
Ve funkci smyčky je spuštěno připojení MQTT a model předplatného je kontrolován každých 5000 milisekund. V této situaci, pokud je přepínač zapnutý, začne číst senzor oxymetru a publikovat data Heartbeat a hodnoty SPO2. Pokud je spínač vypnutý, pozastaví všechny úkoly související se snímačem pulzního oxymetru.
void loop () {MQTT_connect (); Adafruit_MQTT_Subscribe * předplatné; 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, / * Funkce, která implementuje úkol. * / "pox_read", / * Textový název úlohy. * / 1024 * 3, / * Velikost zásobníku ve slovech, ne bytes. * / NULL, / * Parametr předán do úkolu. * / 2, / * Priorita, ve které je úkol vytvořen. * / & poxReadTaskHld); / * Používá se k rozdávání popisovače vytvořeného úkolu. * /} zpoždění (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkce, která implementuje úkol. * / "mqttPub", / * Textový název úkolu. * / 1024 * 3, / * Velikost zásobníku ve slovech, ne v bajtech. * / NULL, / * Parametr předán do úkolu. * / 2, / * Priorita, při které je úkol vytvořen. * / & mqttPubTaskHld); / * Používá se k rozdávání popisovače vytvořeného úkolu. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Odstranit úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Používá se k rozdávání popisovače vytvořeného úkolu. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Odstranit úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Používá se k rozdávání popisovače vytvořeného úkolu. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Odstranit úlohu MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstrace pulzního oxymetru na základě IoT
Obvod je správně zapojen do kontaktního pole a níže uvedený program je nahrán na ESP32. Ujistěte se, že v kódu odpovídajícím způsobem změníte přihlašovací údaje Wi-Fi a Adafruit, aby to fungovalo za vás.
Po připojení k serveru WiFi a Adafruit IO to začalo fungovat podle očekávání.
Jak vidíme, úroveň SPO2 ukazuje 96% a tep ukazuje 78 až 81 bitů za minutu. Poskytuje také čas, kdy jsou data zachycena.
Jak vidíme na obrázku výše, přepínač je vypnutý a data jsou 0. Kompletní pracovní video projektu lze také najít ve spodní části této stránky.
Doufám, že se vám článek líbil a dozvěděli jste se něco užitečného. Pokud máte nějaké dotazy, nechte je prosím v sekci komentářů níže nebo je zveřejněte na našem fóru.