Em diversos esportes e situações médicas, precisamos monitorar o nível de batimentos cardíacos e oxigenação do paciente/atleta. Assim, necessitamos utilizar sistemas capazes de calcular os sinais vitais do coração através de sensores que coletam os batimentos cardíacos do coração. Portanto, nesse artigo aprenderemos como desenvolver um Oxímetro com Arduino.
Nesse artigo, você aprenderá como desenvolver um sistema para monitoramento dos batimentos cardíacos e utilizará, também, as batidas do coração para determinar o nível de oxigenação sanguínea através com o Arduino e o Sensor MAX30100.
Portanto, por meio desse artigo você aprenderá:
1 – Configurar o Hardware do Sensor MAX30100;
2 – Realizar a Comunicação entre o Sensor MAX30100 e o Arduino;
3 – Criar seu oxímetro.
A seguir, iniciaremos a estrutura de apresentação passo a passo do projeto.
Desenvolvimento do Projeto Oxímetro com Arduino
Conforme citado anteriormente, o projeto consiste em criar um sistema para monitorar o nível de batimentos cardíacos e, através desses sinais, monitorar o nível de oxigenação sanguínea.
Dessa forma, foi desenvolvido o circuito apresentado na Figura 1, que é apresentada a seguir.
Portanto, conforme é possível observar, esse circuito possui um sensor MAX30100, que será responsável por realizar a leitura dos batimentos cardíacos, um Arduino NANO para realizar a leitura do sensor e transmissão dos dados para o LCD I2C.
Em seguida, apresentaremos o material necessário para construção do projeto.
Lista de Componentes Eletrônicos de como para fazer o Oxímetro com Arduino
01 x Arduino Nano;
01 x Sensor MAX30100;
03 x Resistores 4k7;
01 x LCD 16×2 com I2C;
Assim, a partir desses componentes, realizaremos a montagem e apresentação do algoritmo para leitura dos sinais vitais com o Sensor MAX30100 e apresentação dos valores no display LCD 16×2.
Entretanto, antes de iniciarmos a apresentação da lógica de controle, precisamos deixar você informado a respeito de algumas características do Sensor MAX30100.
O sensor MAX30100, que foi utilizado nesse projeto, necessita de alguns ajustes para garantir uma correta comunicação. Portanto, precisamos falar dos 3 problemas que você pode passar com esse sensor e como resolvê-los.
Dessa forma, todos esses três problemas são responsáveis por impedir a leitura dos sinais ou erro de comunicação entre o sensor e o Arduino. Assim, precisamos corrigí-los a seguir.
Os 3 Problemas do Sensor MAX30100
O sensor utilizado nesse projeto é apresentado na Figura 2, que é apresentada a seguir.
Portanto, a partir da análise da Figura 2, apresentamos os 3 problemas a seguir:
- Resistores de Pull-Up;
- Vias da Placa do Sensor;
- Ajuste de Corrente do Sensor.
Primeiramente, discutiremos o uso externo dos resistores de Pull-Up.
Resistores de Pull-Up
Primeiramente, é preciso avaliar os 3 resistores de Pull-up., que estão presentes na placa do sensor. Eles são responsáveis por manter o nível lógico do barramento I2C, porém, o MAX30100 IC usa 1,8V para tensão de alimentação positiva no barramento I2C. Para isto, esse módulo da Figura 2 usa dois reguladores para atingir essa tensão.
Porém, conforme é possível observar na Figura 3, esses 3 resistores são responsáveis por manter esse nível de 1,8V no barramento de comunicação. Entretanto, isto pode gerar problemas na comunicação e o sensor não funcionará bem com o Arduino, pois ele trabalha com níveis lógicos mais altos.
Dessa forma, necessitamos remover esses três resistores e utilizar resistores externos de 4k7R, conforme apresentados na Figura 1.
Assim, após a remoção dos três resistores com um ferro de solda, você precisa avaliar o segundo possível problema em sua placa.
Avaliar as Vias da Placa do Sensor
Depois que retiramos os resistores, precisamos avaliar as vias da placa do sensor, ou seja, em alguns sensores desse modelo, ocorre um problema nas vias que comunicam as camadas superior e inferior da placa do sensor.
Assim, algumas vias podem estar não metalizadas ou vir com uma baixa quantidade de metal que, visualmente, pode apresentar a presença de metal, porém, não conecta as duas camadas da placa do sensor.
Nesse caso, sugerimos verificar a continuidade entre as vias superior e inferior, a fim de detectar a conexão entre elas. Assim, sugerimos criar jumpers entre uma camada e outra para solucionar o problema apresentado.
Logo após esses testes, insira o sensor no circuito e teste um programa exemplo para monitorar os batimentos cardíacos e nível de oxigenação sanguínea.
Logo, caso o seu sensor apresente a mensagem de comunicação no monitor serial, mas apresente os valores de batimento cardíaco e oxigenação sanguíneo zerados, você precisará executar um terceiro ajuste.
Entretanto, esse ajuste será no software do seu programa.
Ajuste de Corrente do Sensor do Oxímetro com Arduino
A princípio, nós utilizaremos a biblioteca Max30100_PulseOximeter. Com ela, temos um parâmetro de ajuste da corrente do LED infravermelho. Portanto, sugerimos você alterar o valor de corrente para encontrar um parâmetro ideal para a leitura dos sinais vitais.
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
Em nosso projeto, foi fundamental ajustar o valor da corrente para realizar a leitura dos sinais vitais.
Portanto, você pode utilizar os seguintes parâmetros para testar e ajustar a corrente ideal para o LED do sensor.MAX30100_LED_CURR_0MA
- MAX30100_LED_CURR_4_4MA
- MAX30100_LED_CURR_7_6MA
- MAX30100_LED_CURR_11MA
- MAX30100_LED_CURR_14_2MA
- MAX30100_LED_CURR_17_4MA
- MAX30100_LED_CURR_20_8MA
- MAX30100_LED_CURR_24MA
- MAX30100_LED_CURR_27_1MA
- MAX30100_LED_CURR_30_6MA
- MAX30100_LED_CURR_33_8MA
- MAX30100_LED_CURR_37MA
- MAX30100_LED_CURR_40_2MA
- MAX30100_LED_CURR_43_6MA
- MAX30100_LED_CURR_46_8MA
- MAX30100_LED_CURR_50MA
Esses valores variam entre 0mA até 50mA. Portanto, caso você não utilize essa função em seu código, seu LED irá operar com a corrente padrão e máxima de 50mA.
Sendo assim, após estas configurações, iniciaremos a apresentação passo a passo da construção da lógica de programação desenvolvida.
Construção da Lógica de Controle do seu Oxímetro com Arduino
Primeiramente, apresentaremos a lógica completa e, em seguida, iniciaremos a discussão passo a passo do programa desenvolvido.
<code>#include <Wire.h> #include <LiquidCrystal_I2C.h> #include "MAX30100_PulseOximeter.h" LiquidCrystal_I2C lcd(0x27,16,2); // Configurando o endereco do LCD 16x2 para 0x27 #define TEMPO_LEITURA_MS 1000 PulseOximeter pox; long int tempo = 0; // Callback (registered below) fired when a pulse is detected void onBeatDetected() { Serial.println("Beat!"); } void setup() { Serial.begin(115200); Serial.print("Initializing pulse oximeter.."); //Inicializa o Sensor MAX30100 if (!pox.begin()) { Serial.println("Falha na Inicializacao do Sensor"); for(;;); } else { Serial.println("Comunicacao Realizada com Sucesso!"); } //O padrao de corrente para o LED e de 50mA, mas poderá ser alterado //Descomente a linha abaixo e ajuste o valor de corrente desejado para a aplicacao //pox.setIRLedCurrent(MAX30100_LED_CURR_30_6MA); //Registrar um retorno de chamada para a detecção de batimentos pox.setOnBeatDetectedCallback(onBeatDetected); } void loop() { //Atualizacao dos dados do Sensor MAX30100 pox.update(); if (millis() - tempo > TEMPO_LEITURA_MS) { Serial.print("Frequencia Cardiaca:"); Serial.print(pox.getHeartRate()); Serial.print("SpO2:"); Serial.print(pox.getSpO2()); Serial.println("%"); tempo = millis(); lcd.clear(); lcd.setCursor(0,0); lcd.print("BPM:"); lcd.setCursor(6,0); lcd.print(pox.getHeartRate()); lcd.clear(); lcd.setCursor(0,1); lcd.print("SpO2:"); lcd.setCursor(7,0); lcd.print(pox.getSpO2()); } }</code>
Primeiramente, realizamos a declaração das bibliotecas de comunicação I2C, do LCD e do sensor MAX30100. Em seguida, definimos objetos, nomes e declaração de variáveis, conforme apresentado a seguir.
<code>#include <Wire.h> #include <LiquidCrystal_I2C.h> #include "MAX30100_PulseOximeter.h" LiquidCrystal_I2C lcd(0x27,16,2); // Configurando o endereco do LCD 16x2 para 0x27 #define TEMPO_LEITURA_MS 1000 PulseOximeter pox; long int tempo = 0;</code>
Em seguida, declaramos a função onBeatDetected. Esta função é utilizada para apresentar a mensagem “Beat!” quando o sensor detecta algum batimento do usuário.
<code>// Callback (registered below) fired when a pulse is detected void onBeatDetected() { Serial.println("Beat!"); }</code>
Posteriormente, entramos na função setup para realizar as configurações do sistema, conforme apresentado a seguir.
<code>void setup() { Serial.begin(115200); Serial.print("Initializing pulse oximeter.."); //Inicializa o Sensor MAX30100 if (!pox.begin()) { Serial.println("Falha na Inicializacao do Sensor"); for(;;); } else { Serial.println("Comunicacao Realizada com Sucesso!"); } //O padrao de corrente para o LED e de 50mA, mas poderá ser alterado //Descomente a linha abaixo e ajuste o valor de corrente desejado para a aplicacao //pox.setIRLedCurrent(MAX30100_LED_CURR_30_6MA); //Registrar um retorno de chamada para a detecção de batimentos pox.setOnBeatDetectedCallback(onBeatDetected); }</code>
Inicialmente, inicializamos a comunicação serial para 115200 e testamos a inicialização do sensor, conforme apresentado a seguir.
<code> Serial.begin(115200); Serial.print("Initializing pulse oximeter.."); //Inicializa o Sensor MAX30100 if (!pox.begin()) { Serial.println("Falha na Inicializacao do Sensor"); for(;;); } else { Serial.println("Comunicacao Realizada com Sucesso!"); }</code>
Em seguida, configuramos a corrente do LED infravermelho. Esse valor foi de extrema importância, a fim de garantir um parâmetro ideal para leitura dos sinais vitais, conforme apresentado abaixo.
<code>pox.setIRLedCurrent(MAX30100_LED_CURR_30_6MA);</code>
Por fim, utilizamos a função abaixo, para detectar batimentos cardíacos do usuário .
<code>//Registrar um retorno de chamada para a detecção de batimentos pox.setOnBeatDetectedCallback(onBeatDetected);</code>
Portanto, caso o oxímetro com Arduino detecte algum batimento, ele chamará a função onBeatDetected e apresentará a mensagem “Beat!”, conforme apresentado anteriormente.
Finalmente, entramos na função loop. Dentro desta função iremos realizar a leitura dos dados do sensor e apresenta-los na tela LCD, a fim de informar os níveis de frequência cardíaca e oxigenação sanguínea.
Ao entrar na função loop, o sensor irá atualizar os seus dados através da função a seguir.
<code>//Atualizacao dos dados do Sensor MAX30100 pox.update();</code>
Apresentação dos Sinais Vitais no LCD 16×2
Em seguida, o sistema irá apresentar os dados a cada 1 segundo, com base no tempo calculado com a função millis. A estrutura de código é apresentada a seguir.
<code>if (millis() - tempo > TEMPO_LEITURA_MS) { Serial.print("Frequencia Cardiaca:"); Serial.print(pox.getHeartRate()); Serial.print("SpO2:"); Serial.print(pox.getSpO2()); Serial.println("%"); tempo = millis(); lcd.clear(); lcd.setCursor(0,0); lcd.print("BPM:"); lcd.setCursor(6,0); lcd.print(pox.getHeartRate()); lcd.clear(); lcd.setCursor(0,1); lcd.print("SpO2:"); lcd.setCursor(7,0); lcd.print(pox.getSpO2()); }</code>
Portanto, a cada 1 segundo, o sistema irá apresentar os sinais vitais do usuário em um LCD 16×2, conforme apresentado na Figura 2.
Entretanto, se nenhum batimento cardíaco for detectado, o sistema apresentará valor 0 nos campos do LCD 16×2. Isto é apresentado na Figura 3.
Dessa forma, após a apresentação dos dados, o fluxo de execução retorna para o início da função loop, atualiza os dados e aguarda 1 segundo para apresenta-los novamente.
Conclusão de como fazer um oxímetro com arduino
Portanto, o sistema apresentou boa resposta na detecção dos sinais, porém, é importante saber que esse sensor pode apresentar algum tipo de estabilidade na leitura do sinal.
Além disso, é importante lembrar que esse sensor não é recomendado para retirar qualquer conclusão médica de pacientes.
Assim, caso você queira fazer seu próprio oxímetro e entender o seu princípio de funcionamento, te recomendamos reproduzir esse projeto e adquirir o nosso sensor, que já é testado e validado em cada artigo desenvolvido.
Por fim, agradecemos sua leitura e te convidamos a ler outros artigos em nosso blog Autocore Robótica.