Arduino-bibliotek för pulsmätning med pulsoximeter

Arduino-bibliotek för pulsmätning med pulsoximeter

Arduino-bibliotek för pulsmätning med pulsoximeter

En av parametrarna som övervakades i mitt sömnhanteringsprojekt

Det är pulsen. att mäta det Jag utvecklade en enhet baserad på beteendet hos hemoglobin och oxyhemoglobin mot olika våglängder av ljus. I grund och botten handlar det om att mäta hur mycket ljus av en viss typ som kan passera genom eller reflekteras i ett välbevattnat område av kroppen. Frekvensen med vilken en fullständig cykel av detta fenomen inträffar gör det möjligt att mäta puls.

Innehållsförteckning

    I design- och testfasen av pulsmätare Jag utvecklade några små program för att hjälpa mig att verifiera att monteringen var korrekt. Först skrev jag koden nedan, som tog de uppmätta värdena då och då (minst varje MAXIMUM_MEASUREMENT_TIME och högst var och en MINIMUM_MEASUREMENT_TIME) när de varierade ett minimum mellan en och den föregående (det värde som motsvarar MINIMUM_SIZE) och den övervakas från en dator med en Python-applikation för att kunna analysera dem senare.

    När värdena väl hade justerats (med början med mycket täta mätningar) fick jag en samling värden från pulsoximeter över tid som jag kunde rita med ett kalkylblad, LibreOffice Calc de LibreOffice, specifik.

    graf över pulsoximetermätningar med

    Med de insamlade uppgifterna, som visas i bilden ovan, var nästa operation att bestämma om tätheten av värden gjorde det möjligt för oss att på ett tillförlitligt men "ekonomiskt" sätt (inte ta prover mer än nödvändiga data) beräkna värdet av puls; Som framgår av grafen nedan verkade de vidtagna åtgärderna tjäna till att uppnå de resultat som är rimliga att förvänta sig.

    .

    mätning av förekomsten av oxyhemoglobin över tid med en pulsoximeter

    Därefter, med informationen från datasamplingen, var det nödvändigt att utveckla en algoritm som skulle mäta pulsfrekvensen. Håller sig till grafen som för enkelhets skull antas att den representerar en layout som liknar QRS-komplex, det enklaste verkar vara att mäta tiderna mellan de mest framträdande delarna, med högre värden (vilket motsvarar qRs-zonen för depolarisering av kamrarna), att kassera den plattare och "bullare" zonen, vilket därför är svårare att mäta. Den antagna lösningen, som motsvarar testkoden nedan, fungerar enligt följande procedur:

    • Detektera området som mäts i varje enskilt fall för att bara ta hänsyn till värdetopparna qRs och kasta bort dalen. För att göra detta skulle värden högre än en viss konstant kunna mätas, men det finns en risk att en individ och/eller omständigheter kan, om än proportionellt, höja eller sänka värdena. För att undvika detta anses ett värde i området vara större än det som överstiger medelvärdet med en viss koefficient. På så sätt är mätningen känsligt självkalibrerad och skulle kunna justeras ytterligare genom att finjustera koefficienten, vilket jag i mitt fall har uppnått experimentellt under testerna.

      Välj värdena för den fallande zonen för mätningen (Rs) av toppen qRs, så nära kurvans maximum som möjligt. För att veta att den stigande zonen överges räcker det att verifiera att ett nytt värde är mindre än det föregående och verifiera att det sökta värdet ännu inte har hittats eftersom det i allmänhet finns flera värden i fallande zon av qRs beroende på provtagningstätheten. För att tajma pulsen lagras värdet för det ögonblick då punkten hittades (de millisekunder som returneras av milis ()) och jämför den med nästa.

      För att säkerställa att det uppmätta värdet är störst i den fallande zonen av den högsta kurvan, används en variabel booleskt (mäta_puls i detta exempel och aktiv_pulsmätning i biblioteket) som aktiveras när man går in i den stigande zonen för huvudkurvan och avaktiveras när det första fallande värdet hittats, vilket är det tidsinställda.

      Eftersom det är vanligt att representera pulsens varaktighet som slag per minut (ppm), korrigeras värdet på tiden mellan erhållna pulser genom att den totala tiden för representationen (en minut, 60000 XNUMX millisekunder) divideras med intervallet som erhålls av subtrahera de aktuella millisekunderna (av det aktuella värdet) bland de tidigare tidsinställda.

      För att undvika falska mätningar (som till exempel att enheten mäter i vakuum) verifieras det att resultatet ligger mellan max- och minimivärden innan det tas för givet. Även om det anses som ett genomsnitt att ett normalvärde för en frisk vuxen i vila är mellan 60 och 100 ppm, finns det tillåtna värden nedan, det är lätt att hitta 40 ppm hos en idrottare i vila, upp till 200 ppm under intensiv träning med mera på 100 ppm hos stillasittande vuxna i tillstånd av spänning, just en intressant faktor för sömnhanteringsprojektet vilket får mig att utveckla detta pulsmätare. Av denna anledning är det tillrådligt att slappna av dessa värden mycket så att ytterligheterna inte går förlorade, vilket exakt kan visa relevanta aspekter.

      Det nya medelvärdet beräknas genom att minska relevansen av det aktuella medelvärdet baserat på antalet samplade värden och det sista värdet läggs till, även viktat med en koefficient som minskar det ytterligare ju fler värden som har uppmätts hittills .

    Slutligen, med hjälp av algoritmen som beskrivits tidigare, utvecklade jag biblioteket för att beräkna pulsen genom att detektera närvaron av hemoglobin o oxihemoglobin (beroende på ljusets våglängd) från koden nedan.

    Biblioteket förväntar sig att samplingsfunktionen anropas med jämna mellanrum monitor_pulse() för att beräkna pulsen, som kan konsulteras med funktionen last_pulse() eller med funktionen medelpuls() medelpulsen. Förutom att vara en begränsad resurs uteslöt jag att använda avbrott eftersom jag inte behövde omedelbara värden utan snarare hållbara över tid för att övervaka puls i mitt sömnhanteringsprojekt

    . Av de tester jag gjort verkar det i alla fall inte vara nödvändigt; antingen av enheten eller av beteendet hos puls, sampling vid en viss frekvens ger tillräckligt med information och inte mycket mer (relevant) erhålls genom att öka den, och det är inte heller möjligt att minska det mycket utan att förlora relevanta data för beräkningen; i tidiga versioner av koden för att övervaka läsningen av pulsoximeter Jag upptäckte att det inte var nödvändigt att hålla sig till en maximal mättid eftersom, om variationerna av successiva värden beaktades korrekt, var den mycket nära minimum.

    Följande exempelprogram visar hur man använder det föregående biblioteket för att mäta puls med en pulsoximeter. Förutom att instansiera klassen handled övervakning av nivån på oxihemoglobin/hemoglobin och med en mindre periodicitet värdet av puls beräknade och genomsnittliga.

    För att säkerställa att mätningarna är relevanta programmeras en väntetid innan något värde visas. Eftersom värdet kan vara felaktigt (till exempel om användaren tar bort enheten), visas värden endast om de ligger inom intervallet för de som anses giltiga.

    Post kommentar

    Du kanske har missat