- MAX30100 jutiklis
- Reikalingi komponentai
- Sąsaja su MAX30100 oksimetru su ESP32
- „Adafruit IO“ su ESP32 širdies ritmo stebėjimui
- Kodo paaiškinimas
- IoT pagrįstas pulso oksimetro demonstravimas
Pulso oksimetrija yra plačiai naudojama medicininė matavimo priemonė, ir tai yra neinvazinis ir neskausmingas tyrimas, kuris matuoja deguonies prisotinimo lygį mūsų kraujyje ir gali lengvai nustatyti nedidelius deguonies pokyčius. Esant dabartinei „Covid-19“ situacijai, tapo svarbu vienu metu nuotoliniu būdu stebėti kelių pacientų deguonies kiekį, nesusisiekiant su pacientu.
Taigi šiame projekte mes sukursime pulso oksimetrą naudodami „ MAX30100 Pulse oximeter“ ir „ESP32“, kurie stebės deguonies kiekį kraujyje ir siųs duomenis internetu prisijungdami prie „Wi-Fi“ tinklo. Tokiu būdu mes galime stebėti kelis pacientus nuotoliniu būdu, išlaikydami socialinį atstumą su pacientais. Gauti duomenys bus rodomi kaip grafikas, palengvinantis paciento būklės stebėjimą ir analizavimą. Anksčiau mes taip pat sukūrėme kitus širdies ritmo matuoklius, naudodami pulso jutiklius. Ir jei jus domina kiti su „Covid-19“ susiję projektai, galite patikrinti žmogaus kūno termometrą, „Smart IR“ termometrą karščiavimui stebėti ir „ Wall-Mount Temperature“ skaitytuvą, kurį sukūrėme anksčiau.
Šis projektas, be „Covid-19“ programos, taip pat gali būti plačiai naudojamas sergant lėtine obstrukcine plaučių liga (LOPL), astma, plaučių uždegimu, plaučių vėžiu, mažakraujyste, širdies priepuoliu ar širdies nepakankamumu arba esant įgimtiems širdies defektams.
Atkreipkite dėmesį, kad šiame projekte naudojamas jutiklis nėra mediciniškai įvertintas ir projektas nėra išbandytas, kad būtų galima naudoti nuo gedimų. Visada naudokite mediciniškai įvertintą pulso oksimetrą, kad nustatytumėte paciento pulsą ir deguonies lygį, ir aptarkite tai su gydytoju. Čia aptartas projektas skirtas tik švietimo tikslams.
MAX30100 jutiklis
MAX30100 jutiklis yra integruotas pulso oksimetrijos ir širdies ritmo matuoklio modulis. Jis bendrauja su I2C duomenų linija ir teikia informaciją apie SpO2 ir impulsą pagrindinio mikrovaldiklio blokui. Jis naudoja fotodetektorius, optinius elementus, kur raudonas, žalias IR šviesos diodas moduliuoja šviesos diodų impulsus. LED srovė gali būti konfigūruojama nuo 0 iki 50mA. Žemiau esančiame paveikslėlyje rodomas MAX30100 jutiklis.
Aukščiau pateiktas jutiklio modulis veikia nuo 1,8 V iki 5,5 V diapazono. I2C kaiščių prisitraukimo rezistoriai yra įtraukti į modulį.
Reikalingi komponentai
- „WiFi“ ryšys
- ESP32
- MAX30100 jutiklis
- „Adafruit IO“ vartotojo ID ir pasirinktinai sukurta informacijos suvestinė (pavers ją toliau)
- 5 V tinkamas maitinimo blokas, kurio vardinė srovė ne mažesnė kaip 1 A
- USB laidas „Micro USB to USBA“
- Kompiuteris su „Arduino IDE“ su ESP32 programavimo aplinka.
Sąsaja su MAX30100 oksimetru su ESP32
Visa MAX30100 su ESP32 grandinės schema pateikta žemiau.
Tai labai paprasta schema. ESP32 „devkit C“ kaiščiai 21 ir 22 yra sujungti su pulso oksimetro jutikliu MAX30100 su SDA ir SCL kaiščiais. „Oximeter“ maitina ir 5 V kaištis ESP32 kūrimo plokštėje. Aš užmezgiau ryšį naudodamas skydą ir jungiamuosius laidus, o mano testavimo sąranka atrodo taip-
„Adafruit IO“ su ESP32 širdies ritmo stebėjimui
Anksčiau mes sukūrėme daug „Adafruit“ IO projektų, skirtų įvairioms interneto programoms. „Adafruit IO“ yra puiki platforma, kur galima sukurti pasirinktinį prietaisų skydelį. Norėdami sukurti „IoT“ impulso oksimetro jutiklio pritaikytą prietaisų skydelį, atlikite šiuos veiksmus:
1 veiksmas: pirmiausia prisiregistruokite „Adafruit IO“, nurodę „Fist“ vardą, pavardę, el. Pašto adresą, vartotojo vardą ir slaptažodį.
2 žingsnis: Baigus prisijungti bus atidarytas tuščias informacijos suvestinės langas. Šiame segmente turėsime sukurti informacijos suvestinę, kad duomenys būtų rodomi įvairiais būdais. Taigi atėjo laikas sukurti naują informacijos suvestinę ir pateikti informacijos suvestinės pavadinimą bei aprašą.
3 žingsnis: Užpildę aukščiau pateiktą formą, laikas sukurti jutiklio diagramą ir valdymo skyrių.
Pasirinkite jungiklio bloką. Jo reikės įjungti arba išjungti impulsų oksimetro jutiklį.
4 žingsnis: užsirašykite bloko pavadinimą. Kaip matome aukščiau esančiame paveikslėlyje, perjungimo funkcija suteiks dvi būsenas: ĮJUNGTA ir IŠJUNGTA. Tuo pačiu procesu pasirinkite grafiko bloką.
Šį grafiko skyrių reikia pasirinkti du kartus, nes bus rodomi du grafikai: „Heart bit“ ir „SpO2“. Sukurtos abi sekcijos. Kaip matome, mes pasirinkome visas įvesties ir išvesties funkcijas.
5 žingsnis: Kitas ir paskutinis žingsnis yra turėti „Adafruit“ raktą. Kaip matome, mes gauname „Adafruit“ raktą ir tai reikia įtraukti į kodą.
„Adafruit IO“ dabar sukonfigūruota. Atėjo laikas parengti aparatinę įrangą ir sukurti programinę-aparatinę įrangą šiam projektui.
Kodo paaiškinimas
Šis kodas naudoja daug bibliotekų ir visos yra svarbios. Bibliotekos yra MAX30100 pulso oksimetro jutiklių biblioteka, „ Wire.h“, skirta „I2C“, „ WiFi.h“, skirta „WiFi“ palaikymui ESP32, „ Adafruit MQTT“ ir „ MQTT Client“ bibliotekose. Visą programą rasite šio puslapio apačioje.
Tos aukščiau paminėtos bibliotekos yra įtrauktos į kodo pradžią.
# įtraukti
Kiti du apibrėžimai yra WLAN SSID ir WLAN slaptažodis. Tai turi būti tiksli ir ją naudos ESP32 prisijungti prie „WiFi“ tinklo.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Toliau mes apibrėžėme „Adafruit io“ apibrėžimus.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Atnaujinimo greitis atnaujins duomenis kas 5 sekundes, serveris bus io.adafruit.com su 1883 serverio prievadu. Vartotojo vardas ir slaptažodis bus sugeneruotas vartotojo vardas ir slaptažodis iš „Adafruit IO“ informacijos suvestinės. Visiems ji bus kitokia ir ją reikės sugeneruoti taip, kaip aprašyta skyriuje „Adafruit“.
I2C prievadai yra apibrėžti vėliau, kaip parodyta schemoje.
#define I2C_SDA 21 #define I2C_SCL 22
Tada trys kintamieji naudojami paskutinei ataskaitai ir bpm ir spo2 reikšmei saugoti.
uint32_t tsLastReport = 0; plūdė bpm_dt = 0; plūdė spo2_dt = 0;
MQTT veikia su pub-sub modeliu (skelbti ir užsiprenumeruoti). Šiame darbo modelyje įrenginys, pateikiantis duomenis „Adafruit“ serveriui, lieka paskelbimo režimu, kai „Adafruit IO“ serveris prenumeruoja tuos pačius duomenų taškus. Tokiu atveju, kai tik įrenginys paskelbia bet kokius naujus duomenis, serveris, būdamas jų prenumeruojamas, gauna duomenis ir pateikia būtinus veiksmus.
Tas pats atsitinka, kai serveris paskelbia duomenis, o įrenginys juos užsisako. Mūsų programoje įrenginys siunčia SPO2 ir BPM duomenis į serverį, todėl skelbia tuos pačius duomenis ir gauna iš serverio ON-OFF būseną, taip užsiprenumeruodamas šį. Šis dalykas sukonfigūruotas toliau aprašytame kodo fragmente-
„WiFiClient“ klientas; „Adafruit_MQTT_Client mqtt“ (& klientas, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Pastebėkite, kad AIO MQTT keliai atitinka formą:
Į sąrankos funkcijai, mes pradedame I2C, jungiantis WiFi su iš anksto SSID ir slaptažodį, pradedant MQTT prenumeratos procesą jungiklio būklę (Jungiklis mygtuką sukurta Adafruit IO skydelyje).
negaliojanti sąranka () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); „WiFi.begin“ (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {delsa (500); Serijinis spaudinys ("."); } Serial.println (); Serial.println („Wi-Fi prijungtas“); Serial.println ("IP adresas:"); Serial.println („WiFi.localIP“ ()); mqtt.subscribe (& sw_sub); „Serial.print“ („Pulso oksimetro inicijavimas..“); // Inicializuokite „PulseOximeter“ egzempliorių // Gedimus dažniausiai lemia netinkama I2C instaliacija, trūksta maitinimo šaltinio // arba neteisinga tikslinė mikroschema, jei (! Pox.begin ()) {Serial.println ("FAILED"); dėl(;;); } else {Serial.println ("SĖKMĖ"); } // Numatytoji IR šviesos diodo srovė yra 50mA, ir ją galima pakeisti // nekomentuojant šios eilutės. Patikrinkite MAX30100_Registers.h visus // galimus variantus. raupai.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Užregistruokite takto aptikimo pox.setOnBeatDetectedCallback (onBeatDetected) atgalinį skambutį; stopReadPOX (); }
Po viso to „max30100“ paleidžiama nustatant srovės nustatymą. Skirtingų konfigūracijų MAX30100 antraštės failuose taip pat yra skirtingi dabartiniai nustatymai. Taip pat paleidžiama širdies plakimo aptikimo skambučio funkcija. Atlikus visus šiuos nustatymus, oksimetro jutiklis sustabdomas.
Naudojant ciklo funkciją, MQTT ryšys paleidžiamas ir prenumeratos modelis tikrinamas kas 5000 milisekundžių. Esant tokiai situacijai, jei jungiklis įjungtas, jis pradeda skaityti oksimetro jutiklį ir skelbti „ Heartbeat“ ir SPO2 vertės duomenis. Jei jungiklis išjungtas, jis sustabdo visas su pulso oksimetro jutikliu susijusias užduotis.
void loop () {MQTT_connect (); „Adafruit_MQTT_Subscribe *“ prenumerata; 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 (("Starting POX…")); startReadPOX (); „BaseType_t xReturned“; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funkcija, įgyvendinanti užduotį. * / "pox_read", / * Užduoties teksto pavadinimas. * / 1024 * 3, / * Krūvos dydis žodžiais, ne baitai. * / NULL, / * Parametras perduotas užduočiai. * / 2, / * Prioritetas, kuriuo sukuriama užduotis. * / & poxReadTaskHld); / * Naudojamas sukurtos užduoties rankenai perduoti. * /} vėlavimas (100); jei (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcija, įgyvendinanti užduotį. * / "mqttPub", / * Užduoties teksto pavadinimas. * / 1024 * 3, / * Krūvos dydis žodžiais, o ne baitais. * / NULL, / * Parametras perduotas užduočiai. * / 2, / * Pirmenybė, kuria sukuriama užduotis. * / & mqttPubTaskHld); / * Naudojamas sukurtos užduoties rankenai perduoti. * /}} else {Serial.print (("Stoping POX…")); // Detele POX skaityti užduotį, jei (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ištrinti „MQTT Pub“ užduotį, jei (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Naudojamas sukurtos užduoties rankenai perduoti. * /}} else {Serial.print (("Stoping POX…")); // Detele POX skaityti užduotį, jei (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ištrinti „MQTT Pub“ užduotį, jei (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Naudojamas sukurtos užduoties rankenai perduoti. * /}} else {Serial.print (("Stoping POX…")); // Detele POX skaityti užduotį, jei (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Ištrinti „MQTT Pub“ užduotį, jei (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT pagrįstas pulso oksimetro demonstravimas
Grandinė tinkamai prijungta prie skydo, o toliau pateikta programa yra įkeliama į ESP32. Įsitikinkite, kad pakeitėte „Wi-Fi“ ir „Adafruit“ kredencialus kode, kad jis būtų naudingas jums.
Po ryšio su „WiFi“ ir „Adafruit IO“ serveriu jis pradėjo veikti kaip tikėtasi.
Kaip matome, kad SPO2 lygis rodo 96%, o širdies plakimas - nuo 78 iki 81 bitų per minutę. Taip pat nurodomas laikas, kai duomenys užfiksuojami.
Kaip matome aukščiau esančiame paveikslėlyje, jungiklis yra išjungtas, o duomenys yra 0. Visą projekto darbo vaizdo įrašą taip pat galite rasti šio puslapio apačioje.
Tikimės, kad jums patiko straipsnis ir sužinojote ką nors naudingo. Jei turite klausimų, palikite juos žemiau esančiame komentarų skyriuje arba paskelbkite juos mūsų forumuose.