- MAX30100 senzor
- Zahtevane komponente
- Povezava oksimetra MAX30100 z ESP32
- Adafruit IO z ESP32 za spremljanje srčnega utripa
- Razlaga kode
- Prikaz impulznega oksimetra na osnovi IoT
Pulzna oksimetrija je široko uporabljen instrument za merjenje v medicini in je neinvaziven in neboleč test, ki meri stopnjo nasičenosti kisika v krvi, ki zlahka zazna majhne spremembe kisika. V trenutnih razmerah Covid-19 je postalo pomembno spremljati raven kisika pri več bolnikih hkrati na daljavo, ne da bi prišli v stik s pacientom.
V tem projektu torej z uporabo pulznega oksimetra MAX30100 in ESP32 zgradimo pulzni oksimeter, ki bo sledil nivoju kisika v krvi in podatke pošiljal prek interneta s povezavo v omrežje Wi-Fi. Na ta način lahko na daljavo spremljamo več pacientov, tako da vzdržujemo socialno distanco do pacientov. Pridobljeni podatki bodo prikazani v obliki grafa, ki olajša sledenje in analizo bolnikovega stanja. Prej smo zgradili tudi druge merilnike srčnega utripa z uporabo pulznih senzorjev. In če vas zanimajo drugi projekti, povezani s Covid-19, si lahko ogledate termometer človeškega telesa, pametni IR termometer za spremljanje vročine in optični bralnik temperature na steno, ki smo ga zgradili prej.
Razen aplikacije Covid-19 se ta projekt lahko pogosto uporablja tudi pri kronični obstruktivni pljučni bolezni (KOPB), astmi, pljučnici, pljučnem raku, anemiji, srčnem infarktu ali srčnem popuščanju ali pri prirojenih srčnih napakah.
Upoštevajte, da senzor, uporabljen v tem projektu, ni medicinsko ocenjen in projekt ni preizkušen za odporne aplikacije. Vedno uporabite pulzno oksimeter z medicinsko oceno, da določite raven pulza in kisika pri bolniku in se o tem pogovorite z zdravnikom. Tu obravnavani projekt je namenjen samo izobraževalnim namenom.
MAX30100 senzor
Senzor MAX30100 je vgrajena pulzna oksimetrija in modul za merjenje srčnega utripa. Komunicira s podatkovno linijo I2C in gostiteljski mikrokrmilniški enoti zagotavlja informacije SpO2 in Pulse. Uporablja fotodetektorje, optične elemente, kjer rdeča, zelena IR LED modulira LED impulze. LED tok je nastavljiv od 0 do 50mA. Spodnja slika prikazuje senzor MAX30100.
Zgornji senzorski modul deluje z napetostjo od 1,8 do 5,5 V. V modul so vključeni vlečni upori za zatiče I2C.
Zahtevane komponente
- WiFi povezava
- ESP32
- MAX30100 senzor
- ID uporabnika Adafruit IO in nadzorna plošča, izdelana po meri (bo še naprej)
- 5V ustrezna napajalna enota z nazivnim tokom najmanj 1A
- USB kabel Micro USB na USBA
- Računalnik z Arduino IDE s programskim okoljem ESP32.
Povezava oksimetra MAX30100 z ESP32
Celoten diagram vezja za MAX30100 z ESP32 je podan spodaj.
To je zelo preprosta shema. Zatiča 21 in 22 naprave ESP32 devkit C sta povezana s senzorjem pulznega oksimetra MAX30100 z zatiči SDA in SCL. Oximeter napaja tudi 5V zatič na razvojni plošči ESP32. Povezavo sem vzpostavil s pomočjo plošče in povezovalnih žic in nastavitve testiranja so videti takole -
Adafruit IO z ESP32 za spremljanje srčnega utripa
Pred tem smo zgradili številne projekte Adafruit IO za različne IoT aplikacije. Adafruit IO je odlična platforma, kjer lahko ustvarite nadzorno ploščo po meri. Če želite ustvariti nadzorno ploščo po meri za senzor pulz-oksimetra, ki temelji na IoT, uporabite spodnje korake -
1. korak: Najprej se prijavite v adafruit IO, potem ko navedete ime, priimek, e-poštni naslov, uporabniško ime in geslo.
2. korak: Po končani prijavi se odpre prazno okno armaturne plošče. V tem segmentu bomo morali ustvariti nadzorno ploščo za prikaz podatkov na različne načine. Čas je, da ustvarite novo armaturno ploščo in navedete njeno ime in opis.
3. korak: Po izpolnitvi zgornjega obrazca je čas, da ustvarite graf in kontrolni odsek za senzor.
Izberite stikalni blok. Potreben bo za vklop ali izklop senzorja pulznega oksimetra.
4. korak: Zapišite ime bloka. Kot lahko vidimo na zgornji sliki, bo funkcija preklopa zagotavljala dve stanji, ON in OFF. V istem postopku izberite graf.
Ta odsek grafa je treba izbrati dvakrat, saj bosta prikazana dva grafa, Heart bit in SpO2. Oba oddelka sta ustvarjena. Kot vidimo, smo izbrali vse vhodne in izhodne funkcije.
5. korak: Naslednji in zadnji korak je, da imamo ključ adafruit. Kot vidimo, dobimo ključ adafruit in to moramo dodati v kodo.
Adafruit IO je zdaj konfiguriran. Čas je, da pripravite strojno opremo in ustvarite vdelano programsko opremo za ta projekt.
Razlaga kode
Ta koda uporablja veliko knjižnic in vse so pomembne. Knjižnice so knjižnica senzorjev pulznega oksimetra MAX30100 , Wire.h za I2C, WiFi.h za podporo, povezano z WiFi v ESP32, knjižnica Adafruit MQTT in MQTT Client . Celoten program najdete na dnu te strani.
Zgoraj omenjene knjižnice so vključene na začetku kode.
#include
Naslednji dve definiciji sta WID SSID in WLAN Password. To mora biti natančno in ga bo ESP32 uporabil za povezavo z omrežjem WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Nato smo opredelili 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"
Hitrost posodabljanja bo posodabljala podatke vsakih 5 sekund, strežnik bo io.adafruit.com s strežniškimi vrati 1883. Uporabniško ime in geslo bosta ustvarili uporabniško ime in geslo z nadzorne plošče adafruit IO. Za vse bo drugačno in ga je treba ustvariti, kot je opisano v poglavju o nastavitvi adafruta.
Vrata I2C so nato definirana, kot je prikazano v shemi.
#define I2C_SDA 21 #define I2C_SCL 22
Nato se tri spremenljivke uporabljajo za shranjevanje zadnjega poročila ter vrednosti bpm in spo2.
uint32_t tsLastReport = 0; plovec bpm_dt = 0; plovec spo2_dt = 0;
MQTT deluje z modelom pub-sub (objava in naročanje). V tem delovnem modelu naprava, ki podatke pošlje strežniku Adafruit, ostane v načinu objavljanja, kjer se strežnik Adafruit IO naroči na iste podatkovne točke. Tako naprava vsakič, ko naprava objavi nove podatke, strežnik, ko je nanje naročen, prejme podatke in poskrbi za potrebno ukrepanje.
Enako se zgodi, ko strežnik objavi podatke in se naprava nanje naroči. V naši aplikaciji naprava pošlje podatke SPO2 in BPM strežniku, zato jih objavi in od strežnika prejme stanje ON-OFF, s čimer se naroči na tega. Ta stvar je konfigurirana v spodnjem opisu delčka kode -
Odjemalec WiFiClient; Adafruit_MQTT_Client mqtt (& odjemalec, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ viri / stikalo"); // Obvestilo o poteh MQTT za AIO sledi obrazcu:
V nastavitveni funkciji zaženemo I2C, povežemo WiFi z vnaprej določenima SSID in geslom ter zaženemo postopek naročnine MQTT za stanje preklopa (gumb za preklop, ustvarjen na nadzorni plošči Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); medtem ko (WiFi.status ()! = WL_CONNECTED) {zamuda (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi povezan"); Serial.println ("Naslov IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Inicializacija pulznega oksimetra.."); // Inicializacija primerka PulseOximeter // Napake so običajno posledica nepravilne napeljave I2C, manjkajočega napajanja // ali napačnega ciljnega čipa, če (! Pox.begin ()) {Serial.println ("FAILED"); za (;;); } else {Serial.println ("USPEH"); } // Privzeti tok za IR LED je 50mA in ga lahko spremenimo // tako, da ne komentiramo naslednje vrstice. Za vse // razpoložljive možnosti preverite MAX30100_Registers.h. pox.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Registriranje povratnega klica za zaznavanje utripov pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Po vsem tem se max30100 zažene z nastavitvijo led toka. Različne trenutne nastavitve so na voljo tudi v zaglavnih datotekah MAX30100 za različne konfiguracije. Zažene se tudi funkcija povratnega klica za zaznavanje srčnega utripa. Po vseh teh nastavitvah se senzor oksimetra ustavi.
V funkciji zanke se zažene povezava MQTT in naročninski model se preveri vsakih 5000 milisekund. Če je stikalo v tem primeru vklopljeno, začne odčitavati senzor oksimetra in objavljati podatke o srčnem utripu in vrednosti SPO2. Če je stikalo izklopljeno, zaustavi vsa opravila, povezana s senzorjem pulznega oksimetra.
void loop () {MQTT_connect (); Naročnina Adafruit_MQTT_Subscribe *; 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, ki izvaja nalogo. * / "pox_read", / * Ime besedila za nalogo. * / 1024 * 3, / * Velikost sklada v besedah, ne bajtov. * / NULL, / * Parameter je prenesen v nalogo. * / 2, / * Prednost, pri kateri je naloga ustvarjena. * / & poxReadTaskHld); / * Uporablja se za posredovanje ročice ustvarjene naloge. * /} zamuda (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcija, ki izvaja nalogo. * / "mqttPub", / * Ime besedila za nalogo. * / 1024 * 3, / * Velikost sklada z besedami, ne v bajtih. * / NULL, / * Parameter je bil poslan v nalogo. * / 2, / * Prednost, pri kateri je naloga ustvarjena. * / & mqttPubTaskHld); / * Uporablja se za posredovanje ročice ustvarjene naloge. * /}} else {Serial.print (("Ustavitev POX…")); // Odkrivanje naloge za branje POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbriši nalogo MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Uporablja se za posredovanje ročice ustvarjene naloge. * /}} else {Serial.print (("Ustavitev POX…")); // Odkrivanje naloge za branje POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbriši nalogo MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Uporablja se za posredovanje ročice ustvarjene naloge. * /}} else {Serial.print (("Ustavitev POX…")); // Odkrivanje naloge za branje POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Izbriši nalogo MQTT Pub if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Prikaz impulznega oksimetra na osnovi IoT
Vezje je pravilno povezano v ploščo in spodaj navedeni program je naložen v ESP32. Poskrbite, da boste v svoji kodi ustrezno spremenili poverilnice Wi-Fi in Adafruit, da bosta delovala za vas.
Po povezavi s strežnikom WiFi in Adafruit IO je začel delovati po pričakovanjih.
Kot lahko vidimo, raven SPO2 kaže 96%, srčni utrip pa 78 do 81 bitov na minuto. Zagotavlja tudi čas zajema podatkov.
Kot lahko vidimo na zgornji sliki, je stikalo izklopljeno in podatki so 0. Celoten delovni videoposnetek projekta najdete tudi na dnu te strani.
Upam, da vam je bil članek všeč in ste se naučili kaj koristnega. Če imate kakršna koli vprašanja, jih pustite v spodnjem oddelku za komentarje ali objavite na naših forumih.