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
- Funcionamento do MAX30100
- Principais Características
- Interrupções Programáveis
- Como usar o MAX30100
- Biblioteca MAX30100
- O MAX30100 não realiza as leituras
Componentes Necessários para uso
- Placa Microcontroladora Arduino Compatível
- Protoboard de 400 pinos
- Kit jumpers macho-macho
- Conversor Bidirecional de 5V para 3V
- Sensor de Batimentos Cardíacos e Oxigenação MAX30100
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.
muito obrigada
É possível utilizar a mesma biblioteca, no entanto, é bom ficar atenta as diferenças entre o MAX30100 e o MAX30102.
32-bit FIFO vs. 16-bit FIFO - o MAX30102 possui mais armazenamento para dados que ainda não foram passados para o microcontrolador, permitindo uma transmissão de dados mais rápida.
Resolução ADC de 18-bit vs 14-bit - o MAX30102 é mais sensível a mudanças na voltagem do receptor IR.
Largura de pulso de LED de 69 us-114 us vs 200 us-1,6 ms - o MAX30102 possui uma largura de pulso de LED mais estreita, resultando em um menor consumo de energia.
Para exibir esse gráfico em um display, será necessário utilizar um display OLED. Nele você vai imprimir o valor da variável pox.getHeartRate() para mostrar o valor dos batimentos e imprimir o valor da variável pox.getSpO2() para mostrar o valor da oxigenação.
Você pode encontrar exemplos pesquisando sobre "sensor de batimento cardiaco + Oled Arduino"