- Sensor MAX30100
- Componentes Requeridos
- Interface do oxímetro MAX30100 com ESP32
- Adafruit IO com ESP32 para monitoramento de freqüência cardíaca
- Explicação do código
- Demonstração do oxímetro de pulso com base em IoT
A oximetria de pulso é um instrumento de medição médica amplamente utilizado e é um teste não invasivo e indolor que mede o nível de saturação de oxigênio em nosso sangue e pode detectar facilmente pequenas alterações no oxigênio. Na situação atual da Covid-19, tornou-se importante rastrear o nível de oxigênio de vários pacientes ao mesmo tempo remotamente, sem entrar em contato com o paciente.
Portanto, neste projeto, construímos um oxímetro de pulso usando oxímetro de pulso MAX30100 e ESP32 que rastreará o nível de oxigênio no sangue e enviará os dados via internet conectando-se a uma rede wi-fi. Dessa forma, podemos monitorar vários pacientes remotamente, mantendo distância social com os pacientes. Os dados obtidos serão apresentados na forma de gráfico que facilita o rastreamento e a análise do estado do paciente. Anteriormente, também construímos outros monitores de frequência cardíaca usando sensores de pulso. E se você estiver interessado em outros projetos relacionados à Covid-19, pode verificar o termômetro de corpo humano, termômetro infravermelho inteligente para monitoramento de febre e scanner de temperatura de montagem na parede que construímos anteriormente.
Além do aplicativo Covid-19, este projeto também pode ser amplamente utilizado na doença pulmonar obstrutiva crônica (DPOC), asma, pneumonia, câncer de pulmão, anemia, ataque cardíaco ou insuficiência cardíaca, ou em defeitos cardíacos congênitos.
Observe que o sensor usado neste projeto não é classificado como médico e o projeto não foi testado para aplicações à prova de falhas. Sempre use um oxímetro de pulso com classificação médica para determinar o pulso e o nível de oxigênio do paciente e discuta isso com um médico. O projeto discutido aqui é apenas para fins educacionais.
Sensor MAX30100
O sensor MAX30100 é um módulo integrado de oximetria de pulso e monitor de freqüência cardíaca. Ele se comunica com a linha de dados I2C e fornece as informações de SpO2 e Pulso para a unidade microcontroladora do host. Ele usa fotodetectores, elementos ópticos onde o LED IV vermelho e verde modula os pulsos do LED. A corrente do LED é configurável de 0 a 50mA. A imagem abaixo mostra o sensor MAX30100.
O módulo do sensor acima funciona com 1,8 V até a faixa de 5,5 V. Os resistores pull-up para os pinos I2C estão incluídos no módulo.
Componentes Requeridos
- Uma conexão WiFi
- ESP32
- Sensor MAX30100
- ID de usuário Adafruit IO e um painel personalizado criado (o tornará mais avançado)
- Unidade de fonte de alimentação adequada de 5V com corrente nominal de pelo menos 1A
- Cabo USB Micro USB para USBA
- Um PC com Arduino IDE com ambiente de programação ESP32.
Interface do oxímetro MAX30100 com ESP32
O diagrama de circuito completo para MAX30100 com ESP32 é fornecido abaixo.
Este é um esquema muito simples. Os pinos 21 e 22 do ESP32 devkit C são conectados ao sensor do oxímetro de pulso MAX30100 com os pinos SDA e SCL. O oxímetro também é alimentado pelo pino de 5 V na placa de desenvolvimento ESP32. Fiz minha conexão usando uma placa de ensaio e conectando fios e minha configuração de teste se parece com isto-
Adafruit IO com ESP32 para monitoramento de freqüência cardíaca
Anteriormente, construímos muitos projetos Adafruit IO para diferentes aplicações IoT. Adafruit IO é uma excelente plataforma onde um painel personalizado pode ser criado. Para criar o painel personalizado para o sensor de oxímetro de pulso baseado em IoT, use as etapas abaixo
Passo 1: Primeiro inscreva-se no adafruit IO depois de fornecer o nome do Fist, o sobrenome, o endereço de e-mail, o nome de usuário e a senha.
Etapa 2: a janela do painel em branco será aberta após a conclusão do processo de login. Neste segmento, precisaremos criar um painel para mostrar os dados de várias maneiras. Assim, é hora de criar o novo painel e fornecer o nome do painel e a descrição.
Passo 3: Após preencher o formulário acima, é hora de criar o gráfico e a seção de controle do sensor.
Selecione o bloco de comutação. Será necessário para ligar ou desligar o sensor do oxímetro de pulso.
Etapa 4: Anote o nome do bloco. Como podemos ver na imagem acima, a função de alternância fornecerá dois estados, ON e OFF. No mesmo processo, selecione o bloco do gráfico.
Esta seção de gráfico precisa ser selecionada duas vezes, pois dois gráficos serão exibidos, Heart bit e SpO2. Ambas as seções são criadas. Como podemos ver, selecionamos todas as funcionalidades de entrada e saída.
Etapa 5: A próxima e última etapa é ter a chave adafruit. Como podemos ver, obtemos a chave adafruit e ela precisa ser adicionada ao código.
O Adafruit IO está agora configurado. É hora de preparar o hardware e criar o firmware para este projeto.
Explicação do código
Este código usa muitas bibliotecas e todas são importantes. As bibliotecas são a biblioteca de sensor de oxímetro de pulso MAX30100, Wire.h para I2C, WiFi.h para o suporte relacionado a WiFi em ESP32, Adafruit MQTT e biblioteca de cliente MQTT . O programa completo pode ser encontrado no final desta página.
Essas bibliotecas mencionadas acima estão incluídas no início do código.
#incluir
As próximas duas definições são WLAN SSID e WLAN Password. Isso tem que ser exato e será usado pelo ESP32 para se conectar à rede sem fio.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Em seguida, definimos as definições de Adafruit io.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
A taxa de atualização atualizará os dados a cada 5 segundos, o servidor será io.adafruit.com com uma porta de servidor de 1883. O nome de usuário e a senha serão o nome de usuário e a senha gerados no painel do adafruit IO. Será diferente para todos e precisa ser gerado conforme descrito na seção de configuração do adafruit.
As portas I2C são definidas posteriormente, conforme mostrado no esquema.
#define I2C_SDA 21 #define I2C_SCL 22
Em seguida, três variáveis são usadas para armazenar o último relatório e os valores bpm e spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
O MQTT funciona com um modelo pub-sub (publicar e assinar). Neste modelo de trabalho, o dispositivo que envia os dados para o servidor Adafruit permanece em modo de publicação, onde o servidor Adafruit IO assina os mesmos pontos de dados. Nesse caso, sempre que o dispositivo publica novos dados, o servidor, ao ser inscrito nos mesmos, recebe os dados e fornece as ações necessárias.
A mesma coisa acontece quando o servidor publica os dados e o dispositivo os assina. Em nossa aplicação, o dispositivo envia os dados de SPO2 e BPM para o servidor, para que publique os mesmos e receba o estado ON-OFF do servidor, assinando assim este. Isso é configurado no trecho de código descrito abaixo-
Cliente WiFiClient; Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Observe que os caminhos do MQTT para AIO seguem a forma:
Na função de configuração , estamos iniciando o I2C, conectando o WiFi com o SSID e a senha predefinidos e iniciando o processo de assinatura MQTT para o estado de alternância (O botão de alternância criado no painel de controle do Adafruit IO).
configuração vazia () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi conectado"); Serial.println ("endereço IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicializando o oxímetro de pulso.."); // Inicialize a instância do PulseOximeter // Falhas geralmente são devidas a uma fiação I2C inadequada, fonte de alimentação ausente // ou chip de destino errado if (! Pox.begin ()) {Serial.println ("FAILED"); para(;;); } else {Serial.println ("SUCCESS"); } // A corrente padrão para o LED IV é 50mA e pode ser alterada // removendo o comentário da linha a seguir. Verifique MAX30100_Registers.h para todas as // opções disponíveis. varíola.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registra um retorno de chamada para a detecção de batida pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Depois de tudo isso, o max30100 é iniciado com uma configuração de corrente de led. Diferentes configurações atuais também estão disponíveis nos arquivos de cabeçalho do MAX30100 para diferentes configurações. Uma função de retorno de chamada de detecção de pulsação também é iniciada. Após todas essas configurações, o sensor do oxímetro é interrompido.
Na função de loop , a conexão MQTT é iniciada e o modelo de assinatura é verificado a cada 5000 milissegundos. Nesta situação, se a chave for ligada, ele passa a ler o sensor do oxímetro e publicar os dados de Heartbeat e o valor de SPO2. Se a chave for desligada, todas as tarefas relacionadas ao sensor do oxímetro de pulso serão suspensas.
loop vazio () {MQTT_connect (); Assinatura Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Iniciando POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Função que implementa a tarefa. * / "pox_read", / * Nome do texto para a tarefa. * / 1024 * 3, / * Tamanho da pilha em palavras, não bytes. * / NULL, / * Parâmetro passado para a tarefa. * / 2, / * Prioridade em que a tarefa é criada. * / & poxReadTaskHld); / * Usado para passar o identificador da tarefa criada. * /} atraso (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Função que implementa a tarefa. * / "mqttPub", / * Nome do texto para a tarefa. * / 1024 * 3, / * Tamanho da pilha em palavras, não em bytes. * / NULL, / * Parâmetro passado para a tarefa. * / 2, / * Prioridade na qual a tarefa é criada. * / & mqttPubTaskHld); / * Usado para passar o identificador da tarefa criada. * /}} else {Serial.print (("Stoping POX…")); // Detele a tarefa de leitura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Excluir a tarefa MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Usado para passar o identificador da tarefa criada. * /}} else {Serial.print (("Stoping POX…")); // Detele a tarefa de leitura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Excluir a tarefa MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Usado para passar o identificador da tarefa criada. * /}} else {Serial.print (("Stoping POX…")); // Detele a tarefa de leitura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Excluir a tarefa MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstração do oxímetro de pulso com base em IoT
O circuito está conectado corretamente em uma placa de ensaio e o programa fornecido a seguir é carregado no ESP32. Certifique-se de alterar as credenciais de Wi-Fi e Adafruit de acordo com seu código para que funcione para você.
Após a conexão com o servidor WiFi e Adafruit IO, começou a funcionar como esperado.
Como podemos ver, o nível de SPO2 está mostrando 96% e a pulsação está mostrando 78 a 81 bits por minuto. Também fornece a hora em que os dados são capturados.
Como podemos ver na imagem acima, a chave está desligada e os dados são 0. O vídeo de trabalho completo do projeto também pode ser encontrado no final desta página.
Espero que você tenha gostado do artigo e aprendido algo útil. Se tiver alguma dúvida, deixe-os na seção de comentários abaixo ou poste-os em nossos fóruns.