Como utilizar o Sensor Frequência Cardíaca Max30100 Oxímetro com ESP8266
Em post anterior apresentamos como utilizar em conjunto com o Arduino para medir a frequência cardíaca (batimentos por minuto – BPM) e o nível de oxigênio no sangue (SpO2) de uma pessoa com o sensor de frequência cardíaca e oxímetro MAX30100.
Neste tutorial, recriaremos o mesmo projeto utilizando a placa NODEMCU ESP8266 Amica (Figura 1).
MATERIAIS NECESSÁRIOS
- 1 x Placa NODEMCU ESP8266 Amica;
- 1x Sensor de frequência cardíaca e oxímetro MAX30100;
- 1 x Cabo micro USB;
- Jumpers fêmea-fêmea.
ESQUEMÁTICA DE LIGAÇÃO
Monte o circuito da Figura 2 utilizando o sensor de frequência cardíaca e oxímetro MAX30100, os resistores e os jumpers.
Ao montar o circuito observe os seguintes pontos:
- O pino VIN do sensor deve ser conectado à entrada 3,3V da NODEMCU ESP8266;
- O pino GND do sensor deve ser conectado ao GND da NODEMCU ESP8266;
- O pino SCL deve ser conectado à porta digital D1 (SCL da NODEMCU ESP8266);
- O pino SDA deve ser conectado à porta digital D2 (SDA da NODEMCU ESP8266).
ELABORANDO O CÓDIGO
Após a montagem do circuito, vamos programação do Sketch no Arduino IDE. Nesse projeto, vamos utilizar o sensor de frequência cardíaca e oxímetro MAX30100 em conjunto com a placa NODEMCU ESP8266 para medir a frequência cardíaca (batimentos por minuto – BPM) e o nível de oxigênio no sangue (SpO2) de uma pessoa.
Caso seja a primeira vez que você esteja programando a NODEMCU ESP8266 pelo Arduino IDE acesse o tutorial de instalação e configuração da placa clicando aqui!
Neste tutorial, vamos fazer uso da biblioteca “MAX30100_PulseOximeter.h”. Para instalá-la, acesse o gerenciador de bibliotecas (Ctrl+Shift+I) e busque por MAX30100lib, conforme a Figura 3.
Vamos entender a lógica de programação desse projeto a partir dos seguintes passos:
1. Incluir as bibliotecas
Iniciamos o código incluindo as bibliotecas wire.h e MAX30100_PulseOximeter.h.
2. Criar as variáveis
Usamos a variável REPORTING_PERIOD_MS para armazenar o intervalo de tempo entre as medições (1000 milissegundos ou 1 segundo).
Em seguida, criamos a variável tcLastReport para armazenar a hora em que ocorreu o último batimento cardíaco em milissegundos.
3. Declarar o objeto pox
O objeto pox é do tipo PulseOximeter que é nativo da biblioteca MAX30100_PulseOximeter.h.
4. Criar função de retorno onBeatDetected()
A função onBeatDetected() exibirá a mensagem “Batimento detectado” no monitor serial quando ocorrer um batimento cardíaco.
5. Inicialização da comunicação serial e do sensor
Na função setup() inicializamos a comunicação serial com taxa de transmissão de 9600. Em seguida, inicializamos o sensor e verificamos se houve sucesso ou não na comunicação.
6. Configurar o LED infravermelho e registrar a função de retorno
Ainda na função setup() configuramos em 7,6 mA a corrente do LED infravermelho por meio da instrução pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);. Vale a pena lembrar que quanto maior a corrente, mais brilhante será o LED e mais profundamente ele atinge a pele.
Logo após, registramos a função de retorno pox.setOnBeatDetectedCallback(onBeatDetected);.
7. Realizar a leitura de batimento e Saturação do sangue.
Para atualizar a leitura do sensor usamos o comando “pox.update()”.
Os comandos “pox.getHeartRate()” e “pox.getSpO2()” serão responsáveis por fazer a leitura do batimento e saturação do sangue, respectivamente.
Ao final, o Sketch desse projeto ficará da seguinte maneira:
#include <Wire.h> // Declaração das bibliotecas #include "MAX30100_PulseOximeter.h" #define REPORTING_PERIOD_MS 1000 // Intervalo entre a medição de cada amostra PulseOximeter pox; //Declaração objeto pox. uint32_t tsLastReport = 0; // Tempo da ultima amostra dectada void onBeatDetected() { Serial.println("Batimento detectado"); } void setup() { Serial.begin(9600); Serial.print("Inciando funcionamento do sensor "); if (!pox.begin()) //Incializa o funcionamento do sensor { Serial.println("Falhou ! "); // se a comunicação não for realizada da maneira errada será mostrado no monitor serial que a incialização falhou for (;;); } else { Serial.println("Sucesso ! "); // se a comunicação for realizada da maneira correta será mostrado no monitor serial que a incialização foi um sucesso } pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA); // Define que o sensor use uma corrente de 7,8 mA para o led pox.setOnBeatDetectedCallback(onBeatDetected); // Sinalizará no monitor serial todas as vezes em que um batimento for detectado } void loop() { pox.update(); // inicia a leitura do sensor if (millis() - tsLastReport > REPORTING_PERIOD_MS) { Serial.print("Taxa de Batimento : "); Serial.print(pox.getHeartRate()); // Faz a leitura de batimento Serial.print("bpm / Saturacao sangue(SP02) : "); Serial.print(pox.getSpO2()); // faz a leitura da saturação do sangue Serial.println("%"); tsLastReport = millis(); } }
Obrigado a todos e em caso de dúvidas deixe seu comentário abaixo!
Att. Jonas Souza
Graduando em Engenharia Elétrica.