- MAX30100 sensors
- Nepieciešamās sastāvdaļas
- Mijiedarbojas ar MAX30100 oksimetru ar ESP32
- Adafruit IO ar ESP32 sirdsdarbības kontrolei
- Kods Paskaidrojums
- IoT bāzes pulsa oksimetra demonstrēšana
Pulsa oksimetrija ir plaši izmantots medicīniskais mērinstruments, un tas ir neinvazīvs un nesāpīgs tests, kas mēra skābekļa piesātinājuma līmeni mūsu asinīs, kas var viegli noteikt nelielas skābekļa izmaiņas. Pašreizējā Covid-19 situācijā ir kļuvis svarīgi izsekot vairāku pacientu skābekļa līmenim vienlaicīgi attālināti, nesazinoties ar pacientu.
Tātad šajā projektā mēs izveidojam pulsa oksimetru, izmantojot MAX30100 pulsa oksimetru un ESP32, kas izsekos skābekļa līmeni asinīs un nosūtīs datus caur internetu, izveidojot savienojumu ar Wi-Fi tīklu. Tādā veidā mēs varam attālināti uzraudzīt vairākus pacientus, saglabājot sociālo distanci ar pacientiem. Iegūtie dati tiks parādīti kā diagramma, kas atvieglo pacienta stāvokļa izsekošanu un analīzi. Iepriekš mēs esam uzbūvējuši arī citus pulsa monitorus, izmantojot pulsa sensorus. Un, ja jūs interesē citi ar Covid-19 saistītie projekti, varat apskatīt cilvēka ķermeņa termometru, Smart IR termometru drudža kontrolei un sienas stiprinājuma temperatūras skeneri, ko mēs izveidojām agrāk.
Izņemot Covid-19 lietojumprogrammu, šo projektu var plaši izmantot arī hroniskas obstruktīvas plaušu slimības (HOPS), astmas, pneimonijas, plaušu vēža, anēmijas, sirdslēkmes vai sirds mazspējas gadījumā vai iedzimtu sirds defektu gadījumā.
Ņemiet vērā, ka šajā projektā izmantotais sensors nav medicīniski novērtēts, un projekts nav pārbaudīts, lai pārbaudītu, vai nav nodrošināta kļūme. Vienmēr izmantojiet medicīniski novērtētu pulsa oksimetru, lai noteiktu pacienta pulsa un skābekļa līmeni, un apspriediet to ar ārstu. Šeit apspriestais projekts ir paredzēts tikai izglītības vajadzībām.
MAX30100 sensors
MAX30100 sensors ir integrēts pulsa oksimetrijas un sirdsdarbības monitora modulis. Tas sazinās ar I2C datu līniju un nodrošina SpO2 un Pulse informāciju resursdatora mikrokontrolleru blokam. Tas izmanto fotodetektorus, optiskos elementus, kur sarkanais, zaļais IR LED modulē LED impulsus. LED strāvu var konfigurēt no 0 līdz 50mA. Zemāk redzamajā attēlā redzams MAX30100 sensors.
Iepriekš minētais sensora modulis darbojas ar 1,8 V līdz 5,5 V diapazonu. I2C tapu pievilkšanas rezistori ir iekļauti modulī.
Nepieciešamās sastāvdaļas
- WiFi savienojums
- ESP32
- MAX30100 sensors
- Adafruit IO lietotāja ID un pielāgots informācijas panelis (padarīs to tālāk)
- 5V atbilstoša barošanas bloka ar nominālo strāvu vismaz 1A
- USB kabelis Mikro USB - USBA
- Dators ar Arduino IDE ar ESP32 programmēšanas vidi.
Mijiedarbojas ar MAX30100 oksimetru ar ESP32
Pilna MAX30100 ar ESP32 shēma ir dota zemāk.
Šī ir ļoti vienkārša shēma. ESP32 devkit C tapas 21 un 22 ir savienotas ar pulsa oksimetra sensoru MAX30100 ar SDA un SCL tapām. Oksimetru darbina arī ESP32 izstrādes paneļa 5V tapa. Es izveidoju savienojumu, izmantojot paneļu un savienojošos vadus, un mans testēšanas iestatījums izskatās šādi -
Adafruit IO ar ESP32 sirdsdarbības kontrolei
Iepriekš mēs esam izveidojuši daudzus Adafruit IO projektus dažādām IoT lietojumprogrammām. Adafruit IO ir lieliska platforma, kur var izveidot pielāgotu informācijas paneli. Lai izveidotu pielāgotu informācijas paneli IoT balstītam pulsa-oksimetra sensoram, veiciet tālāk norādītās darbības.
1. solis: vispirms reģistrējieties adafruit IO pēc tam, kad esat norādījis Fist vārdu, uzvārdu, e-pasta adresi, lietotājvārdu un paroli.
2. darbība: pēc pierakstīšanās procesa beigām tiks atvērts tukšais informācijas paneļa logs. Šajā segmentā mums būs jāizveido informācijas panelis, lai datus parādītu dažādos veidos. Tādējādi ir pienācis laiks izveidot jauno informācijas paneli un norādīt paneļa nosaukumu un aprakstu.
3. solis: Pēc iepriekš minētās veidlapas aizpildīšanas ir pienācis laiks izveidot sensora diagrammu un vadības sadaļu.
Atlasiet slēdža bloku. Tas būs nepieciešams impulsa oksimetra sensora ieslēgšanai vai izslēgšanai.
4. solis: pierakstiet bloka nosaukumu. Kā redzams iepriekš redzamajā attēlā, pārslēgšanas funkcija nodrošinās divus stāvokļus - ieslēgtu un izslēgtu. Tajā pašā procesā atlasiet diagrammas bloku.
Šī diagrammas sadaļa ir jāizvēlas divreiz, jo tiks parādīti divi grafiki - Sirds bits un SpO2. Abas sadaļas ir izveidotas. Kā redzam, mēs esam izvēlējušies visu ievades un izvades funkcionalitāti.
5. solis: Nākamais un pēdējais solis ir iegūt adafruit atslēgu. Kā redzam, mēs iegūstam adafruit atslēgu, un tas ir jāpievieno kodam.
Adafruit IO tagad ir konfigurēts. Ir pienācis laiks sagatavot aparatūru un izveidot programmaparatūru šim projektam.
Kods Paskaidrojums
Šis kods izmanto daudzas bibliotēkas, un visas ir svarīgas. Bibliotēkas ir MAX30100 pulsa oksimetra sensoru bibliotēka, Wire.h I2C, WiFi.h ar WiFi saistītam atbalstam ESP32, Adafruit MQTT un MQTT klienta bibliotēkā. Pilna programma ir atrodama šīs lapas apakšdaļā.
Iepriekš minētās bibliotēkas ir iekļautas koda sākumā.
# iekļaut
Nākamās divas definīcijas ir WLAN SSID un WLAN parole. Tam ir jābūt precīzam, un ESP32 to izmantos, lai izveidotu savienojumu ar WiFi tīklu.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Tālāk mēs definējām Adafruit io definīcijas.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Atjaunināšanas ātrums atjauninās datus ik pēc 5 sekundēm, serveris būs io.adafruit.com ar servera portu 1883. Lietotājvārds un parole būs ģenerētais lietotājvārds un parole no adafruit IO informācijas paneļa. Tas būs atšķirīgs visiem, un tas ir jāveido, kā aprakstīts sadaļā Adafruit iestatīšana.
I2C porti tiek definēti pēc tam, kā parādīts shēmā.
#define I2C_SDA 21 #define I2C_SCL 22
Pēc tam trīs mainīgie tiek izmantoti, lai saglabātu pēdējo pārskatu un bpm un spo2 vērtību.
uint32_t tsLastReport = 0; pludiņš bpm_dt = 0; pludiņš spo2_dt = 0;
MQTT darbojas ar pub-sub modeli (publicēt un abonēt). Šajā darba modelī ierīce, kas iesniedz datus Adafruit serverim, paliek publicēšanas režīmā, kur Adafruit IO serveris abonē tos pašus datu punktus. Šādā gadījumā ikreiz, kad ierīce publicē jaunus datus, serveris, kā tas ir abonēts, saņem datus un nodrošina nepieciešamās darbības.
Tas pats notiek, kad serveris publicē datus un ierīce tos abonē. Mūsu lietojumprogrammā ierīce nosūta SPO2 un BPM datus uz serveri, tāpēc tos publicē un saņem no servera ON-OFF stāvokli, tādējādi abonējot šo. Šī lieta ir konfigurēta tālāk aprakstītajā koda fragmentā-
WiFiClient klients; Adafruit_MQTT_Client mqtt (& klients, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Paziņojums AQ MQTT ceļi atbilst veidlapai:
Jo iestatīšanas funkciju, mēs sākot I2C, savienojot WiFi ar iepriekš definētā SSID un paroli, un sākot MQTT abonēšanas procesu par slēdža stāvokli (slēdzis poga izveidots Adafruit IO paneļa).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {aizkave (500); Sērijas.druka ("."); } Seriālais.println (); Serial.println ("savienots ar WiFi"); Serial.println ("IP adrese:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Pulsa oksimetra inicializēšana.."); // Inicializējiet PulseOximeter instanci // Kļūdas parasti ir nepareizas I2C elektroinstalācijas, trūkst barošanas avota // vai nepareizas mērķa mikroshēmas, ja (! Pox.begin ()) {Serial.println ("FAILED"); priekš(;;); } else {Serial.println ("VEIKSME"); } // IR gaismas diode noklusējuma strāva ir 50mA, un to varētu mainīt //, nekomentējot nākamo rindiņu. Pārbaudiet MAX30100_Registers.h visām // pieejamajām opcijām. bakas.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Reģistrējiet sitiena noteikšanas pox.setOnBeatDetectedCallback (onBeatDetected) atzvanīšanu; stopReadPOX (); }
Pēc visa tā max30100 tiek palaists ar vadītu strāvas iestatījumu. Dažādi pašreizējie iestatījumi ir pieejami arī MAX30100 galvenes failos dažādām konfigurācijām. Tiek sākta arī sirdsdarbības noteikšanas atzvanīšanas funkcija. Pēc visām šīm iestatījumiem oksimetra sensors tiek apturēts.
Jo cilpas funkciju, MQTT savienojums ir sākusies, un abonēšanas modelis ir jāpārbauda ik pēc 5000 milisekundēs. Šajā situācijā, ja slēdzis ir ieslēgts, tas sāk lasīt oksimetra sensoru un publicēt datus par sirdsdarbību un vērtību SPO2. Ja slēdzis ir izslēgts, tas pārtrauc visus ar pulsa oksimetra sensoru saistītos uzdevumus.
void loop () {MQTT_connect (); Adafruit_MQTT_Subscribe * abonements; 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 (("Sākot POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Funkcija, kas realizē uzdevumu. * / "pox_read", / * Uzdevuma teksta nosaukums. * / 1024 * 3, / * Steka izmērs vārdos, nevis baiti. * / NULL, / * Uzdevumā ievadītie parametri. * / 2, / * Prioritāte, ar kuru tiek izveidots uzdevums. * / & poxReadTaskHld); / * Izmanto, lai nodotu izveidotā uzdevuma rokturi. * /} kavēšanās (100); ja (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Funkcija, kas realizē uzdevumu. * / "mqttPub", / * Uzdevuma teksta nosaukums. * / 1024 * 3, / * Steka izmērs vārdos, nevis baiti. * / NULL, / * Parametrs nodots uzdevumam. * / 2, / * Prioritāte, ar kuru tiek izveidots uzdevums. * / & mqttPubTaskHld); / * Izmanto, lai nodotu izveidotā uzdevuma rokturi. * /}} else {Serial.print (("Pārtraucot POX…")); // Detele POX lasīt uzdevumu, ja (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Dzēst MQTT kroga uzdevumu, ja (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Izmanto, lai nodotu izveidotā uzdevuma rokturi. * /}} else {Serial.print (("Pārtraucot POX…")); // Detele POX lasīšanas uzdevums, ja (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Dzēst MQTT kroga uzdevumu, ja (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Izmanto, lai nodotu izveidotā uzdevuma rokturi. * /}} else {Serial.print (("Pārtraucot POX…")); // Detele POX lasīšanas uzdevums, ja (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Dzēst MQTT kroga uzdevumu, ja (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT bāzes pulsa oksimetra demonstrēšana
Ķēde ir pareizi pievienota paneļa panelī, un tālāk norādītā programma tiek augšupielādēta ESP32. Pārliecinieties, ka kodā esat attiecīgi mainījis Wi-Fi un Adafruit akreditācijas datus, lai tas darbotos jums.
Pēc savienojuma izveidošanas ar WiFi un Adafruit IO serveri tas sāka darboties kā paredzēts.
Kā redzam, ka SPO2 līmenis uzrāda 96%, bet sirdsdarbība - no 78 līdz 81 bitam minūtē. Tas arī nodrošina laiku, kad dati tiek tverti.
Kā redzams iepriekš redzamajā attēlā, slēdzis ir izslēgts un dati ir 0. Pilns projekta darba video ir atrodams arī šīs lapas apakšdaļā.
Ceru, ka jums patika raksts un uzzinājāt kaut ko noderīgu. Ja jums ir kādi jautājumi, lūdzu, atstājiet tos komentāru sadaļā zemāk vai ievietojiet tos mūsu forumos.