Oxímetro de pulso MAX30100 com ESP8266 no aplicativo Blynk IoT

Tempo de leitura: 8 minutes

Neste projeto, aprenderemos como fazer a interface do oxímetro de pulso MAX30100 com o NodeMCU ESP8266. Vamos monitorar o oxigênio no sangue e a frequência cardíaca online no aplicativo Blynk.

Neste projeto DIY IoT, tentaremos fazer um dispositivo de monitoramento de saúde inteligente que pode medir SpO2 (porcentagem de oxigênio no sangue) e frequência cardíaca em BPM (batimento por minuto). 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. A melhor parte deste projeto é que você pode conectar este dispositivo a um aplicativo Android Blynk que gravará e atualizará regularmente os dados de SPO2 e BPM na internet. Mesmo qualquer pessoa pode monitorar os dados de qualquer parte do mundo à medida que os dados são carregados no servidor.

Como há disponibilidade de dados online, este projeto pode ser utilizado para monitorar a saúde de um paciente online. O oxímetro de pulso disponível no mercado é muito caro, mas com este módulo de oxímetro de pulso simples e de baixo custo, podemos fazer nosso próprio dispositivo. Então, vamos aprender como fazer o oxímetro de pulso MAX30100 com ESP8266.

 

Você pode passar pela versão anterior deste projeto:
1. Interface do sensor de oxímetro de pulso MAX30100 com Arduino
2. Monitor de oxigênio no sangue e frequência cardíaca com MAX30100 e Arduino

 

Lista de Materiais

A seguir estão os componentes necessários para fazer este projeto. Todos os componentes podem ser adquiridos no MercadoLivre ou na  Amazon. O link dos componentes adquiridos é fornecido abaixo.

Nome dos ComponentesDescriçãoQuantidade
1NodeMCUESP8266 12E Board1https://amzn.to/2Khiv4a
2Pulse Oximeter SensorMAX30100 Module1No ML (Link)
4OLED Display0.96″ I2C OLED Display1https://amzn.to/3oJQVf4
5Connecting WiresJumper Wires10https://amzn.to/3i9YI37
6ProtoBoard1https://amzn.to/3snWphs

 

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.

 

Interface do oxímetro de pulso MAX30100 com NodeMCU ESP8266

Agora faremos a interface do oxímetro de pulso MAX30100 com o display OLED NodeMCU ESP8266 e I2C de 0,96″.  O diagrama do circuito e a conexão são fornecidos abaixo. Você pode montar o dispositivo exatamente como mostrado na figura abaixo.

Tanto o MAX30100 quanto o display OLED possuem pinos I2C comuns. Portanto, conecte seus pinos SDA aos pinos D2 e SCL a D1 da placa NodeMCU ESP8266. A fonte de alimentação exigida pelo display OLED e NodeMCU é de 3,3V. Portanto, conecte seu terminal VCC a 3,3 V de NodeMCU.

 

Projeto de PCB para oxímetro de pulso baseado em IoT

O PCB para oxímetro de pulso baseado em IoT foi projetado na ferramenta de criação de PCB online EasyEDA. Abaixo estão as vistas frontal e traseira da PCB.

 

Configurando o aplicativo Blynk Android

Blynk é um aplicativo que roda em dispositivos Android e IOS para controlar qualquer aplicativo baseado em IoT usando smartphones. Ele permite que você crie sua interface gráfica de usuário para o aplicativo IoT. Aqui, configuraremos o aplicativo Blynk para monitorar BPM e SPO2 por Wi-Fi usando NodeMCU ESP8266.

Portanto, baixe e instale o aplicativo Blynk da Google Play Store. Os usuários do IOS podem fazer o download na App Store. Assim que a instalação for concluída, abra o aplicativo e inscreva-se usando seu ID de e-mail e senha.

Agora clique em “Novo Projeto”. No pop-up, defina os parâmetros como Nome do projeto, Placa e tipo de conexão conforme mostrado na foto acima. Para este projeto MAX30100 ESP8266, selecione o dispositivo como NodeMCU e o tipo de conexão como Wi-Fi. Em seguida, clique em Criar.

Agora clique no sinal “+” para adicionar os widgets. Precisamos ler o valor de BPM e SpO2. Portanto, selecione um par de widgets chamado Value Display & Gauge.

Após arrastar os widgets, defina seus parâmetros conforme mostrado na imagem acima. Clique em Value Display e defina o pino para “V7” e “V8“. Da mesma forma, nas configurações do medidor, defina o pino de saída para “V7” e “V8”.

Após a criação do projeto com sucesso, volte às configurações e clique em Enviar e-mail. Você receberá um Authenticate ID no correio registrado. Salve a ID de autenticação para referência futura.

 

Código Fonte / Programa

Assim que a configuração do hardware estiver concluída, agora precisamos fazer o upload do código para a placa NodeMCU ESP8266-12E. Mas antes disso você precisa instalar algumas bibliotecas.

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

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define BLYNK_PRINT Serial
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
 
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
 
#define REPORTING_PERIOD_MS 1000
OakOLED oled;
 
char auth[] = "N-81lOStH83VwUeNuKHOzpLVzqjFXhHO";           // Você deve obter o Auth Token no aplicativo Blynk.
char ssid[] = "BYNARK";                                     // Suas credenciais de WiFi.
char pass[] = "bynark@123";
 
// Conexões: SCL PIN - D1, SDA PIN - D2, INT PIN - D0
PulseOximeter pox;
 
float BPM, SpO2;
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("Batida detectada!");
    oled.drawBitmap( 60, 20, bitmap, 28, 28, 1);
    oled.display();
}
 
void setup()
{
    Serial.begin(115200);
    oled.begin();
    oled.clearDisplay();
    oled.setTextSize(1);
    oled.setTextColor(1);
    oled.setCursor(0, 0);
 
    oled.println("Inicializando oxímetro de pulso..");
    oled.display();
    
    pinMode(16, OUTPUT);
    Blynk.begin(auth, ssid, pass);
 
    Serial.print("Inicializando oxímetro de pulso..");
 
    if (!pox.begin())
    {
         Serial.println("FAILED");
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("FAILED");
         oled.display();
         for(;;);
    }
    else
    {
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("SUCCESS");
         oled.display();
         Serial.println("SUCCESS");
         pox.setOnBeatDetectedCallback(onBeatDetected);
    }
 
     // A corrente padrão para o LED IV é 50mA e pode ser alterada removendo o comentário da linha a seguir.
     //pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
 
}
 
void loop()
{
    pox.update();
    Blynk.run();
 
    BPM = pox.getHeartRate();
    SpO2 = pox.getSpO2();
    if (millis() - tsLastReport > REPORTING_PERIOD_MS)
    {
        Serial.print("Frequência cardíaca:");
        Serial.print(BPM);
        Serial.print(" bpm / SpO2:");
        Serial.print(SpO2);
        Serial.println(" %");
 
        Blynk.virtualWrite(V7, BPM);
        Blynk.virtualWrite(V8, SpO2);
        
        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();
    }
}

 

Observação de saída e valor de leitura em Blynk de MAX30100 ESP8266

Assim que o código for carregado, você pode abrir o monitor serial e ver o seguinte, pois os valores de BPM e SpO2 são exibidos após o NodeMCU se conectar ao wi-fi.

Da mesma forma, você pode verificar o display OLED, os mesmos valores são exibidos na tela.

No aplicativo Android, o valor de BPM e SpO2 é carregado após um segundo e você pode ver uma mudança no medidor e nos parâmetros de exibição.

 

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.