- Senzor MAX30100
- Componente necesare
- Interfacere oximetru MAX30100 cu ESP32
- Adafruit IO cu ESP32 pentru monitorizarea ritmului cardiac
- Explicarea codului
- Demonstrație de pulsoximetru bazată pe IoT
Pulsoximetria este un instrument de măsurare medical utilizat pe scară largă și este un test neinvaziv și nedureros care măsoară nivelul de saturație a oxigenului din sângele nostru care poate detecta cu ușurință mici modificări ale oxigenului. În situația actuală Covid-19, a devenit important să se urmărească nivelul de oxigen al mai multor pacienți în același timp de la distanță, fără a intra în contact cu pacientul.
Deci, în acest proiect, construim un pulsoximetru folosind pulsoximetrul MAX30100 și ESP32 care va urmări nivelul de oxigen din sânge și va trimite datele prin internet prin conectarea la o rețea Wi-Fi. În acest fel, putem monitoriza de la distanță mai mulți pacienți, menținând distanța socială cu pacienții. Datele obținute vor fi afișate sub formă de grafic care facilitează urmărirea și analiza stării pacientului. Anterior, am construit și alte monitoare de ritm cardiac folosind senzori de puls. Și dacă sunteți interesat de alte proiecte legate de Covid-19, puteți verifica termometrul corpului uman, termometrul inteligent IR pentru monitorizarea febrei și scanerul de temperatură pe perete pe care îl construim mai devreme.
În afară de aplicația Covid-19, acest proiect poate fi utilizat pe scară largă și în boli pulmonare obstructive cronice (BPOC), astm, pneumonie, cancer pulmonar, anemie, infarct miocardic sau insuficiență cardiacă sau în defecte cardiace congenitale.
Rețineți că, senzorul utilizat în acest proiect nu este evaluat din punct de vedere medical, iar proiectul nu este testat pentru aplicații rezistente la eșecuri. Utilizați întotdeauna un puls oximetru evaluat medical pentru a determina nivelul pulsului și oxigenului pacientului și discutați-l cu un medic. Proiectul discutat aici are doar scop educativ.
Senzor MAX30100
Senzorul MAX30100 este modul de monitorizare a pulsului și a ritmului cardiac integrat. Comunică cu linia de date I2C și furnizează informații SpO2 și Pulse către unitatea de microcontroler gazdă. Folosește fotodetectori, elemente optice în care LED-ul IR roșu, verde modulează impulsurile LED-urilor. Curentul LED este configurabil de la 0 la 50mA. Imaginea de mai jos arată senzorul MAX30100.
Modulul senzorului de mai sus funcționează între 1,8V și 5,5V. Rezistențele de tracțiune pentru pinii I2C sunt incluse în modul.
Componente necesare
- O conexiune WiFi
- ESP32
- Senzor MAX30100
- ID-ul utilizatorului Adafruit IO și un tablou de bord personalizat creat (îl va face mai departe)
- Unitate de alimentare adecvată de 5V cu un curent nominal de cel puțin 1A
- Cablu USB Micro USB la USBA
- Un PC cu Arduino IDE cu mediu de programare ESP32.
Interfacere oximetru MAX30100 cu ESP32
Schema completă a circuitului pentru MAX30100 cu ESP32 este prezentată mai jos.
Aceasta este o schemă foarte simplă. Pinii 21 și 22 ai ESP32 devkit C sunt conectați cu senzorul de oximetru de impuls MAX30100 cu pinii SDA și SCL. Oximetrul este alimentat și de pinul de 5V de pe placa de dezvoltare ESP32. Mi-am făcut conexiunea folosind un panou de testare și fire de conectare, iar configurarea testării arată astfel
Adafruit IO cu ESP32 pentru monitorizarea ritmului cardiac
Am construit anterior mai multe proiecte Adafruit IO pentru diferite aplicații IoT. Adafruit IO este o platformă excelentă în care poate fi creat un tablou de bord personalizat. Pentru a crea tabloul de bord personalizat pentru senzorul de puls-oximetru bazat pe IoT, utilizați pașii de mai jos-
Pasul 1: Înscrieți-vă mai întâi în adafruit IO după ce ați dat numele Fist, prenumele, adresa de e-mail, numele de utilizator și parola.
Pasul 2: fereastra goală a tabloului de bord se va deschide după terminarea procesului de conectare. În acest segment, va trebui să creăm un tablou de bord pentru a afișa datele în diferite moduri. Astfel, este timpul să creați noul tablou de bord și să furnizați numele tabloului de bord și descrierea.
Pasul 3: După completarea formularului de mai sus, este timpul să creați graficul și secțiunea de control pentru senzor.
Selectați blocul de comutare. Va fi necesar pentru pornirea sau oprirea senzorului puls-oximetru.
Pasul 4: Notați numele blocului. După cum putem vedea în imaginea de mai sus, funcția de comutare va oferi două stări, ON și OFF. În același proces, selectați blocul grafic.
Această secțiune a graficului trebuie selectată de două ori, deoarece vor fi afișate două grafice, Heart bit și SpO2. Ambele secțiuni sunt create. După cum putem vedea, am selectat toate funcționalitățile de intrare și ieșire.
Pasul 5: următorul și ultimul pas este să aveți cheia adafruit. După cum putem vedea, obținem cheia adafruit și aceasta trebuie adăugată în cod.
Adafruit IO este acum configurat. Este timpul să pregătiți hardware-ul și să creați firmware-ul pentru acest proiect.
Explicarea codului
Acest cod folosește multe biblioteci și toate sunt importante. Bibliotecile sunt biblioteca de senzori de oximetru de puls MAX30100, Wire.h pentru I2C, WiFi.h pentru suportul conexiunii WiFi în ESP32, Adafruit MQTT și biblioteca client MQTT . Programul complet poate fi găsit în partea de jos a acestei pagini.
Bibliotecile menționate mai sus sunt incluse la începutul codului.
#include
Următoarele două definiții sunt SSL WLAN și Parolă WLAN. Acest lucru trebuie să fie exact și va fi utilizat de ESP32 pentru a se conecta la rețeaua WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Apoi, am definit definițiile 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"
Rata de actualizare va actualiza datele la fiecare 5 secunde, serverul va fi io.adafruit.com cu un port server de 1883. Numele de utilizator și parola vor fi numele de utilizator și parola generate din tabloul de bord IO adafruit. Va fi diferit pentru toți și trebuie generat așa cum este descris în secțiunea de configurare adafruit.
Porturile I2C sunt definite ulterior după cum se arată în schemă.
#define I2C_SDA 21 #define I2C_SCL 22
Apoi, sunt utilizate trei variabile pentru a stoca ultimul raport și valoarea bpm și spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT funcționează cu un model pub-sub (publicați și abonați-vă). În acest model de lucru, dispozitivul care trimite datele către serverul Adafruit rămâne în modul de publicare în care serverul Adafruit IO se abonează la aceleași puncte de date. Într-un astfel de efect, ori de câte ori dispozitivul publică date noi, serverul, deoarece este abonat la aceleași, primește datele și oferă acțiunile necesare.
Același lucru se întâmplă atunci când serverul publică datele și dispozitivul se abonează la acestea. În aplicația noastră, dispozitivul trimite datele SPO2 și BPM către server, deci le publică la fel și primește starea ON-OFF de la server, abonându-se astfel la acesta. Acest lucru este configurat în fragmentul de cod descris mai jos-
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"); // Observați căile MQTT pentru AIO urmați formularul:
În funcția de configurare , pornim I2C, conectăm WiFi-ul cu SSID-ul și parola predefinite și începem procesul de abonament MQTT pentru starea de comutare (Butonul de comutare creat în tabloul de bord Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {întârziere (500); Serial.print ("."); } Serial.println (); Serial.println („WiFi conectat”); Serial.println ("adresa IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inițializarea oximetrului de puls.."); // Inițializați instanța PulseOximeter // Defecțiunile se datorează, în general, unei conexiuni necorespunzătoare I2C, lipsei sursei de alimentare // sau cipului țintă greșit dacă (! Pox.begin ()) {Serial.println ("FAILED"); pentru(;;); } else {Serial.println ("SUCCES"); } // Curentul implicit pentru LED-ul IR este de 50mA și ar putea fi schimbat // prin necomentarea următoarei linii. Verificați MAX30100_Registers.h pentru toate // opțiunile disponibile. varicela.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Înregistrați un apel invers pentru detectarea ritmului pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
După toate acestea, max30100 este pornit cu o setare de curent LED. Setări curente diferite sunt, de asemenea, disponibile în fișierele antet MAX30100 pentru diferite configurații. Este, de asemenea, pornită o funcție de apel înapoi pentru detectarea bătăilor inimii. După toate aceste setări, senzorul oximetru este oprit.
În funcția buclă , conexiunea MQTT este pornită și modelul de abonament este verificat la fiecare 5000 de milisecunde. În această situație, dacă comutatorul este pornit, acesta începe să citească senzorul oximetru și să publice datele despre Heartbeat și valoarea SPO2. Dacă comutatorul este oprit, acesta suspendă toate sarcinile legate de senzorul de oximetru de puls.
bucla void () {MQTT_connect (); Adafruit_MQTT_Subscribe * abonament; while ((abonament = mqtt.readSubscription (5000))) {if (abonament == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Pornind POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funcție care implementează sarcina. * / "pox_read", / * Numele textului sarcinii. * / 1024 * 3, / * Dimensiunea stivei în cuvinte, nu octeți. * / NULL, / * Parametru trecut în sarcină. * / 2, / * Prioritate la care se creează sarcina. * / & poxReadTaskHld); / * Se folosește pentru a elimina mânerul sarcinii create. * /} întârziere (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funcție care implementează sarcina. * / "mqttPub", / * Numele textului sarcinii. * / 1024 * 3, / * Dimensiunea stivei în cuvinte, nu în octeți. * / NULL, / * Parametru trecut în sarcină. * / 2, / * Prioritatea la care este creată sarcina. * / & mqttPubTaskHld); / * Se folosește pentru a elimina mânerul sarcinii create. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ștergeți sarcina MQTT Pub dacă (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Se folosește pentru a elimina mânerul sarcinii create. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ștergeți sarcina MQTT Pub dacă (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Se folosește pentru a elimina mânerul sarcinii create. * /}} else {Serial.print (("Stoping POX…")); // Detele POX read task if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ștergeți sarcina MQTT Pub dacă (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstrație de pulsoximetru bazată pe IoT
Circuitul este conectat corespunzător într-o placă de calcul și programul de mai jos este încărcat pe ESP32. Asigurați-vă că schimbați acreditările Wi-Fi și Adafruit în consecință în codul dvs. pentru a vă face să funcționeze.
După conectarea cu serverul WiFi și Adafruit IO, a început să funcționeze așa cum era de așteptat.
După cum putem vedea, nivelul SPO2 este de 96%, iar bătăile inimii arată de la 78 la 81 de biți pe minut. De asemenea, oferă momentul în care datele sunt capturate.
După cum putem vedea în imaginea de mai sus, comutatorul este oprit și datele sunt 0. Videoclipul complet de lucru al proiectului poate fi găsit și în partea de jos a acestei pagini.
Sper că v-a plăcut articolul și ați aflat ceva util, dacă aveți întrebări, vă rugăm să le lăsați în secțiunea de comentarii de mai jos sau să le postați pe forumurile noastre.