- Sensor MAX30100
- Components necessaris
- Interfície d'oxímetre MAX30100 amb ESP32
- Adafruit IO amb ESP32 per al seguiment de la freqüència cardíaca
- Explicació del codi
- Demostració d'oxímetre de pols basat en IoT
La oximetria de pols és un instrument de mesura mèdic àmpliament utilitzat i és una prova no invasiva i indolora que mesura el nivell de saturació d’oxigen a la sang que pot detectar fàcilment petits canvis d’oxigen. En la situació actual de Covid-19, ha esdevingut important fer un seguiment remot del nivell d’oxigen de diversos pacients sense entrar en contacte amb el pacient.
Per tant, en aquest projecte, construïm un oxímetre de pols usant oxímetre de pols MAX30100 i ESP32 que farà un seguiment del nivell d’oxigen sanguini i enviarà les dades per internet mitjançant la connexió a una xarxa Wi-Fi. D’aquesta manera, podem controlar de forma remota diversos pacients mantenint la distància social amb els pacients. Les dades obtingudes es mostraran com un gràfic que facilita el seguiment i l'anàlisi de l'estat del pacient. Anteriorment, també hem construït altres monitors de ritme cardíac mitjançant sensors de pols. I si esteu interessats en altres projectes relacionats amb Covid-19, podeu consultar el termòmetre del cos humà, el termòmetre IR intel·ligent per al control de la febre i l’escàner de temperatura de muntatge a la paret que vam construir anteriorment.
A part de l'aplicació Covid-19, aquest projecte també es pot utilitzar àmpliament en malalties pulmonars obstructives cròniques (MPOC), asma, pneumònia, càncer de pulmó, anèmia, atac de cor o insuficiència cardíaca o en defectes cardíacs congènits.
Tingueu en compte que el sensor utilitzat en aquest projecte no està classificat mèdicament i que el projecte no està provat per a aplicacions a prova de fallades. Utilitzeu sempre un oxímetre de pols amb valoració mèdica per determinar el nivell de pols i oxigen del pacient i parleu-ne amb un metge. El projecte que es tracta aquí només té finalitats educatives.
Sensor MAX30100
El sensor MAX30100 és un mòdul integrat d’ oximetria de pols i monitor de freqüència cardíaca. Es comunica amb la línia de dades I2C i proporciona la informació SpO2 i Pulse a la unitat de microcontrolador amfitrió. Utilitza fotodetectors, elements òptics on el LED IR vermell i verd modula els polsos LED. El corrent LED es pot configurar de 0 a 50 mA. La imatge següent mostra el sensor MAX30100.

El mòdul de sensor anterior funciona amb un marge d’1,8 V a 5,5 V. Les resistències de tracció dels pins I2C s’inclouen al mòdul.
Components necessaris
- Una connexió WiFi
- ESP32
- Sensor MAX30100
- Identificador d'usuari d'Adafruit IO i un tauler de control personalitzat (ho farà més endavant)
- Unitat d'alimentació adequada de 5V amb una intensitat nominal d'almenys 1A
- Cable USB Micro USB a USBA
- Un PC amb Arduino IDE amb entorn de programació ESP32.
Interfície d'oxímetre MAX30100 amb ESP32
A continuació es mostra el diagrama complet del circuit per a MAX30100 amb ESP32.

Es tracta d’un esquema molt senzill. Els pins 21 i 22 del devkit C ESP32 estan connectats amb el sensor d’oxímetre de pols MAX30100 amb els pins SDA i SCL. L’oxímetre també s’alimenta del pin de 5 V a la placa de desenvolupament ESP32. Vaig establir la meva connexió mitjançant una placa de connexió i cables de connexió i la meva configuració de proves té aquest aspecte:

Adafruit IO amb ESP32 per al seguiment de la freqüència cardíaca
Anteriorment hem creat molts projectes Adafruit IO per a diferents aplicacions IoT. Adafruit IO és una plataforma excel·lent on es pot crear un tauler personalitzat. Per crear el tauler personalitzat per al sensor de pols oxímetre basat en IoT, seguiu els passos següents:
Pas 1: primer inscriviu-vos a l’Adafruit IO després de donar el nom Fist, el cognom, l’adreça electrònica, el nom d’usuari i la contrasenya.

Pas 2: la finestra en blanc del tauler s'obrirà un cop finalitzat el procés d'inici de sessió. En aquest segment, haurem de crear un tauler per mostrar les dades de diverses maneres. Per tant, és hora de crear el nou tauler i proporcionar el nom del tauler i la descripció.


Pas 3: Un cop emplenat el formulari anterior, és hora de crear la secció de gràfics i control del sensor.

Seleccioneu el bloc de commutació. Serà necessari per activar o desactivar el sensor de pulsioxímetre.

Pas 4: escriviu el nom del bloc. Com podem veure a la imatge anterior, la funció de commutació proporcionarà dos estats, ON i OFF. Al mateix procés, seleccioneu el bloc de gràfics.

Aquesta secció de gràfics ha de ser seleccionada dues vegades, ja que es mostraran dos gràfics, Heart bit i SpO2. Es creen les dues seccions. Com podem veure, hem seleccionat totes les funcionalitats d’entrada i sortida.

Pas 5: el següent i últim pas és tenir la clau adafruit. Com podem veure, obtenim la clau adafruit i cal afegir-la al codi.

L’Adafruit IO ja està configurat. És hora de preparar el maquinari i crear el firmware per a aquest projecte.
Explicació del codi
Aquest codi utilitza moltes biblioteques i totes són importants. Les biblioteques són la biblioteca del sensor de polsímetre MAX30100 , Wire.h per a l'I2C, WiFi.h per al suport relacionat amb WiFi a ESP32, Adafruit MQTT i biblioteca de client MQTT . El programa complet es troba a la part inferior d’aquesta pàgina.
Les biblioteques esmentades anteriorment s’inclouen al principi del codi.
#incloure
Les dues definicions següents són el SSID WLAN i la contrasenya WLAN. Això ha de ser exacte i l’SP32 l’utilitzarà per connectar-se amb la xarxa WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
A continuació, vam definir les definicions d'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 taxa d’actualització actualitzarà les dades cada 5 segons, el servidor serà io.adafruit.com amb un port de servidor de 1883. El nom d’usuari i la contrasenya seran el nom d’usuari i la contrasenya generats des del tauler d’Adafruit IO. Serà diferent per a tots i s’haurà de generar tal com es descriu a la secció de configuració d’adafruit.
Els ports I2C es defineixen després com es mostra a l'esquema.
#define I2C_SDA 21 #define I2C_SCL 22
A continuació, s’utilitzen tres variables per emmagatzemar l’últim informe i el valor bpm i spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
El MQTT funciona amb un model pub-sub (publica i subscriu-te). En aquest model de treball, el dispositiu que envia les dades al servidor Adafruit es manté en mode de publicació, on el servidor Adafruit IO subscriu els mateixos punts de dades. Amb aquest efecte, cada vegada que el dispositiu publica dades noves, el servidor, tal com està subscrit a les mateixes, rep les dades i proporciona les accions necessàries.
El mateix passa quan el servidor publica les dades i el dispositiu s’hi subscriu. A la nostra aplicació, el dispositiu envia les dades de SPO2 i BPM al servidor, de manera que publica les mateixes i rep l'estat ON-OFF del servidor, subscrivint-se així. Això es configura al fragment de codi que es descriu a continuació.
Client 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"); // Noteu els camins MQTT per AIO seguiu el formulari següent:
A la funció de configuració , iniciem l’I2C, connectem el WiFi amb l’SSID i la contrasenya predefinits i iniciem el procés de subscripció MQTT per a l’estat del commutador (el botó de commutació creat al tauler d’Adafruit IO).
configuració nul·la () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {demora (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi connectat"); Serial.println ("adreça IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicialització de l'oxímetre de pols.."); // Inicialitzeu la instància de PulseOximeter // Les fallades generalment es deuen a un cablejat I2C incorrecte, falta una font d'alimentació // o un xip objectiu incorrecte si (! Pox.begin ()) {Serial.println ("FAILED"); per (;;); } else {Serial.println ("ÈXIT"); } // El corrent predeterminat del LED IR és de 50 mA i es podria canviar // si no es comenta la línia següent. Consulteu MAX30100_Registers.h per a totes les // opcions disponibles. la verola.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registre una devolució de trucada per a la detecció de batecs pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Després de tot això, el max30100 s'inicia amb una configuració de corrent de led. També hi ha diferents paràmetres actuals disponibles als fitxers de capçalera MAX30100 per a diferents configuracions. També s’inicia una funció de trucada de detecció de batecs. Després de totes aquestes configuracions, el sensor d’oxímetre s’atura.
A la funció de bucle , s'inicia la connexió MQTT i es comprova el model de subscripció cada 5.000 mil·lisegons. En aquesta situació, si l’interruptor està activat, comença a llegir el sensor d’oxímetre i a publicar les dades del batec del cor i el valor SPO2. Si l’interruptor està apagat, suspèn totes les tasques relacionades amb el sensor d’oxímetre de pols.
bucle buit () {MQTT_connect (); Adafruit_MQTT_Subscribe * subscripció; while ((subscripció = mqtt.readSubscription (5000))) {if (subscripció == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Inici del POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funció que implementa la tasca. * / "pox_read", / * Nom del text de la tasca. * / 1024 * 3, / * Mida de la pila en paraules, no bytes. * / NULL, / * Paràmetre passat a la tasca. * / 2, / * Prioritat en què es crea la tasca. * / & poxReadTaskHld); / * S’utilitza per passar el controlador de la tasca creada. * /} retard (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funció que implementa la tasca. * / "mqttPub", / * Nom del text de la tasca. * / 1024 * 3, / * Mida de la pila en paraules, no en bytes. * / NULL, / * Paràmetre passat a la tasca. * / 2, / * Prioritat en què es crea la tasca. * / & mqttPubTaskHld); / * S'utilitza per passar el controlador de la tasca creada. * /}} else {Serial.print (("Stoping POX…")); // Detele la tasca de lectura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NUL; } // Suprimiu la tasca del pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * S’utilitza per passar el controlador de la tasca creada. * /}} else {Serial.print (("Stoping POX…")); // Detele la tasca de lectura de POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NUL; } // Suprimiu la tasca del pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * S'utilitza per passar el controlador de la tasca creada. * /}} else {Serial.print (("Stoping POX…")); // Detele la tasca de lectura POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NUL; } // Suprimiu la tasca de publicació MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demostració d'oxímetre de pols basat en IoT
El circuit està connectat correctament en una taula de programació i el programa que es mostra a continuació es carrega a ESP32. Assegureu-vos de canviar les credencials de Wi-Fi i Adafruit en conseqüència al vostre codi perquè us funcioni.

Després de la connexió amb el servidor WiFi i Adafruit IO, va començar a funcionar com s’esperava.
Com podem veure, el nivell SPO2 mostra un 96% i el batec del cor mostra de 78 a 81 bits per minut. També proporciona el moment en què es capturen les dades.

Com podem veure a la imatge anterior, l’interruptor està apagat i les dades són 0. El vídeo de treball complet del projecte també es pot trobar a la part inferior d’aquesta pàgina.
Espero que us hagi agradat l'article i hàgiu après alguna cosa útil, si teniu cap pregunta, deixeu-los a la secció de comentaris a continuació o publiqueu-los als nostres fòrums.
