Biblioteca Arduino para monitoramento de frequência cardíaca com oxímetro de pulso

Biblioteca Arduino para monitoramento de frequência cardíaca com oxímetro de pulso

Biblioteca Arduino para monitoramento de frequência cardíaca com oxímetro de pulso

Um dos parâmetros monitorados no meu projeto de gerenciamento do sono

É o pulso. para medi-lo Desenvolvi um dispositivo baseado no comportamento da hemoglobina e da oxiemoglobina contra diferentes comprimentos de onda de luz. Basicamente, trata-se de medir quanta luz de um determinado tipo é capaz de passar ou ser refletida em uma área bem irrigada do corpo. A frequência com que ocorre um ciclo completo deste fenômeno permite medir a pulso.

Tabela de conteúdos

    Na fase de projeto e testes do dispositivo de medição de pulso Desenvolvi alguns pequenos programas para me ajudar a verificar se a montagem estava correta. Primeiramente escrevi o código abaixo, que pegava os valores medidos de tempos em tempos (pelo menos a cada MAXIMUM_MEASUREMENT_TIME e no máximo cada MINIMUM_MEASUREMENT_TIME) quando variaram um mínimo entre um e o anterior (o valor que corresponde a MINIMUM_SIZE) e os monitorado a partir de um computador com um aplicativo Python para poder analisá-los mais tarde.

    Depois que os valores foram ajustados (começando com medições muito densas), obtive uma coleção de valores do oxímetro de pulso ao longo do tempo que eu poderia representar graficamente usando uma planilha, LibreOffice CalcName de LibreOffice, em concreto.

    gráfico de medições do oxímetro de pulso com

    Com os dados recolhidos, conforme representado na imagem acima, a próxima operação foi determinar se a densidade de valores nos permitia calcular de forma fiável mas "económica" (não amostrando mais do que os dados necessários) o valor do pulso; Como se pode verificar no gráfico abaixo, as medidas tomadas pareceram servir para obter os resultados que são razoáveis ​​de esperar.

    .

    medição da presença de oxiemoglobina ao longo do tempo com um oxímetro de pulso

    A seguir, com as informações da amostragem dos dados, foi necessário desenvolver um algoritmo que medisse a frequência do pulso. Atendendo ao gráfico que, para simplificar, assume-se que ele representa um layout semelhante ao Complexo QRS, o mais simples parece ser medir os tempos entre as partes mais proeminentes, com valores mais elevados (que corresponde à zona qRs de despolarização dos ventrículos), descartando a zona mais plana e "ruidosa", portanto mais difícil medir. A solução adotada, que corresponde ao código de teste abaixo, funciona conforme o seguinte procedimento:

    • Detectar a área que está sendo medida em cada caso para atender apenas aos picos de valor qRs e jogue fora o vale. Para isso, poderiam ser medidos valores superiores a uma determinada constante, mas existe o risco de que um indivíduo e/ou circunstâncias possam, ainda que proporcionalmente, aumentar ou diminuir os valores. Para evitar isso, considera-se um valor na área maior que aquele que ultrapassa o valor médio por um determinado coeficiente. Desta forma, a medição é autocalibrada com sensibilidade e pode ser ajustada ainda mais através do ajuste fino do coeficiente, que no meu caso consegui experimentalmente durante os testes.

      Escolha os valores da zona descendente para a medição (Rs) do pico qRs, o mais próximo possível do máximo da curva. Para saber que a zona ascendente está sendo abandonada basta verificar se um novo valor é menor que o anterior e verificar se o valor pesquisado ainda não foi encontrado pois, em geral, existem vários valores na zona descendente zona de qRs dependendo da densidade de amostragem. Para cronometrar o pulso, é armazenado o valor do instante em que o ponto foi encontrado (os milissegundos retornados por millis ()) e compara-o com o próximo.

      Para garantir que o valor medido seja o maior na zona descendente da curva mais alta, é utilizada uma variável boleano (medir_pulso neste exemplo e medição_de_pulso_ativa na biblioteca) que é ativado ao entrar na zona ascendente da curva maior e desativado quando é encontrado o primeiro valor descendente, que é o cronometrado.

      Como é usual representar a duração do pulso em batimentos por minuto (ppm), o valor do tempo entre os pulsos obtido é corrigido calculando-se a divisão do tempo total de representação (um minuto, 60000 milissegundos) pelo intervalo obtido por subtraindo os milissegundos atuais (do valor atual) entre aqueles cronometrados anteriormente.

      Para evitar medições falsas (como o aparelho medindo no vácuo, por exemplo), verifica-se se o resultado está entre os valores máximo e mínimo antes de tomá-lo como certo. Embora se considere como média que um valor normal para um adulto saudável em repouso esteja entre 60 e 100 ppm, abaixo existem valores admissíveis, é fácil encontrar 40 ppm num atleta em repouso, até 200 ppm durante exercício intenso e mais de 100 ppm em adultos sedentários em estados de excitação, justamente um fator interessante para o projeto de gerenciamento do sono o que me leva a desenvolver este dispositivo de medição de pulso. Por isso, é aconselhável flexibilizar bastante esses valores para que não se percam os extremos, que poderiam justamente mostrar aspectos relevantes.

      O novo valor médio é calculado diminuindo a relevância da média atual com base no número de valores amostrados e o último valor é somado, também ponderado com um coeficiente que o reduz tanto quanto mais valores foram medidos até agora .

    Por fim, utilizando o algoritmo descrito anteriormente, desenvolvi a biblioteca para calcular o pulso detectando a presença do hemoglobina ou o oxihemoglobina (dependendo do comprimento de onda da luz usada) do código abaixo.

    A biblioteca espera que a função de amostragem seja chamada periodicamente monitor_pulso() para calcular o pulso, que pode ser consultado com a função último_pulso() ou com a função pulso_médio() o pulso médio. Além de ser um recurso limitado, descartei o uso de interrupções porque não precisava de valores imediatos, mas sim sustentados ao longo do tempo para monitorar o pulso no meu projeto de gerenciamento do sono

    . Em todo caso, pelos testes que fiz, não parece necessário; seja pelo dispositivo ou pelo comportamento do pulso, a amostragem em uma determinada frequência oferece informações suficientes e não se obtém muito mais (relevante) aumentando-a, nem é possível diminuí-la muito sem perder dados relevantes para o cálculo; nas primeiras versões do código para monitorar a leitura do oxímetro de pulso Descobri que não era necessário limitar-se a um tempo máximo de medição, pois, se fossem consideradas corretamente as variações dos valores sucessivos, ele estava muito próximo do mínimo.

    O programa de exemplo a seguir mostra como usar a biblioteca anterior para medir o pulso com um oxímetro de pulso. Além de instanciar a classe Pulse monitoramento do nível de oxihemoglobina/hemoglobina e com menor periodicidade o valor do pulso calculado e médio.

    Para garantir que as medições sejam relevantes, é programada uma espera antes de exibir qualquer valor. Como o valor pode estar incorreto (por exemplo se o usuário retirar o dispositivo), os valores só são mostrados se estiverem dentro da faixa daqueles considerados válidos.

    Postar Comentário

    Você pode ter perdido