Título do projeto: Aplicativo e Eletrônica Compacta para Eletrocardiograma
Programadores: André de Araújo Caetano & Anna Karen de Oliveira Pinto
Objetivo: O código foi desenvolvido durante o período da disciplina "IPIII - Iniciação à Pesquisa III". O principal objetivo é o desenvolvimento de um dispositivo baseado em Arduino capaz de coletar, armazenar e enviar dados gerados por um sensor de eletrocardiograma (ECG). Além disso, desenvolver um aplicativo capaz de receber via Bluetooth esses dados e realizar a análise desses dados. Por isso, o presente repositório pode ser resumido em dois códigos principais:
CODIGO_ESP32.ino
: Este é o resultado final do código do dispositivo com todos os sensores, controlado por uma ESP32;aplicativo.ipynb
: Este é o "aplicativo" que não teve a interface gráfica desenvolvida, mas que contém o recebimento dos dados via Bluetooth e o processamento deles.
O código final utilizado no dispositivo ESP32 está contido no caminho ELETRONICA/CODIGO_ESP32
, caso você esteja utilizando o ambiente Arduino IDE. Apesar de esta ser a plataforma mais conhecida para compilação de códigos para Arduino, é extremamente recomendável se utilizar a plataforma PlatformIO
disponível no Visual Studio Code (VS Code). Essa plataforma é bastante atualizada e compila códigos, especificamente para ESP32, muito mais rápido que a mencionada antes. Caso opte por utilizar a PlatformIO
, nesse mesmo diretório existe a pasta /IP - ECG
que é uma pasta reconhecida por essa plataforma como um projeto, o que otimiza o seu uso para outros usuários, pois todas as configurações e bibliotecas estão contidas nessa pasta.
Apesar da eletrônica ser uma parte fundamental desse projeto, o código final tem cerca de 308 linhas e seria extremamente extensivo discorrer durante o README
. Por isso, o principal do código a ser observado são as variáveis em que é conectado cada sensor, justamente por ter sido um dos grandes motivos pelo atraso do projeto.
Além disso, uma grande dificuldade foi encontrar tutoriais sobre a utilização conjunta dos sensores, visto que os membros do projeto não tinham tanto conhecimento acerca dessa área. Visando melhorar a experiência para outros programadores que queiram utilizar a microeletrônica, mas que não desejam se tornar profissionais ou querem algo mais facilitado, no diretório SKETCHS
você poderá encontrar uma série de arquivos .ino
que coordenam cada sensor individual com a ESP32, além de todas as versões do código final. A criação desse diretório se dá por outro motivo de atraso desse projeto: a recorrente falha eletrônica que esses dispositivos (muitas vezes sensíveis) apresentam em suas conexões, o que acaba "corrompendo" o código. Um grande exemplo foi a utilização do módulo Display OLED 128x32
que, quando suas conexões deram errado durante o uso do dispositivo, foi apresentado um erro sobre a conexão do tipo I2C que, mesmo sendo consertada, o dispositivo não voltava a funcionar. Uma solução para isso foi compilar o código individual do módulo com a ESP32 para reativar sua utilização e, por fim, compilar o seu código de interesse para retornar a normalidade. Erros semelhantes ocorreram com o módulo microSD
; por conta disso, optamos por criar essa pasta e facilitar a disponibilidade de códigos "base" para cada módulo.
Versão final do protótipo do dispositivo:
Por conta do tempo gasto na programação do dispositivo, o tempo investido no desenvolvimento do aplicativo (que em seu início seria um aplicativo de celular) foi bastante curto, sendo possível apenas o desenvolvimento das suas funcionalidades via plataforma Jupyter Lab, em um jupyter notebook. Apesar de não possuir interface gráfica, cumpre sua função proposta de:
- Estabelecer conexão Bluetooth com o dispositivo para descarga dos arquivos;
- Realizar a análise dos dados de ECG.
O aplicativo está intitulado de aplicativo.ipynb
e está dentro da pasta /APLICATIVO
. Essa pasta também consta o arquivo requirements.txt
, que contêm todas as bibliotecas utilizadas e suas versões. É extremamente recomendável criar um ambiente conda próprio para utilização desse código. A principal bibliteca do código é a NeuroKit2, que irá receber os arquivos do ECG e realizar seu processamento de forma mais fácil. O código pode ser dividido na mesma divisão das funções estabelecidas anteriormente. Também disponibilizamos dados de teste que foram obtidos por nosso equipamento para aqueles que, muito possívelmente, não terão a mesma eletrônica.
Dado isso, o fluxograma de utilização do código por um usuário seria:
2. Criação das pastas do paciente
que guardarão os arquivos e um arquivo concatenado de todos os outros para uma análise de longa duração
No caso, a pasta para os dados de teste contêm o nome do paciente Paciente_teste
.
2.1 No caso de se possuir o dispositivo: ligar a conexão do dispositivo, parear com o computador e rodar a linha de código referente a essa ação
Caso a conexão tenha se estabelecido de forma correta, a seguinte mensagem poderá ser observada no output da célula:
Além disso, no dispositivo irá aparecer o símbolo de Bluetooth estático.
Após concluir a etapa de criação das pastas do paciente (pasta Concatenados
, Dados
e Gráficos
), pode-se iniciar as análises dos dados carregados para os que tem o dispositivo.
Para utilizar os dados de teste, atribua o valor "Paciente_teste"
à variável nome_do_paciente
. Caso já tenha criado uma pasta do seu paciente, utilize o mesmo nome da pasta criada na etapa 2
. Altere também o numero da variável num_min
que irá ditar qual minuto dos dados lidos você deseja obter analisar. Após isso, rode a célula. O output para os dados de teste deverão ser:
Com a frequência cardíaca definida, podemos partir para o Perfil médio do padrão ECG
que determina como os dados estão se comportando. Caso seus dados tenham sido bons ou esteja utilizando os dados de teste, o gráfico será algo semelhante ao seguinte:
Após isso, o código irá salvar esse gráfico na pasta /Gráficos
do paciente estabelecido da etapa 3.1
.
Além do pico R, o ECG conta com outros picos que trazem outras informações dependendo da forma como o dado foi coletado. Para isso, recomenda-se a seguinte leitura. A função NeuroKit2 também já conta com essa funcionalidade, para isso o output será algo semelhante a:
Esse tipo de análise é útil para se analisar todo o período de coleta dos dados. O código dessa célula contém a variável segment_duration
que determina o range
de corte dos dados carregados. Essa variável é importante pois, o dado de teste utilizado é de 1 minuto de leitura, mas a leitura pode ser de horas ou até dias. Logo, a mudança dessa variável vai depender do contexto de cada aplicação.
Essa função já foi utilizada na etapa 3.1
, mas nessa parte do código podemos plotar todo o dado coletado (60 segundos) e identificar se os picos R estão seguindo um padrão tanto de distância quanto de intensidade.
A detecção de anomalias nos intervalos RR é realizada para identificar possíveis arritmias cardíacas. Arritmias são alterações nos intervalos entre batimentos cardíacos. No entanto, É FORTEMENTE RECOMENDÁVEL NÃO SE UTILIZAR DESSA FUNÇÃO COMO COMPROVAÇÃO MÉDICA DE POSSÍVEIS DOENÇAS!!! Essa função é apenas para efeito de finalização do pacote de futuras funções do aplicativo. Além disso, podemos obter a porcentagem de possíveis anomalias do total de picos R e comparar com os gráficos gerados nas funções anteriores para identificar se essas anomalias são erros ou não na obtenção dos dados.
Durante todo período do projeto se fez uso da IA conhecida como ChatGPT para aperfeiçoamento e correções necessárias do código.
Agradecemos ao CNPEM - Centro Nacional de Pesquisa em Energia e Materiais e a Ilum - Escola de Ciência pelo financiamento e tempo fornecido para o desenvolvimento desse projeto. Além disso, a todos os professores da Ilum por acreditarem em seus alunos e sempre inspirá-los a irem mais longe a cada dia.
"Eu trabalho com o que eu gosto, pude voltar a ser um herói. Eu estou vivendo o meu sonho, não tem nada melhor do que isso"
- Izuku Midoriya da obra My Hero Academia de Kohei Horikoshi