- MAX30100 sensor
- Nødvendige komponenter
- Interfacing MAX30100 oximeter med ESP32
- Adafruit IO med ESP32 til pulsmåling
- Kode Forklaring
- IoT-baseret pulsoximeter-demonstration
Pulsoximetri er et meget brugt medicinsk måleinstrument, og det er en ikke-invasiv og smertefri test, der måler iltmætningsniveauet i vores blod, der let kan opdage små iltændringer. I den nuværende Covid-19 situation er det blevet vigtigt at spore iltniveauet hos flere patienter på samme tid eksternt uden at komme i kontakt med patienten.
Så i dette projekt bygger vi et pulsoximeter ved hjælp af MAX30100 Pulsoximeter og ESP32, der sporer iltniveauet i blodet og sender dataene via internettet ved at oprette forbindelse til et Wi-Fi-netværk. På denne måde kan vi overvåge flere patienter eksternt ved at opretholde social afstand med patienterne. De opnåede data vises som en graf, der gør det lettere at spore og analysere patientens tilstand. Tidligere har vi også bygget andre pulsmålere ved hjælp af pulssensorer. Og hvis du er interesseret i andre Covid-19-relaterede projekter, kan du tjekke det menneskelige kropstermometer, Smart IR-termometer til feberovervågning og vægmonteret temperaturscanner, som vi har bygget tidligere.
Bortset fra Covid-19-applikationen kan dette projekt også bruges i vid udstrækning til kronisk obstruktiv lungesygdom (KOL), astma, lungebetændelse, lungekræft, anæmi, hjerteanfald eller hjertesvigt eller medfødte hjertefejl.
Bemærk, at sensoren, der anvendes i dette projekt, ikke er medicinsk vurderet, og at projektet ikke testes for fejlsikre applikationer. Brug altid et medicinsk vurderet pulsoximeter til at bestemme patientens puls og iltniveau og drøft det med en læge. Det her diskuterede projekt er kun til uddannelsesmæssige formål.
MAX30100 sensor
MAX30100 sensor er integreret pulsoximetri og pulsmåler modul. Den kommunikerer med I2C-datalinjen og giver SpO2- og Pulse-informationen til værtsmikrocontrollerenheden. Det bruger fotodetektorer, optiske elementer, hvor rød, grøn IR-LED modulerer LED-impulser. LED-strømmen kan konfigureres fra 0 til 50mA. Billedet nedenfor viser MAX30100-sensoren.
Ovenstående sensormodul fungerer med 1,8 V til 5,5 V-området. Pull-up-modstandene til I2C-stifterne er inkluderet i modulet.
Nødvendige komponenter
- En WiFi-forbindelse
- ESP32
- MAX30100 sensor
- Adafruit IO-bruger-id og et brugerdefineret oprettet dashboard (Gør det yderligere)
- 5V tilstrækkelig strømforsyningsenhed med nominel strøm på mindst 1A
- USB-kabel Micro USB til USBA
- En pc med Arduino IDE med ESP32 programmeringsmiljø.
Interfacing MAX30100 oximeter med ESP32
Det komplette kredsløbsdiagram for MAX30100 med ESP32 er angivet nedenfor.
Dette er en meget enkel skematisk. Stift 21 og 22 på ESP32 devkit C er forbundet med pulsoximetersensor MAX30100 med SDA- og SCL-stifter. Oximeteret drives også af 5V-stiften på ESP32-udviklingskortet. Jeg lavede min forbindelse ved hjælp af et brødbræt og tilslutning af ledninger, og min testopsætning ser sådan ud -
Adafruit IO med ESP32 til pulsmåling
Vi har tidligere bygget mange Adafruit IO-projekter til forskellige IoT-applikationer. Adafruit IO er en fremragende platform, hvor et brugerdefineret dashboard kan oprettes. Brug nedenstående trin til at oprette det brugerdefinerede instrumentbræt til IoT-baseret puls-oximeter-sensor-
Trin 1: Tilmeld dig først i adafruit IO efter at have givet knytnævenavnet, efternavnet, e-mail-adressen, brugernavnet og adgangskoden.
Trin 2: Det tomme dashboardvindue åbnes, når loginprocessen er udført. I dette segment skal vi oprette et dashboard for at vise dataene på forskellige måder. Således er det tid til at oprette det nye dashboard og angive navnet på dashboardet og beskrivelsen.
Trin 3: Efter at have udfyldt ovenstående formular, er det tid til at oprette grafen og kontrolafsnittet for sensoren.
Vælg afbryderblokken. Det er nødvendigt for at tænde eller slukke for pulsoximetermåleren.
Trin 4: Skriv bloknavnet ned. Som vi kan se i ovenstående billede, vil skiftefunktionen give to tilstande, ON og OFF. I samme proces skal du vælge grafblokken.
Dette grafafsnit skal vælges to gange, da der vises to grafer, Heart bit og SpO2. Begge sektioner oprettes. Som vi kan se, har vi valgt alle input- og outputfunktioner.
Trin 5: Det næste og sidste trin er at have adafruit-nøglen. Som vi kan se, får vi adafruit-nøglen, og dette skal tilføjes i koden.
Adafruit IO er nu konfigureret. Det er tid til at forberede hardwaren og oprette firmwaren til dette projekt.
Kode Forklaring
Denne kode bruger mange biblioteker, og alle er vigtige. Bibliotekerne er MAX30100 Pulseoximeter sensorbibliotek, Wire.h til I2C, WiFi.h til WiFi-relateret support i ESP32, Adafruit MQTT og MQTT Client- bibliotek. Det komplette program findes nederst på denne side.
De ovennævnte biblioteker er inkluderet i begyndelsen af koden.
#omfatte
De næste to definitioner er WLAN SSID og WLAN-adgangskode. Dette skal være nøjagtigt, og det vil blive brugt af ESP32 til at oprette forbindelse til WiFi-netværket.
#definer WLAN_SSID "xxxxxxxxx" #definer WLAN_PASS "2581xxxxx2"
Dernæst definerede vi Adafruit io-definitionerne.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Opdateringshastigheden opdaterer dataene på hvert 5. sekund, serveren vil være io.adafruit.com med en serverport på 1883. Brugernavnet og adgangskoden er det genererede brugernavn og adgangskode fra adafruit IO-dashboardet. Det vil være anderledes for alle og skal genereres som beskrevet i afsnittet om opsætning af adafruit.
I2C-portene defineres bagefter som vist i skemaet.
#definer I2C_SDA 21 #definer I2C_SCL 22
Dernæst bruges tre variabler til at gemme den sidste rapport og bpm- og spo2-værdien.
uint32_t tsLastReport = 0; flyde bpm_dt = 0; flyde spo2_dt = 0;
MQTT fungerer med en pub-sub-model (udgiv og abonner). I denne arbejdsmodel forbliver den enhed, der sender dataene til Adafruit-serveren, i publiceringstilstand, hvor Adafruit IO-serveren abonnerer på de samme datapunkter. I en sådan effekt modtager serveren, når enheden offentliggør nye data, den, da den abonnerer på den samme, dataene og giver den nødvendige handling.
Den samme ting sker, når serveren offentliggør dataene, og enheden abonnerer på dem. I vores applikation sender enheden dataene fra SPO2 og BPM til serveren, så den udgiver det samme, og den modtager ON-OFF-tilstand fra serveren og abonnerer således på denne. Denne ting er konfigureret i kodestykket beskrevet nedenfor-
WiFiClient-klient; Adafruit_MQTT_Client mqtt (& klient, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Bemærk MQTT-stier til AIO følger formularen:
I opsætningsfunktionen starter vi I2C, forbinder WiFi med det foruddefinerede SSID og adgangskode og starter MQTT-abonnementsprocessen for switch-tilstanden (switch-knappen oprettet i Adafruit IO-dashboardet).
ugyldig opsætning () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); mens (WiFi.status ()! = WL_CONNECTED) {forsinkelse (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi-tilsluttet"); Serial.println ("IP-adresse:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Initialisering af pulsoximeter.."); // Initialiser PulseOximeter-forekomsten // Fejl skyldes normalt en forkert I2C-ledning, manglende strømforsyning // eller forkert målchip, hvis (! Pox.begin ()) {Serial.println ("FAILED"); til(;;); } andet {Serial.println ("SUCCESS"); } // Standardstrømmen for IR-LED'en er 50mA, og den kan ændres // ved at fjerne kommentar til følgende linje. Tjek MAX30100_Registers.h for alle // tilgængelige muligheder. kopper.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registrer et tilbagekald til slagdetektion pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Efter alt dette startes max30100 med en ledet strømindstilling. Forskellige aktuelle indstillinger er også tilgængelige i MAX30100 headerfiler til forskellige konfigurationer. En tilbagekaldsfunktion til hjerterytmedetektion startes også. Efter alle disse opsætninger stoppes oximetersensoren.
I loop- funktionen startes MQTT-forbindelsen, og abonnementsmodellen kontrolleres hver 5000 millisekunder. I denne situation, hvis kontakten er tændt, begynder den at læse oximetersensoren og offentliggøre dataene for hjerteslag og SPO2-værdien. Hvis kontakten er slukket, suspenderer den alle opgaver i forbindelse med pulsoximetersensoren.
ugyldig sløjfe () {MQTT_connect (); Adafruit_MQTT_Abonner * abonnement; while ((abonnement = mqtt.readSubscription (5000))) {if (abonnement == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); hvis (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Starter POX…")); startReadPOX (); BaseType_t xReturned; hvis (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funktion, der gennemfører opgaven. * / "pox_read", / * Tekstnavn til opgaven. * / 1024 * 3, / * Stakstørrelse i ord, ikke bytes. * / NULL, / * Parameter videregivet til opgaven. * / 2, / * Prioritet, hvor opgaven oprettes. * / & poxReadTaskHld); / * Bruges til at uddele håndteringen af den oprettede opgave. * /} forsinkelse (100); hvis (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funktion, der gennemfører opgaven. * / "mqttPub", / * Tekstnavn til opgaven. * / 1024 * 3, / * Størrelsesstørrelse i ord, ikke byte. * / NULL, / * Parameter sendt til opgaven. * / 2, / * Prioritet, hvor opgaven oprettes. * / & mqttPubTaskHld); / * Bruges til at uddele håndteringen af den oprettede opgave. * /}} andet {Serial.print (("Stop af POX…")); // Detele POX læse opgave, hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slet MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Bruges til at uddele håndteringen af den oprettede opgave. * /}} andet {Serial.print (("Stop af POX…")); // Detele POX læse opgave, hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slet MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Bruges til at uddele håndteringen af den oprettede opgave. * /}} andet {Serial.print (("Stop af POX…")); // Detele POX læse opgave, hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slet MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT-baseret pulsoximeter-demonstration
Kredsløbet er tilsluttet korrekt i et brødbræt, og programmet nedenfor er uploadet til ESP32. Sørg for at ændre Wi-Fi- og Adafruit-legitimationsoplysningerne i overensstemmelse hermed i din kode for at få det til at fungere for dig.
Efter forbindelsen til WiFi og Adafruit IO-serveren begyndte den at fungere som forventet.
Som vi kan se, at SPO2-niveauet viser 96%, og hjerterytmen viser 78 til 81 bits pr. Minut. Det giver også det tidspunkt, hvor dataene er fanget.
Som vi kan se i ovenstående billede, er kontakten slukket, og dataene er 0. Den komplette arbejdsvideo af projektet kan også findes nederst på denne side.
Håber du nød artiklen og lærte noget nyttigt. Hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor eller læg dem på vores fora.