- MAX30100 Sensor
- Nødvendige komponenter
- Grensesnitt MAX30100 oksymeter med ESP32
- Adafruit IO med ESP32 for pulsmåling
- Kode Forklaring
- IoT-basert pulsoksymeterdemonstrasjon
Pulsoksimetri er et mye brukt medisinsk måleinstrument, og det er en ikke-invasiv og smertefri test som måler oksygenmetningsnivå i blodet vårt som lett kan oppdage små endringer i oksygen. I dagens Covid-19 situasjon har det blitt viktig å spore oksygenivået til flere pasienter samtidig eksternt uten å komme i kontakt med pasienten.
Så i dette prosjektet bygger vi et pulsoksymeter ved hjelp av MAX30100 Pulsoximeter og ESP32 som vil spore oksygenivået i blodet og sende dataene via internett ved å koble til et Wi-Fi-nettverk. På denne måten kan vi overvåke flere pasienter eksternt ved å opprettholde sosial avstand til pasientene. De innhentede dataene vises som en graf som gjør det lettere å spore og analysere pasientens tilstand. Tidligere har vi også bygget andre pulsmålere ved hjelp av pulssensorer. Og hvis du er interessert i andre Covid-19-relaterte prosjekter, kan du sjekke ut menneskekroppstermometeret, Smart IR-termometer for feberovervåking og Wall-Mount Temperature-skanner som vi bygde tidligere.
Annet enn Covid-19-applikasjonen, kan dette prosjektet også brukes mye i kronisk obstruktiv lungesykdom (KOLS), astma, lungebetennelse, lungekreft, anemi, hjerteinfarkt eller hjertesvikt, eller medfødte hjertefeil.
Vær oppmerksom på at sensoren som brukes i dette prosjektet ikke er medisinsk vurdert, og at prosjektet ikke er testet for feilsikre applikasjoner. Bruk alltid et medisinsk rangert pulsoksymeter for å bestemme pasientens puls og oksygenivå og diskutere det med en lege. Prosjektet diskutert her er kun for pedagogiske formål.
MAX30100 Sensor
MAX30100 sensor er integrert pulsoksimetri og pulsmåler. Den kommuniserer med I2C-datalinjen og gir SpO2- og pulsinformasjonen til vertsmikrokontrollerenheten. Den bruker fotodetektorer, optiske elementer der rød, grønn IR-LED modulerer LED-pulser. LED-strømmen kan konfigureres fra 0 til 50mA. Bildet nedenfor viser MAX30100-sensoren.
Ovennevnte sensormodul fungerer med 1,8V til 5,5V-området. Opptrekksmotstandene til I2C-pinnene er inkludert i modulen.
Nødvendige komponenter
- En WiFi-tilkobling
- ESP32
- MAX30100 Sensor
- Adafruit IO bruker-ID og et tilpasset dashbord (vil gjøre det videre)
- 5V tilstrekkelig strømforsyningsenhet med nominell strøm på minst 1A
- USB-kabel Micro USB til USBA
- En PC med Arduino IDE med ESP32 programmeringsmiljø.
Grensesnitt MAX30100 oksymeter med ESP32
Det komplette kretsskjemaet for MAX30100 med ESP32 er gitt nedenfor.
Dette er en veldig enkel skjematisk tegning. Pinnen 21 og 22 på ESP32 devkit C er koblet til en pulsoksymetersensor MAX30100 med SDA- og SCL-pinnene. Oximeteret drives også av 5V-pinnen på ESP32-utviklingskortet. Jeg opprettet forbindelsen min ved hjelp av et brødbrett og tilkoblingsledninger, og testoppsettet mitt ser slik ut -
Adafruit IO med ESP32 for pulsmåling
Vi har tidligere bygget mange Adafruit IO-prosjekter for forskjellige IoT-applikasjoner. Adafruit IO er en utmerket plattform der et tilpasset dashbord kan opprettes. For å lage det tilpassede dashbordet for IoT-basert puls-oksymetersensor, bruk trinnene nedenfor -
Trinn 1: Registrer deg først i adafruit IO etter å ha oppgitt Fist-navnet, etternavnet, e-postadressen, brukernavnet og passordet.
Trinn 2: Det tomme dashbordvinduet åpnes etter at påloggingsprosessen er fullført. I dette segmentet må vi lage et dashbord for å vise dataene på forskjellige måter. Dermed er det på tide å lage det nye dashbordet og oppgi navnet på dashbordet og beskrivelsen.
Trinn 3: Etter å ha fylt ut skjemaet ovenfor, er det på tide å lage grafen og kontrolldelen for sensoren.
Velg bryterblokk. Det vil være nødvendig for å slå Puls-oksymetersensoren PÅ eller AV.
Trinn 4: Skriv ned blokknavnet. Som vi kan se i bildet ovenfor, vil vekslefunksjonen gi to tilstander, PÅ og AV. I samme prosess velger du grafblokken.
Denne grafdelen må velges to ganger da to grafer vises, Heart bit og SpO2. Begge seksjonene er opprettet. Som vi kan se, har vi valgt alle funksjonene for inngang og utgang.
Trinn 5: Det neste og siste trinnet er å ha adafruktnøkkelen. Som vi kan se, får vi adafruit-nøkkelen, og dette må legges til i koden.
Adafruit IO er nå konfigurert. Det er på tide å forberede maskinvaren og lage firmware for dette prosjektet.
Kode Forklaring
Denne koden bruker mange biblioteker, og alle er viktige. Bibliotekene er MAX30100 Pulse oximeter sensor-bibliotek, Wire.h for I2C, WiFi.h for WiFi-relatert støtte i ESP32, Adafruit MQTT og MQTT Client- biblioteket. Hele programmet finner du nederst på denne siden.
Disse bibliotekene nevnt ovenfor er inkludert i begynnelsen av koden.
#inkludere
De neste to definisjonene er WLAN SSID og WLAN Password. Dette må være nøyaktig, og det vil bli brukt av ESP32 for å koble til WiFi-nettverket.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Deretter definerte vi definisjonene av 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"
Oppdateringshastigheten vil oppdatere dataene hvert 5. sekund, serveren vil være io.adafruit.com med en serverport på 1883. Brukernavnet og passordet vil være det genererte brukernavnet og passordet fra adafruit IO-dashbordet. Det vil være annerledes for alle og må genereres som beskrevet i delen for adafruitoppsett.
I2C-portene er definert etterpå som vist i skjematisk.
#define I2C_SDA 21 #define I2C_SCL 22
Deretter brukes tre variabler til å lagre den siste rapporten og bpm og spo2-verdien.
uint32_t tsLastReport = 0; flyte bpm_dt = 0; flyte spo2_dt = 0;
MQTT fungerer med en pub-sub-modell (publiser og abonner). I denne arbeidsmodellen forblir enheten som sender dataene til Adafruit-serveren i publiseringsmodus der Adafruit IO-serveren abonnerer på de samme datapunktene. I en slik effekt mottar serveren, når enheten publiserer nye data, når den abonnerer på den samme dataene og gir nødvendige tiltak.
Det samme skjer når serveren publiserer dataene, og enheten abonnerer på den. I applikasjonen vår sender enheten dataene til SPO2 og BPM til serveren, så den publiserer det samme og den mottar PÅ-AV-tilstanden fra serveren, og abonnerer dermed på denne. Denne tingen er konfigurert i kodebiten 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"); // Legg merke til MQTT-stier for AIO følger skjemaet:
I oppsettfunksjonen starter vi I2C, kobler WiFi med det forhåndsdefinerte SSID og passord, og starter MQTT-abonnementet for byttetilstand (bryterknappen opprettet i Adafruit IO-dashbordet).
ugyldig oppsett () {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-tilkoblet"); Serial.println ("IP-adresse:"); Serial.println (WiFi.localIP ()); mqtt.abonnement (& sw_sub); Serial.print ("Initialiserer pulsoksymeter.."); // Initialiser PulseOximeter-forekomsten // Feil skyldes vanligvis feil I2C-ledninger, manglende strømforsyning // eller feil målchip hvis (! Pox.begin ()) {Serial.println ("FAILED"); til(;;); } annet {Serial.println ("SUKSESS"); } // Standardstrømmen for IR-LED-en er 50mA, og den kan endres // ved å kommentere følgende linje. Sjekk MAX30100_Registers.h for alle // tilgjengelige alternativer. kopper.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registrer en tilbakeringing for slagdeteksjonen pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Etter alt dette startes max30100 med en ledet strøminnstilling. Ulike nåværende innstillinger er også tilgjengelige i MAX30100-topptekstfilene for forskjellige konfigurasjoner. En tilbakekallingsfunksjon for hjerterytmedeteksjon startes også. Etter alle disse oppsettene stoppes oksymetersensoren.
I loop- funksjonen startes MQTT-tilkoblingen og abonnementsmodellen sjekkes hver 5000 millisekund. I denne situasjonen, hvis bryteren er slått på, begynner den å lese oksymetersensoren og publisere dataene for hjerteslag og SPO2-verdien. Hvis bryteren er slått av, stanser den alle oppgaver relatert til pulsoksymetersensoren.
ugyldig sløyfe () {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; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funksjon som implementerer oppgaven. * / "pox_read", / * Tekstnavn for oppgaven. * / 1024 * 3, / * Stakkstørrelse i ord, ikke byte. * / NULL, / * Parameter overført til oppgaven. * / 2, / * Prioritet som oppgaven blir opprettet. * / & poxReadTaskHld); / * Brukes til å passere oppgavens håndtak. * /} forsinkelse (100); hvis (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funksjon som gjennomfører oppgaven. * / "mqttPub", / * Tekstnavn for oppgaven. * / 1024 * 3, / * Stakkstørrelse i ord, ikke byte. * / NULL, / * Parameter overført til oppgaven. * / 2, / * Prioritet som oppgaven blir opprettet. * / & mqttPubTaskHld); / * Brukes til å passere oppgavens håndtak. * /}} annet {Serial.print (("Stopper POX…")); // Detele POX leseoppgave hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slett MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Brukes til å passere oppgavens håndtak. * /}} annet {Serial.print (("Stopper POX…")); // Detele POX leseoppgave hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slett MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Brukes til å passere oppgavens håndtak. * /}} annet {Serial.print (("Stopper POX…")); // Detele POX leseoppgave hvis (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Slett MQTT Pub Task if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT-basert pulsoksymeterdemonstrasjon
Kretsen er koblet riktig til et brødbord, og programmet nedenfor er lastet opp til ESP32. Forsikre deg om at du endrer Wi-Fi- og Adafruit-legitimasjonen tilsvarende i koden din for å få den til å fungere for deg.
Etter forbindelsen med WiFi- og Adafruit IO-serveren begynte den å fungere som forventet.
Som vi kan se at SPO2-nivået viser 96% og hjerterytmen viser 78 til 81 bits per minutt. Det gir også tiden da dataene blir fanget.
Som vi kan se på bildet ovenfor, er bryteren slått av og dataene er 0. Den komplette arbeidsvideoen til prosjektet finner du også nederst på denne siden.
Håper du likte artikkelen og lærte noe nyttig, hvis du har spørsmål, kan du legge dem i kommentarfeltet nedenfor eller legge dem ut på forumet vårt.