Arduino-bibliotek for pulsovervåking med pulsoksymeter

Arduino-bibliotek for pulsovervåking med pulsoksymeter

Arduino-bibliotek for pulsovervåking med pulsoksymeter

En av parameterne som overvåkes i mitt søvnhåndteringsprosjekt

Det er pulsen. å måle det Jeg utviklet en enhet basert på oppførselen til hemoglobin og oksyhemoglobin mot forskjellige bølgelengder av lys. I utgangspunktet handler det om å måle hvor mye lys av en bestemt type som kan passere gjennom eller reflekteres i et godt vannet område av kroppen. Frekvensen som en fullstendig syklus av dette fenomenet oppstår med gjør det mulig å måle puls.

Innholdsfortegnelse

    I design- og testfasen av pulsmåler Jeg utviklet noen små programmer for å hjelpe meg å bekrefte at sammenstillingen var riktig. Først skrev jeg koden nedenfor, som tok de målte verdiene fra tid til annen (minst hver MAXIMUM_MEASUREMENT_TIME og høyst hver MINIMUM_MEASUREMENT_TIME) når de varierte et minimum mellom en og den forrige (verdien som tilsvarer MINIMUM_SIZE) og overvåkes fra en datamaskin med en Python-applikasjon for å kunne analysere dem senere.

    Når verdiene ble justert (begynner med svært tette målinger) fikk jeg en samling av verdier fra pulsoksymeter over tid at jeg kunne tegne grafer ved hjelp av et regneark, LibreOffice Calc de LibreOffice, spesifikk.

    graf over pulsoksymetermålinger med

    Med dataene som ble samlet inn, som representert i bildet ovenfor, var neste operasjon å bestemme om tettheten av verdier var tillatt å beregne på en pålitelig, men "økonomisk" måte (ikke prøvetaking mer enn de nødvendige dataene) verdien av puls; Som det fremgår av grafen under, så virket tiltakene som ble tatt ut til å tjene til å oppnå de resultatene som er rimelig å forvente.

    .

    måling av tilstedeværelsen av oksyhemoglobin over tid med et pulsoksymeter

    Deretter, med informasjonen fra datasamplingen, var det nødvendig å utvikle en algoritme som ville måle pulsfrekvensen. Holder oss til grafen som for enkelhets skyld antas at den representerer en layout som ligner på QRS-kompleks, det enkleste ser ut til å være å måle tiden mellom de mest fremtredende delene, med høyere verdier (som tilsvarer qRs-sonen for depolarisering av ventriklene) og forkaste den flatere og "støyere" sonen, som derfor er vanskeligere å måle. Den vedtatte løsningen, som tilsvarer testkoden nedenfor, fungerer i henhold til følgende prosedyre:

    • Oppdag området som måles i hvert enkelt tilfelle for kun å ivareta verditoppene qRs og kast bort dalen. For å gjøre dette kan verdier som er høyere enn en viss konstant måles, men det er en risiko for at et individ og/eller omstendigheter kan, selv om det er proporsjonalt, heve eller senke verdiene. For å unngå dette regnes en verdi i området som større enn den som overstiger gjennomsnittsverdien med en viss koeffisient. På denne måten er målingen sensitivt selvkalibrert og kunne justeres ytterligere ved å finjustere koeffisienten, som jeg i mitt tilfelle har oppnådd eksperimentelt under testene.

      Velg verdiene for den synkende sonen for målingen (Rs) av toppen qRs, så nært som mulig til maksimum av kurven. For å vite at den stigende sonen blir forlatt, er det nok å bekrefte at en ny verdi er mindre enn den forrige og bekrefte at den søkte verdien ennå ikke er funnet siden det generelt er flere verdier i synkende sone av qRs avhengig av prøvetakingstettheten. For å tidfeste pulsen lagres verdien for øyeblikket punktet ble funnet (millisekundene returnert av millis ()) og sammenligner den med den neste.

      For å sikre at den målte verdien er størst i den synkende sonen av den høyeste kurven, brukes en variabel boolsk (måle_puls i dette eksemplet og active_pulseasurement i biblioteket) som aktiveres når du går inn i den stigende sonen til hovedkurven og deaktiveres når den første synkende verdien er funnet, som er den tidsbestemte.

      Ettersom det er vanlig å representere pulsens varighet som slag per minutt (ppm), blir verdien av tiden mellom oppnådde pulser korrigert ved å beregne ved å dele den totale tiden for representasjonen (ett minutt, 60000 XNUMX millisekunder) med intervallet oppnådd av subtrahere gjeldende millisekunder (av gjeldende verdi) blant de tidligere tidsbestemte.

      For å unngå falske målinger (som for eksempel at enheten måler i vakuum), kontrolleres det at resultatet er mellom maksimums- og minimumsverdier før det tas for gitt. Selv om det anses som et gjennomsnitt at en normalverdi for en frisk voksen i hvile er mellom 60 og 100 ppm, er det tillatte verdier nedenfor, det er lett å finne 40 ppm hos en idrettsutøver i hvile, opp til 200 ppm i løpet av intens trening med mer på 100 ppm hos stillesittende voksne i spenningstilstander, nettopp en interessant faktor for søvnhåndteringsprosjektet som får meg til å utvikle dette pulsmåler. Av denne grunn er det tilrådelig å slappe mye av disse verdiene slik at ytterpunktene ikke går tapt, noe som nøyaktig kan vise relevante aspekter.

      Den nye gjennomsnittsverdien beregnes ved å redusere relevansen til gjeldende gjennomsnitt basert på antall verdier som er samplet og den siste verdien legges til, også vektet med en koeffisient som reduserer den ytterligere jo flere verdier som er målt så langt .

    Til slutt, ved å bruke algoritmen beskrevet før, utviklet jeg biblioteket for å beregne pulsen ved å oppdage tilstedeværelsen av hemoglobin o oksyhemoglobin (avhengig av bølgelengden på lyset som brukes) fra koden nedenfor.

    Biblioteket forventer at samplingsfunksjonen kalles opp med jevne mellomrom monitor_puls() for å beregne pulsen, som kan konsulteres med funksjonen siste_puls() eller med funksjonen gjennomsnittspuls() gjennomsnittspulsen. I tillegg til å være en begrenset ressurs, utelukket jeg å bruke avbrudd fordi jeg ikke trengte umiddelbare verdier, men heller vedvarende verdier over tid for å overvåke puls i mitt søvnhåndteringsprosjekt

    . I alle fall, ut fra testene jeg har gjort, ser det ikke ut til å være nødvendig; enten av enheten eller av oppførselen til puls, sampling ved en viss frekvens gir nok informasjon og ikke mye mer (relevant) oppnås ved å øke den, og det er heller ikke mulig å redusere den mye uten å miste relevante data for beregningen; i tidlige versjoner av koden for å overvåke lesingen av pulsoksymeter Jeg oppdaget at det ikke var nødvendig å holde seg til en maksimal måletid siden, hvis variasjonene av suksessive verdier ble tatt riktig i betraktning, var den veldig nær minimum.

    Følgende eksempelprogram viser hvordan du bruker det forrige biblioteket til å måle puls med en pulsoksymeter. I tillegg til å instansiere klassen Pulso overvåking av nivået på oksyhemoglobin/hemoglobin og med en mindre periodisitet verdien av puls beregnet og gjennomsnittlig.

    For å sikre at målingene er relevante, programmeres en venting før noen verdi vises. Siden verdien kan være feil (for eksempel hvis brukeren fjerner enheten), vises verdiene bare hvis de er innenfor rekkevidden til de som anses som gyldige.

    Legg inn kommentar

    Du kan ha gått glipp av