- MAX30100 Sensor
- Mga Kinakailangan na Bahagi
- Ang pagitan ng MAX30100 Oximeter na may ESP32
- Adafruit IO na may ESP32 para sa Heart Rate Monitoring
- Paliwanag sa Code
- Pagpapakita ng IoT Batay sa Pulse Oximeter
Ang pulse oximetry ay isang malawakang ginagamit na instrumento sa pagsukat ng medisina at ito ay isang hindi nagsasalakay at walang sakit na pagsubok na sumusukat sa antas ng saturation ng oxygen sa aming dugo na madaling makakita ng maliliit na pagbabago sa oxygen. Sa kasalukuyang sitwasyon ng Covid-19, naging mahalaga na subaybayan ang antas ng oxygen ng maraming pasyente nang sabay-sabay nang hindi nakikipag-ugnay sa pasyente.
Kaya, sa proyektong ito, bumubuo kami ng isang pulse oximeter gamit ang MAX30100 Pulse oximeter at ESP32 na susubaybayan ang antas ng Blood Oxygen at ipadala ang data sa pamamagitan ng internet sa pamamagitan ng pagkonekta sa isang Wi-Fi network. Sa ganitong paraan, masusubaybayan namin ang maramihang mga pasyente nang malayuan sa pamamagitan ng pagpapanatili ng panlipunang distansya sa mga pasyente. Ang nakuha na data ay ipapakita bilang isang graph na ginagawang mas madali para sa pagsubaybay at pag-aralan ang kalagayan ng pasyente. Dati, nakabuo rin kami ng iba pang mga monitor ng rate ng puso na gumagamit ng mga sensor ng pulso. At kung interesado ka sa iba pang mga proyekto na nauugnay sa Covid-19, maaari mong suriin ang thermometer ng Human body, Smart IR Thermometer para sa pagsubaybay sa lagnat, at scanner ng Temperatura sa Wall-Mount na itinayo namin nang mas maaga.
Maliban sa aplikasyon ng Covid-19, ang proyektong ito ay maaari ding malawakang magamit sa talamak na nakahahadlang na sakit sa baga (COPD), hika, pulmonya, kanser sa baga, anemia, atake sa puso o pagkabigo sa puso, o sa mga depekto sa likas na puso.
Tandaan na, ang sensor na ginamit sa proyektong ito ay hindi na-rate ng medikal, at ang proyekto ay hindi nasubok para sa mga nabigo na patunay na application. Palaging gumamit ng isang medikal na na-rate na pulso oximeter upang matukoy ang antas ng pulso at oxygen ng pasyente at talakayin ito sa isang medikal na nagsasanay. Ang proyektong tinalakay dito ay para lamang sa mga hangaring pang-edukasyon.
MAX30100 Sensor
Ang MAX30100 sensor ay isinama sa pulse oximetry at heart rate monitor module. Nakikipag-usap ito sa linya ng data ng I2C at nagbibigay ng impormasyon ng SpO2 at Pulse sa host unit ng microcontroller. Gumagamit ito ng mga photodetector, mga elemento ng salamin sa mata kung saan ang pula, berde na IR LED ay binabago ang mga LED pulso. Ang kasalukuyang LED ay mai-configure mula 0 hanggang 50mA. Ipinapakita ang imahe sa ibaba ng MAX30100 sensor.
Gumagana ang module ng sensor sa itaas na may 1.8V hanggang sa saklaw na 5.5V. Ang mga resistors na pull-up para sa mga pin ng I2C ay kasama sa module.
Mga Kinakailangan na Bahagi
- Isang koneksyon sa WiFi
- ESP32
- MAX30100 Sensor
- Adafruit IO user id at isang pasadyang nilikha na dashboard (Gagawin ito nang higit pa)
- 5V sapat na yunit ng supply ng kuryente na may rate na kasalukuyang hindi bababa sa 1A
- USB cable Micro USB sa USBA
- Isang PC na may Arduino IDE na may kapaligiran sa programa ng ESP32.
Ang pagitan ng MAX30100 Oximeter na may ESP32
Ang kumpletong diagram ng circuit para sa MAX30100 na may ESP32 ay ibinibigay sa ibaba.
Ito ay isang napaka-simpleng eskematiko. Ang pin 21 at 22 ng ESP32 devkit C ay konektado sa pulse oximeter sensor MAX30100 na may mga SDA at SCL na pin. Ang Oximeter ay pinalakas din ng 5V pin sa ESP32 development board. Ginawa ko ang aking koneksyon gamit ang isang breadboard at pagkonekta ng mga wire at ang aking pag-set up ng pagsubok ay ganito-
Adafruit IO na may ESP32 para sa Heart Rate Monitoring
Nakagawa na kami dati ng maraming mga proyekto ng Adafruit IO para sa iba't ibang mga aplikasyon ng IoT. Ang Adafruit IO ay isang mahusay na platform kung saan maaaring lumikha ng isang pasadyang dashboard. Upang likhain ang pasadyang dashboard para sa IoT batay sa Pulse-Oximeter sensor, gamitin ang mga hakbang sa ibaba-
Hakbang 1: Unang mag-sign up sa adafruit IO matapos ibigay ang Fist name, apelyido, email address, pangalan ng gumagamit, at ang password.
Hakbang 2: Magbubukas ang blangko na window ng dashboard matapos ang proseso ng pag-sign in. Sa segment na ito, kakailanganin naming lumikha ng isang dashboard upang maipakita ang data sa iba't ibang mga paraan. Kaya, oras na upang lumikha ng bagong dashboard at ibigay ang pangalan ng dashboard at ang paglalarawan.
Hakbang 3: Matapos punan ang form sa itaas, oras na upang lumikha ng seksyon ng grap at kontrol para sa sensor.
Piliin ang switch block. Kakailanganin ito para sa pag-ON o pag-OFF ng sensor ng pulse-oximeter.
Hakbang 4: Isulat ang pangalan ng block. Tulad ng nakikita natin sa imahe sa itaas, ang pagpapaandar ng toggle ay magbibigay ng dalawang mga estado, ON at OFF. Sa parehong proseso, piliin ang block ng grap.
Ang seksyon ng grap na ito ay kailangang mapili nang dalawang beses habang ipapakita ang dalawang mga graphic, Little heart at SpO2. Ang parehong mga seksyon ay nilikha. Tulad ng nakikita natin, napili namin ang lahat ng pag-andar ng pag-input at output.
Hakbang 5: Ang susunod at pangwakas na hakbang ay ang magkaroon ng adafruit key. Tulad ng nakikita natin, nakukuha namin ang adafruit key at kailangan itong maidagdag sa code.
Ang Adafruit IO ay na-configure na ngayon. Panahon na upang ihanda ang hardware at lumikha ng firmware para sa proyektong ito.
Paliwanag sa Code
Gumagamit ang code na ito ng maraming mga aklatan at mahalaga ang lahat. Ang mga aklatan ay MAX30100 Pulse oximeter sensor library, Wire.h para sa I2C, WiFi.h para sa suporta na nauugnay sa WiFi sa ESP32, Adafruit MQTT , at MQTT Client library. Ang kumpletong programa ay matatagpuan sa ilalim ng pahinang ito.
Ang mga aklatan na nabanggit sa itaas ay kasama sa simula ng code.
# isama
Ang susunod na dalawang kahulugan ay ang WLAN SSID at WLAN Password. Ito ay dapat na eksakto at gagamitin ito ng ESP32 upang kumonekta sa WiFi network.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Susunod, tinukoy namin ang mga kahulugan ng 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"
Ang rate ng pag-update ay mag-a-update ng data sa bawat 5 Segundo, ang server ay io.adafruit.com na may isang port ng server ng 1883. Ang username at password ay ang nabuong username at password mula sa dashboard ng adafruit IO. Magkaiba ito para sa lahat at kailangang mabuo tulad ng inilarawan sa seksyon ng pag-set up ng adafruit.
Ang mga port ng I2C ay tinukoy pagkatapos na ipinakita sa eskematiko.
#define I2C_SDA 21 #define I2C_SCL 22
Susunod, tatlong variable ang ginagamit upang maiimbak ang huling ulat at ang halagang bpm at spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
Gumagana ang MQTT sa isang modelo ng pub-sub (i-publish at mag-subscribe). Sa modelo ng trabaho na ito, ang aparato na nagsusumite ng data sa server ng Adafruit ay mananatili sa mode na i-publish kung saan nag-subscribe ang server ng Adafruit IO sa parehong mga puntos ng data. Sa ganitong epekto, tuwing nag-publish ang aparato ng anumang bagong data, ang server, dahil naka-subscribe ito sa pareho, ay tumatanggap ng data at nagbibigay ng kinakailangang pagkilos.
Ang parehong bagay ay nangyayari kapag nai-publish ng server ang data, at nag-subscribe ang aparato dito. Sa aming application, ang aparato ay nagpapadala ng data ng SPO2 at BPM sa server, kaya't nai-publish nito ang pareho at natatanggap nito ang ON-OFF na estado mula sa server, kaya't nag-subscribe sa isang ito. Ang bagay na ito ay na-configure sa snippet ng code na inilarawan sa ibaba-
Client ng 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"); // Pansinin ang mga landas ng MQTT para sa AIO sundin ang form:
Sa pag- andar ng pag- setup , sinisimulan namin ang I2C, kinokonekta ang WiFi sa paunang natukoy na SSID at Password, at sinisimulan ang proseso ng subscription ng MQTT para sa estado ng paglipat (Ang pindutan ng switch ay nilikha sa dashboard ng Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); habang (WiFi.status ()! = WL_CONNected) {pagkaantala (500); Serial.print ("."); } Serial.println (); Serial.println ("Konektado sa WiFi"); Serial.println ("IP address:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Initializing pulse oximeter.."); // Initialize the PulseOximeter instance // Ang mga pagkabigo sa pangkalahatan ay sanhi ng isang hindi wastong mga kable ng I2C, nawawalang supply ng kuryente // o maling target chip kung (! Pox.begin ()) {Serial.println ("FAILED"); para sa (;;); } iba pa {Serial.println ("TAGUMPAY"); } // Ang default na kasalukuyang para sa IR LED ay 50mA at maaari itong mabago // sa pamamagitan ng pag-a-kompromiso sa sumusunod na linya. Suriin ang MAX30100_Registers.h para sa lahat ng // magagamit na mga pagpipilian. poxsetIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Magrehistro ng isang callback para sa beat detection pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Matapos ang lahat ng ito, ang max30100 ay nagsimula sa isang nangungunang kasalukuyang setting. Ang iba't ibang mga kasalukuyang setting ay magagamit din sa MAX30100 header file para sa iba't ibang mga pagsasaayos. Sinimulan din ang isang function ng call back detection ng call back. Matapos ang lahat ng mga pag-set up na ito, ihinto ang sensor ng oximeter.
Sa pagpapaandar ng loop , ang koneksyon ng MQTT ay nagsimula at ang modelo ng subscription ay naka-check sa bawat 5000 milliseconds. Sa sitwasyong ito, kung nakabukas ang switch, nagsisimula itong basahin ang sensor ng oximeter at mai-publish ang data ng Heartbeat at ang halagang SPO2. Kung naka-off ang switch, sinuspinde nito ang lahat ng mga gawain na nauugnay sa sensor ng pulse oximeter.
void loop () {MQTT_connect (); Adafruit_MQTT_Subscribe * subscription; habang ((subscription = mqtt.readSubscription (5000))) {kung (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); kung (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Simula POX…")); startReadPOX (); BaseType_t xReturned; kung (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Function na nagpapatupad ng gawain. * / "pox_read", / * Pangalan ng teksto para sa gawain. * / 1024 * 3, / * Laki ng stack sa mga salita, hindi bytes. * / NULL, / * Parameter na ipinasa sa gawain. * / 2, / * Priority kung saan nilikha ang gawain. * / & poxReadTaskHld); / * Ginamit upang maipasa ang hawakan ng nilikha na gawain. * /} pagkaantala (100); kung (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Pag-andar na nagpapatupad ng gawain. * / "mqttPub", / * Pangalan ng teksto para sa gawain. * / 1024 * 3, / * Laki ng stack sa mga salita, hindi byte. * / NULL, / * Parameter na ipinasa sa gawain. * / 2, / * Priority kung saan nilikha ang gawain. * / & mqttPubTaskHld); / * Ginamit upang maipasa ang hawakan ng nilikha na gawain. * /}} iba pa {Serial.print (("Stoping POX…")); // Detele POX basahin ang gawain kung (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Tanggalin ang MQTT Pub Task kung (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Ginamit upang maipasa ang hawakan ng nilikha na gawain. * /}} iba pa {Serial.print (("Stoping POX…")); // Detele POX basahin ang gawain kung (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Tanggalin ang MQTT Pub Task kung (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Ginamit upang maipasa ang hawakan ng nilikha na gawain. * /}} iba pa {Serial.print (("Stoping POX…")); // Detele POX basahin ang gawain kung (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Tanggalin ang MQTT Pub Task kung (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Pagpapakita ng IoT Batay sa Pulse Oximeter
Ang circuit ay konektado nang maayos sa isang breadboard at ang program na ibinigay sa ibaba ay na-upload sa ESP32. Tiyaking binago mo ang mga kredensyal ng Wi-Fi at Adafruit nang naaayon sa iyong code upang ito ay gumana para sa iyo.
Matapos ang koneksyon sa WiFi at Adafruit IO server, nagsimula itong gumana tulad ng inaasahan.
Tulad ng nakikita natin na ang antas ng SPO2 ay nagpapakita ng 96% at ang tibok ng puso ay nagpapakita ng 78 hanggang 81 na mga piraso bawat minuto. Nagbibigay din ito ng oras kung kailan nakuha ang data.
Tulad ng nakikita natin sa imahe sa itaas, naka-off ang switch at ang data ay 0. Ang kumpletong gumaganang video ng proyekto ay maaari ding matagpuan sa ilalim ng pahinang ito.
Inaasahan kong nasiyahan ka sa artikulo at natutunan ang isang bagay na kapaki-pakinabang, kung mayroon kang anumang mga katanungan, mangyaring iwanan ang mga ito sa seksyon ng komento sa ibaba o i-post ang mga ito sa aming mga forum.