Arduino biblioteka širdies ritmo stebėjimui su pulso oksimetru

Arduino biblioteka širdies ritmo stebėjimui su pulso oksimetru

Arduino biblioteka širdies ritmo stebėjimui su pulso oksimetru

Vienas iš parametrų, stebėtų mano miego valdymo projekte

Tai pulsas. jį išmatuoti Sukūriau įrenginį, pagrįstą hemoglobino ir oksihemoglobino elgesiu prieš skirtingus šviesos bangos ilgius. Iš esmės tai yra matavimas, kiek tam tikros rūšies šviesos gali praeiti arba atsispindėti gerai drėkinamoje kūno vietoje. Dažnis, kuriuo vyksta visas šio reiškinio ciklas, leidžia išmatuoti pulsas.

Turinys

    Projektavimo ir bandymo etape pulso matavimo prietaisas Sukūriau keletą mažų programų, kurios padėtų man patikrinti, ar surinkimas buvo teisingas. Pirmiausia parašiau žemiau esantį kodą, kuris karts nuo karto paimdavo išmatuotas vertes (bent jau kas MAXIMUM_MEASUREMENT_TIME ir daugiausia kiekviena MINIMUM_MEASUREMENT_TIME), kai jie skyrėsi nuo vieno iki ankstesnio minimumo (vertė, kuri atitinka MINIMUM_SIZE) ir stebima iš kompiuterio su Python programa kad vėliau būtų galima juos išanalizuoti.

    Kai vertės buvo pakoreguotos (pradedant nuo labai tankių matavimų), aš gavau verčių rinkinį iš Pulso matuoklis laikui bėgant galėčiau sudaryti diagramas naudodamas skaičiuoklę, „LibreOffice Calc“ de LibreOffice, konkretus.

    pulsoksimetro matavimų grafikas su

    Su surinktais duomenimis, kaip pavaizduota aukščiau esančiame paveikslėlyje, kita operacija buvo nustatyti, ar reikšmių tankis leido patikimai, bet „ekonomiškai“ (neatimant daugiau nei reikiamų duomenų) apskaičiuoti verčių vertę. pulsas; Kaip matyti iš toliau pateiktos diagramos, priemonės, kurių buvo imtasi, padėjo pasiekti rezultatų, kurių galima pagrįstai tikėtis.

    .

    oksihemoglobino buvimo laikui bėgant matavimas pulso oksimetru

    Toliau, naudojant informaciją iš duomenų atrankos, reikėjo sukurti algoritmą, kuris matuotų pulso dažnį. Laikydamiesi grafiko, kad dėl paprastumo daroma prielaida, kad jis reiškia išdėstymą, panašų į QRS kompleksasAtrodo, kad paprasčiausias dalykas yra išmatuoti laiką tarp iškiliausių dalių su didesnėmis reikšmėmis (tai atitinka skilvelių depoliarizacijos qRs zoną), atmetant plokštesnę ir „triukšmingesnę“ zoną, todėl tai yra sunkiau. matuoti. Priimtas sprendimas, atitinkantis toliau pateiktą testo kodą, veikia pagal šią procedūrą:

    • Kiekvienu atveju aptikkite plotą, kuris yra matuojamas, kad atsižvelgtumėte tik į verčių smailes qRs ir išmesk slėnį. Tam galima išmatuoti didesnes už tam tikrą konstantą reikšmes, tačiau yra rizika, kad asmuo ir (arba) aplinkybės gali, nors ir proporcingai, padidinti arba sumažinti reikšmes. Siekiant to išvengti, ploto reikšmė laikoma didesne už tą, kuri tam tikru koeficientu viršija vidutinę vertę. Tokiu būdu matavimas yra jautriai savaime sukalibruojamas ir jį būtų galima dar labiau pakoreguoti tiksliai sureguliuojant koeficientą, kurį mano atveju pasiekiau eksperimentiškai per bandymus.

      Matavimui pasirinkite mažėjančios zonos reikšmes (Rs) piko qRs, kuo arčiau kreivės maksimumo. Norint žinoti, kad kylanti zona yra apleista, pakanka patikrinti, ar nauja reikšmė yra mažesnė už ankstesnę, ir patikrinti, ar ieškoma reikšmė dar nerasta, nes paprastai mažėjančioje yra kelios reikšmės. zona qRs priklausomai nuo mėginių ėmimo tankio. Norint nustatyti impulso laiką, išsaugoma momento, kai taškas buvo rastas, reikšmė (milisekundės, kurias grąžina milis ()) ir lygina jį su kitu.

      Siekiant užtikrinti, kad išmatuota vertė būtų didžiausia aukščiausios kreivės mažėjančioje zonoje, naudojamas kintamasis loginis (matuoti_pulsą šiame pavyzdyje ir aktyvus_pulso_matavimas bibliotekoje), kuris suaktyvinamas įeinant į didėjančią pagrindinės kreivės zoną ir išjungiamas, kai randama pirmoji mažėjanti reikšmė, kuri yra laiko reikšmė.

      Įprasta impulso trukmę vaizduoti dūžiais per minutę (ppm), gauta laiko tarp impulsų reikšmė koreguojama skaičiuojant padalijus bendrą vaizdavimo laiką (viena minutė, 60000 XNUMX milisekundžių) iš intervalo, gauto atimant dabartines milisekundes (iš dabartinės vertės) iš tų, kurios anksčiau buvo laikomos.

      Kad būtų išvengta klaidingų matavimų (pvz., prietaisas, matuojantis vakuume), prieš priimant tai savaime suprantamu dalyku, patikrinama, ar rezultatas yra tarp didžiausių ir mažiausių verčių. Nors laikoma, kad vidutinė normalioji vertė sveikam suaugusiam žmogui ramybės būsenoje yra nuo 60 iki 100 ppm, toliau pateikiamos leistinos vertės, nesunku rasti 40 ppm ramybės būsenoje, iki 200 ppm. intensyvūs pratimai ir daugiau. 100 ppm sėdintiems suaugusiems, susijaudinusiems žmonėms, būtent įdomus miego valdymo projekto veiksnys kuri mane skatina tai plėtoti pulso matavimo prietaisas. Dėl šios priežasties patartina šias vertybes labai atpalaiduoti, kad nebūtų prarasti kraštutinumai, kurie galėtų tiksliai parodyti aktualius aspektus.

      Nauja vidutinė vertė apskaičiuojama sumažinant dabartinio vidurkio aktualumą, remiantis imtų verčių skaičiumi, ir pridedama paskutinė vertė, taip pat pasverta koeficientu, kuris ją dar labiau sumažina, kuo daugiau verčių iki šiol buvo išmatuota. .

    Galiausiai, naudodamas anksčiau aprašytą algoritmą, sukūriau biblioteką pulsui apskaičiuoti aptikdamas buvimą hemoglobinas arba oksihemoglobinas (priklausomai nuo naudojamos šviesos bangos ilgio) iš toliau pateikto kodo.

    Biblioteka tikisi, kad atrankos funkcija bus iškviečiama periodiškai monitor_pulse() pulsui apskaičiuoti, kurį galima peržiūrėti naudojant funkciją paskutinis_pulsas() arba su funkcija vidutinis_pulsas() vidutinis pulsas. Be to, kad ištekliai yra riboti, aš atmečiau pertraukų naudojimą, nes man reikėjo ne tiesioginių verčių, o nuolatinių verčių, kad galėčiau stebėti pulsas mano miego valdymo projekte

    . Bet kokiu atveju iš mano atliktų testų neatrodo, kad tai būtina; arba dėl įrenginio, arba dėl jo elgesio pulsas, atrinkimas tam tikru dažniu suteikia pakankamai informacijos ir ne daug daugiau (aktualu) negaunama jį didinant, taip pat negalima jo labai sumažinti neprarandant svarbių skaičiavimui duomenų; Ankstyvosiose kodo versijose, kad būtų galima stebėti skaitymą Pulso matuoklis Sužinojau, kad nebūtina laikytis maksimalaus matavimo laiko, nes, teisingai įvertinus nuoseklių verčių svyravimus, jis buvo labai artimas minimumui.

    Toliau pateiktame programos pavyzdyje parodyta, kaip naudoti ankstesnę biblioteką matuoti pulsas su Pulso matuoklis. Be to, instantiuoti klasę Pulso lygio stebėjimas oksihemoglobinas/hemoglobinas o mažesniu periodiškumu – vertė pulsas skaičiuojamas ir vidutinis.

    Siekiant užtikrinti, kad matavimai būtų tinkami, užprogramuojamas laukimas prieš rodant bet kokią vertę. Kadangi vertė gali būti neteisinga (pavyzdžiui, jei vartotojas pašalina įrenginį), reikšmės rodomos tik tuo atveju, jei jos patenka į galiojančias.

    Rašyti komentarą

    Galbūt praleidote