- MAX30100 senzor
- Potrebne komponente
- Povezivanje oksimetra MAX30100 s ESP32
- Adafruit IO s ESP32 za praćenje otkucaja srca
- Objašnjenje koda
- Demonstracija pulsnog oksimetra temeljenog na IoT-u
Pulsna oksimetrija široko je korišten medicinski instrument za mjerenje i neinvazivan je i bezbolan test koji mjeri razinu zasićenja kisika u našoj krvi koja lako može otkriti male promjene u kisiku. U trenutnoj situaciji s Covid-19 postalo je važno daljinski pratiti razinu kisika više pacijenata istovremeno bez kontakta s pacijentom.
Dakle, u ovom projektu gradimo pulsni oksimetar pomoću pulsnog oksimetra MAX30100 i ESP32 koji će pratiti razinu kisika u krvi i slati podatke putem interneta povezivanjem na Wi-Fi mrežu. Na taj način možemo daljinski pratiti više pacijenata održavajući socijalnu distancu s pacijentima. Dobiveni podaci bit će prikazani u obliku grafikona koji olakšava praćenje i analizu stanja pacijenta. Prije smo izradili i druge monitore otkucaja srca pomoću pulsnih senzora. A ako ste zainteresirani za druge projekte povezane s Covid-19, možete provjeriti termometar za ljudsko tijelo, pametni IR termometar za praćenje vrućice i skener za temperaturu na zidu koji smo ranije izradili.
Osim aplikacije Covid-19, ovaj se projekt također može široko koristiti kod kronične opstruktivne bolesti pluća (KOPB), astme, upale pluća, karcinoma pluća, anemije, srčanog ili srčanog zatajenja ili kod urođenih srčanih mana.
Imajte na umu da senzor korišten u ovom projektu nije medicinski ocijenjen i projekt nije testiran na primjene otporne na kvarove. Uvijek upotrijebite medicinski ocijenjeni pulsni oksimetar kako biste odredili razinu pulsa i kisika pacijenta i razgovarajte o tome s liječnikom. Ovdje raspravljeni projekt samo je u obrazovne svrhe.
MAX30100 senzor
MAX30100 senzor integrirana je pulsna oksimetrija i modul za nadzor pulsa. Komunicira s I2C podatkovnom linijom i pruža informacije o SpO2 i Pulseu glavnoj jedinici mikrokontrolera. Koristi fotodetektore, optičke elemente gdje crvena, zelena IR LED modulira LED impulse. LED struja se može konfigurirati od 0 do 50mA. Na donjoj je slici prikazan senzor MAX30100.

Gornji senzorski modul radi s 1,8 V do 5,5 V raspona. Vučni otpornici za I2C pinove uključeni su u modul.
Potrebne komponente
- WiFi veza
- ESP32
- MAX30100 senzor
- ID korisnika Adafruit IO i prilagođeno izrađena nadzorna ploča (dodatno će se poboljšati)
- 5V odgovarajuća jedinica napajanja s nazivnom strujom od najmanje 1A
- USB kabel Micro USB na USBA
- Računalo s Arduino IDE-om s programskim okruženjem ESP32.
Povezivanje oksimetra MAX30100 s ESP32
Kompletna shema sklopa za MAX30100 s ESP32 dana je u nastavku.

Ovo je vrlo jednostavna shema. Pin 21 i 22 ESP32 devkita C povezan je s pulsnim oksimetrom osjetnikom MAX30100 sa SDA i SCL pinovima. Oksimetar se također napaja 5V pinom na razvojnoj ploči ESP32. Povezao sam se pomoću ploče i spojnih žica, a postavke testiranja izgledaju ovako -

Adafruit IO s ESP32 za praćenje otkucaja srca
Prethodno smo izgradili mnoge Adafruit IO projekte za različite IoT aplikacije. Adafruit IO izvrsna je platforma na kojoj se može stvoriti prilagođena nadzorna ploča. Da biste stvorili prilagođenu nadzornu ploču za senzor puls-oksimetra temeljen na IoT-u, koristite korake u nastavku -
Korak 1: Prvo se prijavite u adafruit IO nakon davanja imena Fist, prezimena, adrese e-pošte, korisničkog imena i lozinke.

Korak 2: Prazan prozor nadzorne ploče otvorit će se nakon završetka postupka prijave. U ovom ćemo segmentu trebati izraditi nadzornu ploču za prikaz podataka na razne načine. Dakle, vrijeme je da izradite novu nadzornu ploču i navedete naziv nadzorne ploče i opis.


Korak 3: Nakon popunjavanja gornjeg obrasca, vrijeme je za stvaranje grafikona i kontrolnog odjeljka za senzor.

Odaberite preklopni blok. Bit će potrebno za UKLJUČIVANJE ili ISKLJUČIVANJE senzora puls-oksimetra.

Korak 4: Zapišite naziv bloka. Kao što možemo vidjeti na gornjoj slici, funkcija prebacivanja pružit će dva stanja, UKLJUČENO i ISKLJUČENO. U istom postupku odaberite blok grafikona.

Ovaj odjeljak grafa treba odabrati dva puta jer će se prikazati dva grafa, Heart bit i SpO2. Izrađena su oba odjeljka. Kao što vidimo, odabrali smo sve ulazne i izlazne funkcije.

Korak 5: Sljedeći i posljednji korak je imati ključ adafruit. Kao što vidimo, dobivamo ključ adafruit i to treba dodati u kod.

Adafruit IO je sada konfiguriran. Vrijeme je da pripremite hardver i izradite firmware za ovaj projekt.
Objašnjenje koda
Ovaj kod koristi mnoge knjižnice i sve su važne. Biblioteke su MAX30100 knjižnica senzora pulsnog oksimetra, Wire.h za I2C, WiFi.h za WiFi povezanu podršku u ESP32, Adafruit MQTT i MQTT Client knjižnica. Kompletni program nalazi se na dnu ove stranice.
Gore spomenute knjižnice nalaze se na početku koda.
#include
Sljedeće dvije definicije su WLAN SSID i WLAN lozinka. To mora biti točno i ESP32 će ga koristiti za povezivanje s WiFi mrežom.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Zatim smo definirali definicije 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"
Stopa ažuriranja ažurirat će podatke na svakih 5 sekundi, poslužitelj će biti io.adafruit.com s poslužiteljskim priključkom 1883. Korisničko ime i lozinka bit će generirano korisničko ime i lozinka s nadzorne ploče Adafruit IO. Za sve će biti različito i treba ga generirati kako je opisano u odjeljku za postavljanje adafruta.
I2C priključci definirani su naknadno kako je prikazano u shemi.
#define I2C_SDA 21 #define I2C_SCL 22
Dalje, tri se varijable koriste za spremanje posljednjeg izvješća i vrijednosti bpm i spo2.
uint32_t tsLastReport = 0; plutajuće bpm_dt = 0; plutajuće spo2_dt = 0;
MQTT radi s pub-sub modelom (objavite i pretplatite se). U ovom radnom modelu uređaj koji podatke šalje na poslužitelj Adafruit ostaje u načinu objavljivanja gdje se poslužitelj Adafruit IO pretplaćuje na iste podatkovne točke. U takvom učinku, kad god uređaj objavi nove podatke, poslužitelj, budući da je na njih pretplaćen, prima podatke i pruža potrebne radnje.
Ista se stvar događa kada poslužitelj objavi podatke, a uređaj se na njih pretplati. U našoj aplikaciji uređaj šalje podatke SPO2 i BPM poslužitelju, pa ih objavljuje i prima ON-OFF stanje od poslužitelja, pretplaćujući se na ovaj. Ova stvar je konfigurirana u isječku koda opisanom u nastavku -
Klijent WiFiClient; Adafruit_MQTT_Client mqtt (& klijent, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Obavijestimo da MQTT staze za AIO slijede obrazac:
U funkciji postavljanja pokrećemo I2C, povezujemo WiFi s unaprijed definiranim SSID-om i lozinkom i započinjemo postupak pretplate na MQTT za stanje prekidača (gumb prekidača stvoren na nadzornoj ploči Adafruit IO).
void setup () {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 povezan"); Serial.println ("IP adresa:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicijalizacija pulsnog oksimetra.."); // Inicijalizirajte instancu PulseOximeter // Kvarovi su uglavnom posljedica nepravilnog ožičenja I2C, nedostatka napajanja // ili pogrešnog ciljnog čipa ako (! Pox.begin ()) {Serial.println ("FAILED"); za(;;); } else {Serial.println ("USPJEH"); } // Zadana struja za IR LED je 50mA i mogla bi se promijeniti // nekomentiranjem sljedećeg retka. Provjerite MAX30100_Registers.h za sve // dostupne opcije. boginje.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registrirajte povratni poziv za otkrivanje ritma pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Nakon svega ovoga, max30100 se pokreće s podešavanjem led struje. Različite trenutne postavke također su dostupne u zaglavnim datotekama MAX30100 za različite konfiguracije. Pokrenuta je i funkcija povratnog poziva za otkrivanje otkucaja srca. Nakon svih ovih postavki, senzor oksimetra se zaustavlja.
U funkciji petlje pokreće se MQTT veza i model pretplate provjerava se svakih 5000 milisekundi. U ovoj situaciji, ako je prekidač uključen, započinje očitavanje senzora oksimetra i objavljivanje podataka otkucaja srca i vrijednosti SPO2. Ako je prekidač isključen, obustavlja sve zadatke koji se odnose na pulsni oksimetar.
petlja void () {MQTT_connect (); Pretplata na Adafruit_MQTT_Subscribe *; while ((pretplata = mqtt.readSubscription (5000))) {if (pretplata == & sw_sub) {Serial.print (F ("Dobio:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Starting POX…")); startReadPOX (); BaseType_t xPovraćeno; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funkcija koja implementira zadatak. * / "pox_read", / * Naziv teksta zadatka. * / 1024 * 3, / * Veličina sloga u riječima, ne bajtova. * / NULL, / * Parametar je prešao u zadatak. * / 2, / * Prioritet pri kojem se zadatak stvara. * / & poxReadTaskHld); / * Koristi se za odavanje kvake kreirane zadaće. * /} kašnjenje (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcija koja provodi zadatak. * / "mqttPub", / * Naziv teksta zadatka. * / 1024 * 3, / * Veličina sloga u riječima, a ne u bajtovima. * / NULL, / * Parametar je proslijeđen u zadatak. * / 2, / * Prioritet pri kojem se izrađuje zadatak. * / & mqttPubTaskHld); / * Koristi se za odavanje kvake kreiranog zadatka. * /}} else {Serial.print (("Zaustavljanje POX-a…")); // Otkrivanje zadatka čitanja POX-a if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbrišite zadatak MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Koristi se za odavanje kvake kreiranog zadatka. * /}} else {Serial.print (("Zaustavljanje POX-a…")); // Otkrivanje zadatka čitanja POX-a if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbrišite zadatak MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Koristi se za odavanje kvake kreiranog zadatka. * /}} else {Serial.print (("Zaustavljanje POX-a…")); // Otkrivanje zadatka čitanja POX-a if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbrišite zadatak MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstracija pulsnog oksimetra temeljenog na IoT-u
Krug je pravilno spojen u ploču, a dolje navedeni program prenosi se na ESP32. Svakako promijenite vjerodajnice za Wi-Fi i Adafruit u svom kodu kako bi to funkcioniralo za vas.

Nakon veze s WiFi i Adafruit IO poslužiteljem, počeo je raditi kako se očekivalo.
Kao što vidimo, razina SPO2 pokazuje 96%, a otkucaji srca 78 do 81 bit u minuti. Također pruža vrijeme kada se podaci prikupljaju.

Kao što možemo vidjeti na gornjoj slici, prekidač je isključen i podaci su 0. Kompletni radni videozapis projekta također se nalazi na dnu ove stranice.
Nadam se da vam se svidio članak i naučili ste nešto korisno. Ako imate bilo kakvih pitanja, ostavite ih u odjeljku za komentare ispod ili ih objavite na našim forumima.
