Oxímetro de pulso MAX30100 com ESP8266 no aplicativo Blynk IoT
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
Conteudo
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 Componentes | Descrição | Quantidade | ||
---|---|---|---|---|
1 | NodeMCU | ESP8266 12E Board | 1 | https://amzn.to/2Khiv4a |
2 | Pulse Oximeter Sensor | MAX30100 Module | 1 | No ML (Link) |
4 | OLED Display | 0.96″ I2C OLED Display | 1 | https://amzn.to/3oJQVf4 |
5 | Connecting Wires | Jumper Wires | 10 | https://amzn.to/3i9YI37 |
6 | ProtoBoard | – | 1 | https://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.