- Sensor MAX30100
- Componentes requeridos
- Interfaz del oxímetro MAX30100 con ESP32
- Adafruit IO con ESP32 para monitorización de frecuencia cardíaca
- Explicación del código
- Demostración de pulsioxímetro basada en IoT
La oximetría de pulso es un instrumento de medición médico ampliamente utilizado y es una prueba no invasiva e indolora que mide el nivel de saturación de oxígeno en nuestra sangre y puede detectar fácilmente pequeños cambios en el oxígeno. En la situación actual de Covid-19, se ha vuelto importante rastrear el nivel de oxígeno de varios pacientes al mismo tiempo de forma remota sin entrar en contacto con el paciente.
Entonces, en este proyecto, construimos un oxímetro de pulso usando el oxímetro de pulso MAX30100 y ESP32 que rastreará el nivel de oxígeno en sangre y enviará los datos a través de Internet conectándose a una red Wi-Fi. De esta manera, podemos monitorear a varios pacientes de forma remota manteniendo una distancia social con los pacientes. Los datos obtenidos se mostrarán como un gráfico que facilita el seguimiento y análisis de la condición del paciente. Anteriormente, también hemos construido otros monitores de frecuencia cardíaca que utilizan sensores de pulso. Y si está interesado en otros proyectos relacionados con Covid-19, puede consultar el termómetro de cuerpo humano, el termómetro inteligente de infrarrojos para controlar la fiebre y el escáner de temperatura de montaje en pared que construimos anteriormente.
Aparte de la aplicación Covid-19, este proyecto también puede ser ampliamente utilizado en enfermedad pulmonar obstructiva crónica (EPOC), asma, neumonía, cáncer de pulmón, anemia, ataque cardíaco o insuficiencia cardíaca, o en defectos cardíacos congénitos.
Tenga en cuenta que el sensor utilizado en este proyecto no está calificado médicamente y el proyecto no se prueba para aplicaciones a prueba de fallas. Utilice siempre un oxímetro de pulso con calificación médica para determinar el pulso y el nivel de oxígeno del paciente y hable con un médico. El proyecto discutido aquí es solo para fines educativos.
Sensor MAX30100
El sensor MAX30100 es un módulo integrado de pulsioximetría y monitor de frecuencia cardíaca. Se comunica con la línea de datos I2C y proporciona la información de SpO2 y Pulse a la unidad del microcontrolador principal. Utiliza fotodetectores, elementos ópticos donde el LED IR rojo, verde modula los pulsos del LED. La corriente del LED se puede configurar de 0 a 50 mA. La siguiente imagen muestra el sensor MAX30100.
El módulo de sensor anterior funciona con 1.8V en el rango de 5.5V. Las resistencias pull-up para los pines I2C están incluidas en el módulo.
Componentes requeridos
- Una conexión wifi
- ESP32
- Sensor MAX30100
- Identificación de usuario de Adafruit IO y un panel de control personalizado (lo hará más lejos)
- Unidad de fuente de alimentación adecuada de 5 V con la corriente nominal de al menos 1 A
- Cable USB Micro USB a USBA
- Una PC con Arduino IDE con entorno de programación ESP32.
Interfaz del oxímetro MAX30100 con ESP32
El diagrama de circuito completo para MAX30100 con ESP32 se muestra a continuación.
Este es un esquema muy simple. El pin 21 y 22 del ESP32 devkit C está conectado con el sensor de oxímetro de pulso MAX30100 con los pines SDA y SCL. El oxímetro también es alimentado por el pin de 5V en la placa de desarrollo ESP32. Hice mi conexión usando una placa de pruebas y conectando cables y mi configuración de prueba se ve así:
Adafruit IO con ESP32 para monitorización de frecuencia cardíaca
Anteriormente, hemos construido muchos proyectos de Adafruit IO para diferentes aplicaciones de IoT. Adafruit IO es una excelente plataforma donde se puede crear un tablero personalizado. Para crear el tablero personalizado para el sensor de pulsioxímetro basado en IoT, siga los pasos a continuación:
Paso 1: Primero regístrese en adafruit IO después de dar el nombre de puño, apellido, dirección de correo electrónico, nombre de usuario y contraseña.
Paso 2: La ventana del panel en blanco se abrirá después de que finalice el proceso de inicio de sesión. En este segmento, necesitaremos crear un tablero para mostrar los datos de varias formas. Por lo tanto, es hora de crear el nuevo panel y proporcionar el nombre del panel y la descripción.
Paso 3: Después de completar el formulario anterior, es el momento de crear la sección de control y gráfico para el sensor.
Seleccione el bloque de interruptores. Será necesario para encender o apagar el sensor del oxímetro de pulso.
Paso 4: escriba el nombre del bloque. Como podemos ver en la imagen de arriba, la función de alternancia proporcionará dos estados, ON y OFF. En el mismo proceso, seleccione el bloque de gráfico.
Esta sección de gráficos debe seleccionarse dos veces, ya que se mostrarán dos gráficos, Bit de corazón y SpO2. Se crean ambas secciones. Como podemos ver, hemos seleccionado todas las funciones de entrada y salida.
Paso 5: El siguiente y último paso es tener la clave adafruit. Como podemos ver, obtenemos la clave adafruit y esto debe agregarse en el código.
Adafruit IO ya está configurado. Es hora de preparar el hardware y crear el firmware para este proyecto.
Explicación del código
Este código usa muchas bibliotecas y todas son importantes. Las bibliotecas son la biblioteca de sensores de oxímetro de pulso MAX30100, Wire.h para I2C, WiFi.h para el soporte relacionado con WiFi en ESP32, Adafruit MQTT y la biblioteca de cliente MQTT . El programa completo se puede encontrar al final de esta página.
Las bibliotecas mencionadas anteriormente se incluyen al principio del código.
#incluir
Las siguientes dos definiciones son WLAN SSID y WLAN Password. Esto tiene que ser exacto y será utilizado por el ESP32 para conectarse con la red WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
A continuación, definimos las definiciones 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"
La tasa de actualización actualizará los datos cada 5 segundos, el servidor será io.adafruit.com con un puerto de servidor de 1883. El nombre de usuario y la contraseña serán el nombre de usuario y la contraseña generados desde el panel de adafruit IO. Será diferente para todos y deberá generarse como se describe en la sección de configuración de adafruit.
Los puertos I2C se definen posteriormente como se muestra en el esquema.
#define I2C_SDA 21 #define I2C_SCL 22
A continuación, se utilizan tres variables para almacenar el último informe y el valor de bpm y spo2.
uint32_t tsLastReport = 0; flotar bpm_dt = 0; flotar spo2_dt = 0;
El MQTT funciona con un modelo pub-sub (publicar y suscribirse). En este modelo de trabajo, el dispositivo que envía los datos al servidor Adafruit permanece en modo de publicación donde el servidor Adafruit IO se suscribe a los mismos puntos de datos. En tal efecto, siempre que el dispositivo publica nuevos datos, el servidor, al estar suscrito al mismo, recibe los datos y realiza las acciones necesarias.
Lo mismo sucede cuando el servidor publica los datos y el dispositivo se suscribe. En nuestra aplicación, el dispositivo envía los datos de SPO2 y BPM al servidor, por lo que publica los mismos y recibe el estado ON-OFF del servidor, suscribiéndose así a este. Esto está configurado en el fragmento de código que se describe a continuación:
Cliente WiFiClient; Adafruit_MQTT_Client mqtt (& cliente, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Observe que las rutas MQTT para AIO siguen el formulario:
En la función de configuración , estamos iniciando el I2C, conectando el WiFi con el SSID y la contraseña predefinidos, e iniciando el proceso de suscripción MQTT para el estado de cambio (el botón de cambio creado en el panel de Adafruit IO).
configuración vacía () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {retraso (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi conectado"); Serial.println ("dirección IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicializando pulsioxímetro…"); // Inicializar la instancia de PulseOximeter // Las fallas generalmente se deben a un cableado I2C incorrecto, falta de suministro de energía // o chip objetivo incorrecto if (! Pox.begin ()) {Serial.println ("FAILED"); para(;;); } else {Serial.println ("ÉXITO"); } // La corriente predeterminada para el LED IR es 50mA y se puede cambiar // descomentando la siguiente línea. Consulte MAX30100_Registers.h para ver todas las // opciones disponibles. viruela.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registrar una devolución de llamada para la detección de latidos pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Después de todo esto, el max30100 se inicia con un ajuste de corriente LED. También hay disponibles diferentes configuraciones actuales en los archivos de encabezado MAX30100 para diferentes configuraciones. También se inicia una función de devolución de llamada de detección de latidos. Después de todas estas configuraciones, el sensor de oxímetro se detiene.
En la función de bucle , se inicia la conexión MQTT y se comprueba el modelo de suscripción cada 5000 milisegundos. En esta situación, si el interruptor está encendido, comienza a leer el sensor del oxímetro y publica los datos del Heartbeat y el valor de SPO2. Si el interruptor está apagado, suspende todas las tareas relacionadas con el sensor del oxímetro de pulso.
bucle vacío () {MQTT_connect (); Suscripción Adafruit_MQTT_Subscribe *; while ((suscripción = mqtt.readSubscription (5000))) {if (suscripción == & 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, / * Función que implementa la tarea. * / "pox_read", / * Nombre del texto de la tarea. * / 1024 * 3, / * Tamaño de la pila en palabras, no bytes. * / NULL, / * Parámetro pasado a la tarea. * / 2, / * Prioridad en la que se crea la tarea. * / & poxReadTaskHld); / * Se usa para pasar el identificador de la tarea creada. * /} retraso (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Función que implementa la tarea. * / "mqttPub", / * Nombre de texto para la tarea. * / 1024 * 3, / * Tamaño de pila en palabras, no en bytes. * / NULL, / * Parámetro pasado a la tarea. * / 2, / * Prioridad en la que se crea la tarea. * / & mqttPubTaskHld); / * Se usa para pasar el identificador de la tarea creada. * /}} else {Serial.print (("Deteniendo POX…")); // Detele la tarea de lectura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina la Tarea Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Se usa para pasar el identificador de la tarea creada. * /}} else {Serial.print (("Deteniendo POX…")); // Detele la tarea de lectura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina la Tarea Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Se usa para pasar el identificador de la tarea creada. * /}} else {Serial.print (("Deteniendo POX…")); // Detele la tarea de lectura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Elimina la Tarea Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demostración de pulsioxímetro basada en IoT
El circuito está conectado correctamente en una placa de pruebas y el programa que se muestra a continuación se carga en ESP32. Asegúrese de cambiar las credenciales de Wi-Fi y Adafruit en consecuencia en su código para que funcione para usted.
Después de la conexión con el servidor WiFi y Adafruit IO, comenzó a funcionar como se esperaba.
Como podemos ver, el nivel de SPO2 muestra un 96% y el latido muestra de 78 a 81 bits por minuto. También proporciona la hora en que se capturan los datos.
Como podemos ver en la imagen de arriba, el interruptor está apagado y el dato es 0. El video completo de trabajo del proyecto también se puede encontrar en la parte inferior de esta página.
Espero que haya disfrutado del artículo y haya aprendido algo útil. Si tiene alguna pregunta, déjela en la sección de comentarios a continuación o publíquela en nuestros foros.