Como utilizar o sensor de frequência cardíaca e oxímetro MAX30100 com Arduino
O sensor de frequência cardíaca e oxímetro MAX30100 é um dispositivo biométrico integrado capaz de medir a frequência cardíaca e a concentração de oxigênio no sangue, sendo aplicado em projetos de monitoramento de médico e condicionamento físico.
O sensor de frequência cardíaca e oxímetro MAX30100 possui um par de LEDs de alta intensidade (um vermelho e um infravermelho) e um fotodetector. Para realizar as medições os LEDs iluminam o dedo, lóbulo da orelha ou qualquer outra área em que a pele não seja muito grossa, e o fotodetector mede a quantidade de luz refletida.
Quando o coração bombeia sangue ocorre um aumento no nível de sangue oxigenado. Por sua vez, quando o coração relaxa o volume de sangue diminui. O sensor mede a frequência cardíaca com base no tempo entre o aumento e diminuição do sangue oxigenado.
O sangue oxigenado (mais vermelho) absorve mais luz infravermelha e permite maior passagem da luz vermelha. Ao contrário, o sangue desoxigenado absorve mais a luz vermelha e permite maior passagem da luz infravermelha. Com base na quantidade de absorção de ambas as luzes, o sensor consegue determinar o nível de oxigênio do sangue.
O sensor de frequência cardíaca e oxímetro MAX30100 opera com tensão de alimentação entre 3,3V a 5,5V e uma das suas vantagens é seu baixo consumo de energia, consumindo menos de 600 μA durante a medição e 0,7 μA em modo de espera.
O sensor de frequência cardíaca e oxímetro MAX30100 usa a interface I2C para comunicação com o microcontrolador. Seus pinos são ilustrados na Figura 3 e serão detalhados a seguir.
Funções dos pinos:
Vin: Pino de alimentação com tensão entre 3,3V e 5V;
SCL: Serial clock para sincronização da comunicação;
SDA: Serial data para envio e recebimento de dados;
INT: Pino que pode ser programado para gerar interrupções de pulso. Está em nível lógico alto. Quando ocorre uma interrupção, o pino é colocado em nível lógico baixo até que a interrupção seja parada;
IRD: Pino para acionamento do LED infravermelho;
RD: Pino para acionamento do LED vermelho;
GND: Aterramento do sensor.
Agora que já conhecemos algumas características do sensor de frequência cardíaca e oxímetro MAX30100, vamos aprender como utilizá-lo com o Arduino.
OBSERVAÇÃO: O sensor foi desenvolvido para placas microcontroladores que possuam nível lógico de 3,3 V. Para utilizar no Arduino (Nível lógico = 5V) será necessário retirar os resistores pull-up, ilustrados na Figura 4.
O sensor ficará como na Figura 5.
O sensor ficará como na Figura 5.
MATERIAIS NECESSÁRIOS
- 1 x Placa UNO SMD R3 Atmega328 compatível com Arduino UNO;
- 1 x Cabo USB;
- 1 x Sensor de frequência cardíaca e oxímetro MAX30100;
- 3 x Resistores 4.7 kΩ;
- 1x Protoboard;
- Jumpers macho-macho.
ESQUEMÁTICA DE LIGAÇÃO
Monte o circuito da Figura 6 utilizando o sensor de frequência cardíaca e oxímetro MAX30100, os resistores e os jumpers.
Ao montar o circuito observe os seguintes pontos:
- O pino Vin do sensor deve ser conectado à entrada 3.3V do Arduino;
- Conecte os resistores de 4,7 kΩ como pull-up nos pinos SCL, SDA e INT.
- O pino SCL deve ser ligado à entrada SCL do Arduino;
- O pino SDA deve ser conectado à entrada SDA do Arduino;
- O pino INT deve ser conectado à porta digital 2 do Arduino.
- O pino GND do sensor deve ser conectado ao GND do Arduino.
ELABORANDO O CÓDIGO
Após a montagem do circuito, vamos programação do Sketch no Arduino IDE. Nesse projeto, vamos utilizar o sensor de frequência cardíaca e oxímetro MAX30100 em conjunto com o Arduino para medir a frequência cardíaca (batimentos por minuto – BPM) e o nível de oxigênio no sangue (SpO2) de uma pessoa.
Para tal, vamos fazer uso da biblioteca “MAX30100_PulseOximeter.h”. Para instalá-la, acesse o gerenciador de bibliotecas (Ctrl+Shift+I) e busque por MAX30100lib, conforme a Figura 7.
Vamos entender a lógica de programação desse projeto a partir dos seguintes passos:
1. Incluir as bibliotecas
Iniciamos o código incluindo as bibliotecas wire.h e MAX30100_PulseOximeter.h.
2. Criar as variáveis
Usamos a variável REPORTING_PERIOD_MS para armazenar o intervalo de tempo entre as medições (1000 milissegundos ou 1 segundo).
Em seguida, criamos a variável tcLastReport para armazenar a hora em que ocorreu o último batimento cardíaco em milissegundos.
3. Declarar o objeto pox
O objeto pox é do tipo PulseOximeter que é nativo da biblioteca MAX30100_PulseOximeter.h.
4. Criar função de retorno onBeatDetected()
A função onBeatDetected() exibirá a mensagem “Batimento detectado” no monitor serial quando ocorrer um batimento cardíaco.
5. Inicialização da comunicação serial e do sensor
Na função setup() inicializamos a comunicação serial com taxa de transmissão de 9600. Em seguida, inicializamos o sensor e verificamos se houve sucesso ou não na comunicação.
6. Configurar o LED infravermelho e registrar a função de retorno
Ainda na função setup() configuramos em 7,6 mA a corrente do LED infravermelho por meio da instrução pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);. Vale a pena lembrar que quanto maior a corrente, mais brilhante será o LED e mais profundamente ele atinge a pele.
Logo após, registramos a função de retorno pox.setOnBeatDetectedCallback(onBeatDetected);.
7. Realizar a leitura de batimento e Saturação do sangue.
Para atualizar a leitura do sensor usamos o comando “pox.update()”.
Os comandos “pox.getHeartRate()” e “pox.getSpO2()” serão responsáveis por fazer a leitura do batimento e saturação do sangue, respectivamente.
Ao final, o Sketch desse projeto ficará da seguinte maneira:
/* - SENSOR DE FREQUÊNCIA CARDÍACA E OXÍMETRO MAX30100 - ===================================================== ===== BLOG DA ROBOTICA - www.blogdarobotica.com ===== ===================================================== Autor: Jonas Souza E-mail: contato@blogdarobotica.com Facebook: facebook.com/blogdarobotica Instagram:@blogdarobotica YouTube: youtube.com/user/blogdarobotica ===================================================== ===== CASA DA ROBOTICA - www.casadarobotica.com ===== ===================================================== Facebook: facebook.com/casadaroboticaoficial Instagram:@casadarobotica ===================================================== */ #include <Wire.h> //Biblioteca para comunicação I2C #include "MAX30100_PulseOximeter.h" //Biblioteca para uso do sensor de frequência cardíaca e oxímetro MAX30100 #define REPORTING_PERIOD_MS 1000 // Intervalo entre a medição de cada amostra uint32_t tsLastReport = 0; // Tempo da última amostra dectada PulseOximeter pox; //Declaração objeto pox void onBeatDetected() { //Função executada quando um pulso é detectado Serial.println("Batimento detectado"); } void setup() { Serial.begin(9600); //Inicialização da comunicação serial Serial.print("Iniciando funcionamento do sensor "); if (!pox.begin()) //Testa a comunicação com o sensor { Serial.println("Falhou ! "); //Se a comunicação não foi realizada corretamente exibe a mensagem "Falhou" for (;;); } else { Serial.println("Sucesso ! "); //Se a comunicação foi realizada com sucesso exibe a mensagem "Sucesso !" } pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA); // Define que o sensor use 7,6 mA para o led pox.setOnBeatDetectedCallback(onBeatDetected); // Registra todas as vezes em que um batimento for detectado } void loop() { pox.update(); //Atualiza a leitura do sensor if (millis() - tsLastReport > REPORTING_PERIOD_MS) { //Imprime a leitura em intervalos de 1000ms Serial.print("Taxa de Batimento : "); Serial.print(pox.getHeartRate()); // Faz a leitura de batimento cardíaco Serial.print("bpm / Saturacao sangue(SP02) : "); Serial.print(pox.getSpO2()); //Realiza a leitura da saturação do sangue Serial.println("%"); tsLastReport = millis(); } }
O funcionamento deste projeto pode ser visualizado no Vídeo 1.
Espero ter ajudado,
Obrigado a todos e em caso de dúvidas deixe seu comentário abaixo!
Att. Jonas Souza
Graduando em Engenharia Elétrica.