Arduino - Oximetro - 01
Arduino - Oximetro - 01
Arduino - Oximetro - 01
Introdução
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.
Dessa forma, foi desenvolvido o circuito apresentado na Figura 1, que é apresentada a seguir.
01 x Arduino Nano;
01 x Sensor MAX30100;
03 x Resistores 4k7;
01 x LCD 16×2 com I2C;
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.
1. Resistores de Pull-Up;
2. Vias da Placa do Sensor;
3. Ajuste de Corrente do Sensor.
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.
Figura 3 – Resistores de 4k7R para
remover da Placa do Sensor MAX30100.
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.
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.
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.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "MAX30100_PulseOximeter.h"
void setup()
{
Serial.begin(115200);
//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);
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());
}
}
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.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "MAX30100_PulseOximeter.h"
PulseOximeter pox;
long int tempo = 0;
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.
void setup()
{
Serial.begin(115200);
//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);
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!");
}
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.
pox.setIRLedCurrent(MAX30100_LED_CURR_30_6MA);
Por fim, utilizamos a função abaixo, para detectar batimentos cardíacos do usuário .
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.
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());
}
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.
Conclusão
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.