Como utilizar o Sensor de Batimento Cardíaco e Oxímetro – MAX30100

Em meio à pandemia e todas as condições adversas para a saúde pública, muitos projetos e ideias inovadoras surgiram para controle de saúde e formas de garantir a sobrevivência das pessoas enfermas, e é pensando nisso que elaboramos esse tutorial sobre MAX30100, abrangendo as suas características, funcionamento e uso em conjunto com Arduino, explicaremos as particularidades na arquitetura desse módulo e como torna-lo compatível com o seu microcontrolador de tensão lógica de 5V.
O tutorial será dividido nos seguintes tópicos, clique em algum específico para ser encaminhado para esse trecho na página.

Componentes Necessários para uso

 

Sensor MAX30100 – Sensor de Batimento Cardíaco e Oxímetro

O módulo MAX30100 é perfeito para monitoramento cardíaco, pois conta com o sensor para realizar as medições de frequência cardíaca e o oxímetro, responsável pela medição dos níveis de oxigênio no sangue.

O Módulo comporta o MAX30100, um sensor de frequência cardíaca e oxímetro de pulso, sendo que o MAX30100 em si é composto por um fotodetector, um LED vermelho e um LED infravermelho. A placa apresenta dois reguladores de tensão, pois o módulo necessita de tensão de 1,8V para acionamento dos LEDs e 3,3V para acionamento do CI, além disso contamos com três resistores (4,7KΩ) e capacitores, como pode ser visto abaixo.

 

O módulo conta com os seguintes pinos:

Cada um com a sua devida função, que pode ser vista abaixo:

GND- Pino Ground (Terra) do circuito.

RD- Utilizado para acionamento do LED vermelho do MAX30100

IRD- Utilizado para acionamento do LED Infravermelho do MAX30100.

INT- Esse pino pode ser programado de forma a gerar interrupções para o pulso, sendo uma linha de dreno puxada para o nível alto pelo resistor integrado. Em caso de interrupção o pino INT permanece em nível baixo até a solução do motivo da interrupção.

VIN- Pino de alimentação, ligado aos 3,3V ou 5V do Arduino

SDA- Esse é o pino de dados para conexão I2C

SCL- Esse é o pino de clock para conexão I2C

GND- Pino Ground (Terra) do circuito.


Funcionamento do MAX30100


Para compreender o funcionamento do MAX30100 ou de qualquer outro oxímetro, primeiramente precisamos entender brevemente sobre a anatomia da circulação sanguínea.
O nosso corpo é composto por veias e artérias, sendo que as veias são representadas visualmente por linhas na cor azul, e as artérias por linhas na cor vermelha. Nas veias, o sangue percorre os tecidos do corpo em sentido ao coração, nas artérias o sangue flui do coração em direção ao restante do corpo.
Estruturalmente, as artérias são vasos sanguíneos com paredes espessas e resistentes, sendo que o sangue flui em alta pressão através dessas vias. Em oposto, as veias são menos espessas e o sangue flui em menor pressão por elas. Estruturalmente, as artérias são vasos sanguíneos com paredes espessas e resistentes, sendo que o sangue flui em alta pressão através dessas vias. Em oposto, as veias são menos espessas e o sangue flui em menor pressão por elas.


O sangue que percorre a artéria é rico em oxigênio, podendo ser chamado de oxihemoglobina, sendo que na artéria temos maior absorção de luz infravermelha.
O sangue que percorre a veia é pobre de oxigênio e é conhecido como desoxihemoglobina, este por sua vez tem maior absorção de luz vermelha.

Como mencionado, o sangue que percorre as artérias é rico em oxigênio, quanto mais oxigenado o sangue, maior é a hemoglobina, dessa forma o sangue apresenta tom mais avermelhado e consequentemente maior é a absorção de luz infravermelha. Em suma, quanto mais oxigenado for o sangue, maior é a quantidade de luz infravermelha absorvida.
Com o bombeamento do coração, a luz refletida (aquela que não é absorvida) é alterada, gerando a leitura em onda no fotodetector, gerando então a frequência de batimentos cardíacos.

Para análise da oximetria é utilizado o mesmo princípio, sendo que é analisada a luz vermelha refletida no fotodetector.
Em resumo, a luz vermelha utilizada em conjunto com a luz infravermelha refletidas para o fotodetector, permite que sejam gerados dados sobre a oxigenação e a frequência cardíaca.

 

Principais Características


Uma característica interessante do MAX30100 é o baixo consumo de energia da placa, consumindo menos de 600µA durante a operação, além disso há a possibilidade de configurar para funcionamento em stand-bye. O baixo consumo permite o uso em conjunto com bateria para dispositivos vestíveis como relógios inteligentes.
Além dos sensores de medição, o módulo conta com um sensor de temperatura que pode ser utilizado para calibração das medições. As medições do termômetro variam entre: -40°C a 85°C, apresentando precisão de ±1°C.

 

Interrupções Programáveis


Como mencionado, a placa conta com interrupção no pino INT. Quando ocorre a interrupção o microcontrolador host pode executar outras tarefas enquanto há a coleta de dados pelo sensor MAX30100.
As interrupções podem ser habilitadas através de:

-FIFO quase cheio: Nessa situação, a situação ocorre quando o FIFO está cheio e há a possibilidade de perca dos dados futuros.
-Temperatura pronta: Ocorre quando a conversão de temperatura interna matricial é concluída.
-Dados de Frequência Cardíaca Prontos: Habilita após a coleta da amostra de dados de frequência cardíaca.
-Power Ready: Dispara durante a inicialização ou depois de brownout
-SpO2: É acionado após a coleta de amostra de dados de oxigenação.

 

Como usar o MAX30100


Antes de utilizar o MAX30100, devemos compreender que há uma peculiaridade no design da placa, como citado em Sensor MAX30100 – Sensor de Batimento Cardíaco e Oxímetro, o módulo conta com dois reguladores lineares de tensão, um regulador de 3,3V e um de 1,8V.

Para dissecar esse circuito, podemos analisar o esquemático e verificar cada ligação de forma individual, vemos onde cada pino é ligado e podemos ter um vislumbre mais preciso da estrutura.

 

Como pode ser visto, os resistores pull-up são conectados no regulador de 1,8V e aos pinos SDA, SCL e INT.  

 

Em razão disso, se os pinos I2C forem conectados às portas lógicas do Arduino, com tensão de saída de 5V, a conexão não será reconhecida, pois esses pinos estão com pull-up de 1,8V e para o Arduino reconhecer como HIGH, a tensão precisa e exceder 3V.
Para utilizar em conjunto com o Arduino, nós precisaremos de um conversor de tensão de nível lógico de 5V para 3,3V e isso será o suficiente para solucionar a falta de compatibilidade.

Para utilização do conversor de nível lógico bidirecional precisamos ligar HV em 5V, além do GND. O mesmo devemos fazer com o lado de menor tensão, ligamos LV em 3,3 V e ao GND.
Depois disso, ligamos o pino de nível lógico que desejamos converter e do outro lado teremos a tensão de saída almejada.
O nosso módulo sensor é ligado em I2C, então para isso precisamos ligar SDA em A4 do Arduino, e SCL em A5.
No entanto, esses pinos geram saída de nível lógico de 5V, então ligaremos no conversor e depois no módulo, seguindo a tabela abaixo:

 

Para criação do esquemático utilizamos o software Fritzing, no entanto não temos o componente MAX30100, então para exemplo utilizamos o MAX30102, siga a ligação com base no nome dos pinos, conforme tabela.

Há outras formas de utilizar o MAX30100 sem a necessidade do uso do conversor de nível lógico, é possível encontrar esses métodos alternativos em buscas na internet, não iremos detalhar esses outros procedimentos pois exigem modificações na placa e isso pode danificar o componente, então não recomendamos e por isso não detalharemos.


Biblioteca MAX30100

Para utilizar o módulo é necessário instalar a biblioteca do MAX30100 na IDE do Arduino. Essa biblioteca conta com os principais códigos para teste do sensor, facilitando o uso e elaboração de projetos. Para inserirmos a biblioteca, abriremos a IDE do Arduino e iremos em Sketch> Incluir Biblioteca> Gerenciar bibliotecas...

Ao abrir, buscaremos por: MAX30100

 

Instalaremos a biblioteca MAX30100lib by OXullo Intersecans.
Ao abrir veremos os exemplos disponíveis para uso com o nosso módulo

 

Depois disso carregaremos um dos exemplos para verificar o funcionamento de todas as funções da placa.
Para isso vá em Arquivo> Exemplos> MAX30100lib > MAX30100_Tester


 

Em seguida selecionaremos a placa em Ferramentas> Placa: Arduino AVR Boards> Arduino Uno, e depois a porta em Ferramentas> Porta> COM...


Com isso podemos constar que tudo está de acordo, agora podemos carregar o programa que fará a medição da frequência cardíaca e da oxigenação sanguínea.

Você pode testar os exemplos disponíveis na biblioteca do MAX30100 para medir os batimentos cardíacos e a oxigenação, além de pensar em projetos interessantes baseados neles. Vamos verificar o exemplo disponível em Arquivos> Exemplos> MAX30100lib> MAX30100_Minimal. Ao carregar o programa para a placa, você verá os valores que representam o batimento cardíaco e a oxigenação, como abaixo:

Agora iremos desenvolver um leitor de batimentos cardíacos que gera um gráfico na IDE do Arduino.
Para isso utilizaremos o Serial Plotter da IDE do Arduino. Esse recurso possibilita que seja gerado um gráfico com os valores lidos nas portas analógicas ou digitais, gerando a variação da leitura de um sensor, por exemplo.
Podemos utilizar o exemplo MAX30100_Minimal, mas para geração do gráfico precisamos dos valores crus, sem a unidade de medida, então colocaremos as unidades de medida como comentários, para que não sejam lidos durante a execução do programa.

E para criar a leitura dos dois dados, devemos inserir as seguintes linhas em nosso código:

 

Ao realizar as modificações, o código ficará da seguinte forma:

 

/* Programa para medição de MAX30100
 *  Autoria: Curto Circuito
 *  Baseado no exemplo MAX30100_Minimal by OXullo Intersecans
 *  Esse programa é parte do Tutorial Como utilizar o Sensor de Batimento Cardíaco e Oxímetro – MAX30100, 
 *  disponível no blog da Curto Circuito: 
 *  https://www.curtocircuito.com.br/blog/como-utilizar-o-sensor-de-batimento-cardiaco-e-oximetro-%E2%80%93-max30100
 */

#include <Wire.h>                 //inclusão de biblioteca I2C
#include "MAX30100_PulseOximeter.h"  //inclusão da biblioteca do MAX30100

#define REPORTING_PERIOD_MS     1000  //define o intervalo em 1000ms ou 1s entre as medições


PulseOximeter pox; //cria o objeto PulseOximeter

uint32_t tsLastReport = 0; //variável criada para armazenar o tempo da medição

// função para quando o pulso é detectado
void onBeatDetected()
{
    Serial.println("Beat!");  // Printa a mensagem "Beat!"
}

void setup()  //Laço de configuração
{
    Serial.begin(115200); // define Baudrate para 115200

    Serial.print("Inicialização do sensor..."); //Printa a mensagem "Inicialização do sensor"

    // Inicializa ao sensor de pulso
    if (!pox.begin()) { //possibilita a comunicação com o sensor
        Serial.println("Falhou"); //Printa a mensagem "Falhou"
        for(;;);
    } else {   //do contrário
        Serial.println("Sucesso"); //Printa a mensagem "Sucesso"
    }


     pox.setIRLedCurrent(MAX30100_LED_CURR_50MA);
/* ajuste de corrente do sensor, os valores podem ser:
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
*/ //quanto maior a corrente, maior é a iluminação do LED no sensor

    // retorno para detecção do "beat"
    pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop()  //laço de repetição
{

  
    // Os dados biométricos são coletados pelo sensor
    pox.update();

//
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) { //os dados serão imprimidos a cada 1000us ou 1s
       // Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate()); //prime o dado de frequência cardíaca
        Serial.print(" ");
       // Serial.print("bpm / SpO2:");
      Serial.println(pox.getSpO2());  //prime o dado de oxigenação
      Serial.print(" ");
      //  Serial.println("%");

        tsLastReport = millis(); 
    }
}

 

Você pode carregar esse código para a placa e verificar a geração de gráfico da seguinte forma:

Abra a sua IDE do Arduino e vá em Ferramentas > Plotter Serial


E então você verá o gráfico sendo gerado de acordo com a leitura de dados do sensor:

 

O MAX30100 não realiza as leituras


Caso você não consiga realizar a leitura mesmo depois de utilizar o conversor de nível lógico, verifique os seguintes aspectos:
-Veja se a ligação entre o Arduino e o sensor está correta e se os fios estão bem encaixados
-Certifique-se de que você está pressionando o sensor corretamente, se aplicada muita força, isso pode pressionar o sangue e prejudicar a leitura, do contrário, se não houver pressão o suficiente o sensor pode ler ruídos externos, se possível, utilize um elástico prendendo o dedo ao sensor.
-Você também poderá realizar a leitura em outros tecidos capilares como o lóbulo da orelha. 

 

Conclusão

O MAX30100 é um sensor que se mostra eficaz para realizar as medições de frequência cardíaca e de oxigenação do sangue, apesar das adaptações que são necessárias para uso. O preço do sensor em conjunto com o módulo bidirecional é muito próximo do sensor MAX30102 que não necessita do módulo bidirecional, mas o valor do MAX30100 isoladamente é abaixo, para o caso de você já possuir o conversor. Além disso, você poderá utilizar o conversor em outros projetos se optar pela compra do MAX30100 com o conversor, no entanto, por precisarmos do sensor e do conversor, o nosso projeto ocupará um espaço maior. Cabe a você escolher os componentes que mais se adequam ao seu projeto.
Espero que esse tutorial tenha sido útil, não esqueça de deixar o seu comentário com dicas, sugestões, opiniões e dúvidas.