Monitor de oxigênio no sangue e frequência cardíaca com MAX30100 no Arduino

Tempo de leitura: 7 minutes

Monitor de oxigênio no sangue e frequência cardíaca com oxímetro de pulso MAX30100 e Arduino

Neste projeto, faremos um dispositivo que pode medir o oxigênio no sangue e a frequência cardíaca usando o oxímetro de pulso MAX30100 e o Arduino. A concentração de oxigênio no sangue denominada SpO2 é medida em porcentagem e os batimentos cardíacos/frequência de pulso são medidos em BPM. O MAX30100 é uma solução para sensor de oximetria de pulso e monitor de frequência cardíaca. Você também pode usar MAX30102, que é uma versão atualizada do MAX30100.

Exibiremos o valor de SpO2 e BPM em tela OLED de 0,96″. A cada batida, o valor de exibição é alterado na tela OLED. Usando o módulo Bluetooth HC-05/HC-06 (operando em modo escravo), podemos enviar dados para o aplicativo Android sem fio e monitorar os dados no aplicativo, bem como manter um registro dos dados em formato de texto. Desta forma, podemos enviar os dados lidos do dispositivo para outro dispositivo ou para a Internet. Este dispositivo vestível pode ser usado por atletas para monitorar sua frequência cardíaca e níveis de oxigênio no sangue durante um treino.

 

Lista de Materiais

A seguir estão os componentes necessários para este projeto, ou seja, monitor de oxigênio no sangue e frequência cardíaca com oxímetro de pulso MAX30100 e Arduino. Todos os componentes podem ser adquiridos no Amazon ou MercadoLivre.

Nome dos ComponentesDescriçãoQuantidade
1Arduino BoardArduino Nano1https://amzn.to/39pOOqh
2Pulse Oximeter SensorMódulo MAX301001No ML (Link)
4OLED Display0.96″ I2C OLED Display1https://amzn.to/3oJQVf4
5Bluetooth ModuleHC-05/HC-06 Bluetooth1https://amzn.to/39pQa4l
6Connecting WiresJumper Wires10https://amzn.to/3i9YI37
7ProtoBoard1https://amzn.to/3snWphs

 

Como funciona o oxímetro de pulso?

O oxigênio entra nos pulmões e é passado para o sangue. O sangue transporta oxigênio para os vários órgãos do nosso corpo. O principal meio pelo qual o oxigênio é transportado em nosso sangue é por meio da hemoglobina. Durante uma leitura de oximetria de pulso, um pequeno dispositivo semelhante a uma pinça é colocado em um dedo, lóbulo da orelha ou dedo do pé.

Pequenos feixes de luz passam pelo sangue no dedo, medindo a quantidade de oxigênio. Ele faz isso medindo as mudanças na absorção de luz no sangue oxigenado ou desoxigenado.

 

Oxímetro de pulso MAX30100

O sensor é uma solução integrada de sensor de oximetria de pulso e monitor de frequência cardíaca. Ele combina dois LEDs, um fotodetector, óptica otimizada e processamento de sinal analógico de baixo ruído para detectar sinais de pulso e frequência cardíaca. Ele opera com fontes de alimentação de 1,8 V e 3,3 V e pode ser desligado por meio de software com corrente de espera insignificante, permitindo que a fonte de alimentação permaneça conectada o tempo todo.

 

Características

1. Consome energia muito baixa (opera de 1,8 V e 3,3 V)
2. Corrente de desligamento ultrabaixa (0,7 µA, típico)
3. Capacidade de saída rápida de dados

 

Funcionamento do oxímetro de pulso MAX30100 e do sensor de frequência cardíaca

O aparelho possui dois LEDs, um emitindo luz vermelha e outro emitindo luz infravermelha. Para a taxa de pulso, apenas a luz infravermelha é necessária. Tanto a luz vermelha quanto a infravermelha são usadas para medir os níveis de oxigênio no sangue.

Quando o coração bombeia sangue, há um aumento no sangue oxigenado como resultado de ter mais sangue. Conforme o coração relaxa, o volume de sangue oxigenado também diminui. Conhecendo o tempo entre o aumento e a diminuição do sangue oxigenado, a taxa de pulso é determinada.

Acontece que o sangue oxigenado absorve mais luz infravermelha e passa mais luz vermelha, enquanto o sangue desoxigenado absorve a luz vermelha e passa mais luz infravermelha. Esta é a principal função do MAX30100: ele lê os níveis de absorção de ambas as fontes de luz e os armazena em um buffer que pode ser lido via I2C.

 

Diagrama de circuito e conexões

O diagrama de circuito e a conexão para fazer a interface do oxímetro de pulso MAX30100 com o Arduino junto com o módulo Bluetooth HC-05 e display OLED são fornecidos abaixo.

MAX30100 e display OLED funcionam no protocolo de comunicação I2C. Portanto, seu pino SDA e SCL é conectado ao pino I2C do Arduino, ou seja, A4 e A5. Da mesma forma, o módulo Bluetooth é um módulo UART e precisa ser conectado aos pinos Tx e Rx do Arduino.

O aplicativo Android

A frequência de pulso e a concentração de oxigênio no sangue que são exibidas no display OLED podem ser transferidas sem fio para o dispositivo Android usando o aplicativo Android por meio de uma conexão Bluetooth.

Este aplicativo foi desenvolvido usando o MIT App Inventor. O link para ambos os arquivos, ou seja, arquivos APK e arquivos .aia, é fornecido abaixo. Você pode editar e modificar o aplicativo Android no MIT App inventor após importar o arquivo .aia. O aplicativo pode ser instalado em qualquer dispositivo Android e pode ser conectado ao Módulo Bluetooth HC-05.

Baixe o aplicativo Android: Download

Baixar arquivo .aia: Baixar

 

Código Fonte/Programa

O código/Programa-fonte para fazer a interface do oxímetro de pulso MAX30100 e do sensor de frequência cardíaca com o Arduino é fornecido abaixo. Copie este código e carregue-o na placa Arduino.

Os arquivos da biblioteca podem ser baixados aqui:
1. Biblioteca Arduino MAX30100
2. Biblioteca OkaOLED
3. Biblioteca Adafruit GFX

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
 
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
#define REPORTING_PERIOD_MS 1000
OakOLED oled;
 
PulseOximeter pox;
 
uint32_t tsLastReport = 0;
 
const unsigned char bitmap [] PROGMEM=
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x18, 0x00, 0x0f, 0xe0, 0x7f, 0x00, 0x3f, 0xf9, 0xff, 0xc0,
0x7f, 0xf9, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xf7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0x7f, 0xdb, 0xff, 0xe0,
0x7f, 0x9b, 0xff, 0xe0, 0x00, 0x3b, 0xc0, 0x00, 0x3f, 0xf9, 0x9f, 0xc0, 0x3f, 0xfd, 0xbf, 0xc0,
0x1f, 0xfd, 0xbf, 0x80, 0x0f, 0xfd, 0x7f, 0x00, 0x07, 0xfe, 0x7e, 0x00, 0x03, 0xfe, 0xfc, 0x00,
0x01, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
 
void onBeatDetected()
{
   Serial.println("Beat!");
   oled.drawBitmap( 60, 20, bitmap, 28, 28, 1);
   oled.display();
}
 
void setup()
{
   Serial.begin(9600);
 
   oled.begin();
   oled.clearDisplay();
   oled.setTextSize(1);
   oled.setTextColor(1);
   oled.setCursor(0, 0);
 
   oled.println("Inicializando oxímetro de pulso..");
   oled.display();
   Serial.print("Inicializando oxímetro de pulso..");
 
   if (!pox.begin()) {
       Serial.println("Falhou");
      oled.clearDisplay();
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0, 0);
      oled.println("Falhou");
      oled.display();
      for(;;);
    } else {
      oled.clearDisplay();
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0, 0);
      oled.println("Sucesso");
      oled.display();
      Serial.println("Sucesso");
    }
    pox.setOnBeatDetectedCallback(onBeatDetected);
}
 
void loop()
{
   pox.update();
 
   if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
      Serial.print("Heart BPM:");
      Serial.print(pox.getHeartRate());
      Serial.print("-----");
      Serial.print("Oxygen Percent:");
      Serial.print(pox.getSpO2());
      Serial.println("\n");
      oled.clearDisplay();
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0,16);
      oled.println(pox.getHeartRate());
    
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0, 0);
      oled.println("Heart BPM");
 
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0, 30);
      oled.println("Spo2");
 
      oled.setTextSize(1);
      oled.setTextColor(1);
      oled.setCursor(0,45);
      oled.println(pox.getSpO2());
      oled.display();
      tsLastReport = millis();
   }
}

Projeto de trabalho do Arduino MAX30100

O projeto é testado na placa de ensaio. Inicialmente, quando nenhum dedo é colocado sobre MAX30100, os valores de SPO2 e BPM são zero. Quando o dedo é colocado, os valores de BPM e SPO2 começam a aparecer. Mas o valor mostrado não está correto inicialmente, depois de alguns segundos, o display OLED começa a mostrar o valor correto.

Aqui está uma demonstração de trabalho do dispositivo funcionando quando montado na placa de ensaio.

 

MAX30100 não funciona solução de problemas

Se você adquiriu o módulo MAX30100 mostrado abaixo, ele pode não funcionar, pois tem um sério problema de design. O MAX30100 IC usa 1,8 V para VDD e este módulo em particular usa dois reguladores para atingir essa tensão. Nada de errado com isso. No entanto, se você olhar de perto, os pinos SCL e SDA são puxados para cima através dos resistores de 4,7 k ohm para 1,8 V! Isso significa que não funcionará bem com microcontroladores com níveis lógicos mais altos.

1º Método

A solução é remover os resistores da placa (circulados na imagem abaixo) e conectar resistores externos de 4,7k ohms ao SDA, SCL e pino INT.

Depois de remover todo o resistor de 4,7 K, conecte o pino INT, SDA, SCL ao resistor externo de 4,7 K pull up, conforme mostrado na imagem abaixo.

2º Método

Da mesma forma, você pode usar o segundo método para corrigir esse problema se não gostar do primeiro. Basta cortar o caminho no lugar da cruz vermelha e fazer um salto como mostra a linha amarela. O jumper não precisa de fio isolado. Você pode retirar um fio estanhado do fio trançado. A placa é coberta com uma máscara protetora e não há curto-circuito para o vazamento de cobre.

Explicação feita por outro site.