- Sensor MAX30100
- Komponen yang Diperlukan
- Memadankan MAX30100 Oksimeter dengan ESP32
- Adafruit IO dengan ESP32 untuk Pemantauan Denyutan Jantung
- Penjelasan Kod
- Demonstrasi Pulse Oksimeter Berasaskan IoT
Pulse oximetry adalah alat pengukuran perubatan yang banyak digunakan dan ini adalah ujian tanpa invasif dan tanpa rasa sakit yang mengukur tahap ketepuan oksigen dalam darah kita yang dapat dengan mudah mengesan perubahan kecil dalam oksigen. Dalam keadaan Covid-19 sekarang, menjadi penting untuk mengesan tahap oksigen beberapa pesakit pada masa yang sama dari jauh tanpa bersentuhan dengan pesakit.
Oleh itu, dalam projek ini, kami membina pulse oximeter menggunakan MAX30100 Pulse oximeter dan ESP32 yang akan mengesan tahap Oksigen Darah dan menghantar data melalui internet dengan menyambung ke rangkaian Wi-Fi. Dengan cara ini, kita dapat memantau beberapa pesakit dari jarak jauh dengan menjaga jarak sosial dengan pesakit. Data yang diperoleh akan ditunjukkan sebagai grafik yang memudahkan untuk mengesan dan menganalisis keadaan pesakit. Sebelum ini, kami juga telah membina monitor denyut jantung yang lain menggunakan sensor nadi. Dan jika anda berminat dengan projek lain yang berkaitan dengan Covid-19, anda boleh melihat termometer badan manusia, Termometer IR Pintar untuk pemantauan demam, dan pengimbas Suhu Dinding-Gunung yang kami bina lebih awal.
Selain aplikasi Covid-19, projek ini juga dapat digunakan secara meluas dalam penyakit paru-paru obstruktif kronik (COPD), asma, radang paru-paru, barah paru-paru, anemia, serangan jantung atau kegagalan jantung, atau dalam kecacatan jantung kongenital.
Perhatikan bahawa, sensor yang digunakan dalam projek ini tidak dinilai secara perubatan, dan projek tersebut tidak diuji untuk aplikasi kalis kegagalan. Sentiasa gunakan pulse oximeter yang diberi nilai perubatan untuk menentukan tahap nadi dan oksigen pesakit dan membincangkannya dengan pengamal perubatan. Projek yang dibincangkan di sini hanya untuk tujuan pendidikan.
Sensor MAX30100
Sensor MAX30100 adalah modul pemantauan nadi oksimetri dan denyut jantung. Ia berkomunikasi dengan garis data I2C dan memberikan maklumat SpO2 dan Pulse ke unit mikrokontroler tuan rumah. Ia menggunakan photodetectors, elemen optik di mana LED IR merah dan hijau memodulasi denyutan LED. Arus LED boleh dikonfigurasi dari 0 hingga 50mA. Gambar di bawah menunjukkan sensor MAX30100.
Modul sensor di atas berfungsi dengan jarak 1.8V hingga 5.5V. Perintang penarik untuk pin I2C disertakan dalam modul.
Komponen yang Diperlukan
- Sambungan WiFi
- ESP32
- Sensor MAX30100
- Id pengguna Adafruit IO dan papan pemuka yang dibuat khas (Akan membuatnya lebih jauh)
- Unit bekalan kuasa 5V yang mencukupi dengan arus undian sekurang-kurangnya 1A
- Kabel USB Mikro USB ke USBA
- PC dengan Arduino IDE dengan persekitaran pengaturcaraan ESP32.
Memadankan MAX30100 Oksimeter dengan ESP32
Gambarajah litar lengkap untuk MAX30100 dengan ESP32 diberikan di bawah.
Ini adalah skema yang sangat mudah. Pin 21 dan 22 dari ESP32 devkit C dihubungkan dengan sensor pulse oximeter MAX30100 dengan pin SDA dan SCL. Oximeter juga dikuasakan oleh pin 5V pada papan pengembangan ESP32. Saya membuat sambungan saya menggunakan papan roti dan wayar penyambung dan persediaan ujian saya kelihatan seperti ini-
Adafruit IO dengan ESP32 untuk Pemantauan Denyutan Jantung
Kami sebelum ini telah membina banyak projek Adafruit IO untuk aplikasi IoT yang berbeza. Adafruit IO adalah platform yang sangat baik di mana papan pemuka tersuai dapat dibuat. Untuk membuat papan pemuka khusus untuk sensor Pulse-Oximeter berdasarkan IoT, gunakan langkah-langkah di bawah-
Langkah 1: Daftar pertama di Adafruit IO setelah memberikan nama Fist, nama belakang, alamat e-mel, nama pengguna, dan kata laluan.
Langkah 2: Tetingkap papan pemuka kosong akan dibuka setelah proses log masuk selesai. Dalam segmen ini, kita perlu membuat papan pemuka untuk menunjukkan data dengan pelbagai cara. Oleh itu, sudah tiba masanya untuk membuat papan pemuka baru dan memberikan nama papan pemuka dan keterangannya.
Langkah 3: Setelah mengisi borang di atas, sudah tiba masanya untuk membuat grafik dan bahagian kawalan untuk sensor.
Pilih blok suis. Ia diperlukan untuk menghidupkan atau mematikan sensor denyut-oksimeter.
Langkah 4: Tuliskan nama blok. Seperti yang dapat kita lihat pada gambar di atas, fungsi togol akan memberikan dua keadaan, ON dan OFF. Dalam proses yang sama, pilih blok grafik.
Bahagian grafik ini perlu dipilih dua kali kerana dua graf akan dipaparkan, Heart bit dan SpO2. Kedua-dua bahagian dibuat. Seperti yang dapat kita lihat, kita telah memilih semua fungsi input dan output.
Langkah 5: Langkah seterusnya dan terakhir adalah mempunyai kunci adafruit. Seperti yang kita lihat, kita mendapat kunci adafruit dan ini perlu ditambah dalam kod.
Adafruit IO kini dikonfigurasikan. Sudah tiba masanya untuk menyiapkan perkakasan dan membuat firmware untuk projek ini.
Penjelasan Kod
Kod ini menggunakan banyak perpustakaan dan semuanya penting. Perpustakaan tersebut adalah perpustakaan sensor MAX30100 Pulse oximeter, Wire.h untuk I2C, WiFi.h untuk sokongan berkaitan WiFi di ESP32, Adafruit MQTT , dan perpustakaan Pelanggan MQTT . Program lengkap boleh didapati di bahagian bawah halaman ini.
Perpustakaan yang disebutkan di atas disertakan pada awal kod.
#sertakan
Dua definisi seterusnya adalah WLAN SSID dan WLAN Password. Ini pasti tepat dan ia akan digunakan oleh ESP32 untuk berhubung dengan rangkaian WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Seterusnya, kami menentukan definisi 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"
Kadar kemas kini akan mengemas kini data pada setiap 5 Detik, pelayan akan menjadi io.adafruit.com dengan port pelayan 1883. Nama pengguna dan kata laluan akan menjadi nama pengguna dan kata laluan yang dihasilkan dari papan pemuka adafruit IO. Ini akan berbeza untuk semua dan perlu dihasilkan seperti yang dijelaskan di bahagian penyediaan adafruit.
Port I2C didefinisikan selepas itu seperti yang ditunjukkan dalam skema.
#tentukan I2C_SDA 21 #tentukan I2C_SCL 22
Seterusnya, tiga pemboleh ubah digunakan untuk menyimpan laporan terakhir dan nilai bpm dan spo2.
uint32_t tsLastReport = 0; terapung bpm_dt = 0; terapung spo2_dt = 0;
MQTT berfungsi dengan model pub-sub (terbitkan dan langganan). Dalam model kerja ini, peranti yang menyerahkan data ke pelayan Adafruit tetap dalam mod penerbitan di mana pelayan Adafruit IO melanggan titik data yang sama. Oleh itu, setiap kali peranti menerbitkan data baru, pelayan, kerana dilanggannya, menerima data dan memberikan tindakan yang diperlukan.
Perkara yang sama berlaku semasa pelayan menerbitkan data, dan peranti melanggannya. Dalam aplikasi kami, peranti menghantar data SPO2 dan BPM ke pelayan, sehingga menerbitkannya sama dan menerima keadaan ON-OFF dari pelayan, sehingga melanggan yang satu ini. Perkara ini dikonfigurasikan dalam coretan kod yang dinyatakan di bawah-
Pelanggan WiFiClient; Adafruit_MQTT_Mqtt pelanggan (& pelanggan, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feed / switch"); // Perhatikan jalur MQTT untuk AIO mengikuti borang:
Dalam fungsi penyediaan , kita memulai I2C, menghubungkan WiFi dengan SSID dan Kata Laluan yang telah ditentukan, dan memulakan proses langganan MQTT untuk keadaan suis (Butang suis yang dibuat di papan pemuka Adafruit IO).
persediaan tidak sah () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (500); Cetakan bersiri ("."); } Bersiri.println (); Serial.println ("WiFi disambungkan"); Serial.println ("Alamat IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Memulakan pulse oximeter.."); // Memulakan contoh PulseOximeter // Kegagalan umumnya disebabkan oleh pendawaian I2C yang tidak betul, kehilangan bekalan kuasa // atau cip sasaran yang salah jika (! Pox.begin ()) {Serial.println ("GAGAL"); untuk (;;); } lain {Serial.println ("KEJAYAAN"); } // Arus lalai untuk LED IR adalah 50mA dan boleh diubah // dengan melepaskan baris berikut. Periksa MAX30100_Registers.h untuk semua // pilihan yang ada. cacar air.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Daftar panggilan balik untuk deteksi rentak pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Setelah semua ini, max30100 dimulakan dengan tetapan semasa yang dipimpin. Tetapan semasa yang berbeza juga tersedia dalam fail header MAX30100 untuk konfigurasi yang berbeza. Fungsi panggilan balik pengesanan degupan jantung juga dimulakan. Selepas semua persediaan ini, sensor oksimeter dihentikan.
Dalam fungsi gelung , sambungan MQTT dimulakan dan model langganan diperiksa setiap 5000 milisaat. Dalam keadaan ini, jika suis dihidupkan, ia mula membaca sensor oksimeter dan menerbitkan data Denyut Jantung dan nilai SPO2. Sekiranya suis dimatikan, ia akan menghentikan semua tugas yang berkaitan dengan sensor pulse oximeter.
gelung kosong () {MQTT_connect (); Adafruit_MQTT_Langgan * langganan; while ((langganan = mqtt.readSubscription (5000))) {if (langganan == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); jika (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Memulakan POX…")); mulaReadPOX (); BaseType_t xDikembalikan; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Fungsi yang melaksanakan tugas. * / "pox_read", / * Nama teks untuk tugas. * / 1024 * 3, / * Ukuran timbunan dalam kata-kata, bukan bytes. * / NULL, / * Parameter meneruskan tugas. * / 2, / * Keutamaan tugas dibuat. * / & poxReadTaskHld); / * Digunakan untuk melepasi pegangan tugas yang dibuat. * /} kelewatan (100); jika (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Fungsi yang melaksanakan tugas. * / "mqttPub", / * Nama teks untuk tugas. * / 1024 * 3, / * Ukuran timbunan dalam perkataan, bukan bait. * / NULL, / * Parameter menyerahkan tugas. * / 2, / * Keutamaan tugas dibuat. * / & mqttPubTaskHld); / * Digunakan untuk melepasi pegangan tugas yang dibuat. * /}} yang lain {Serial.print (("Stoping POX…")); // Tugas baca Detele POX jika (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Padamkan Tugas Pub MQTT jika (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } berhentiReadPOX (); }}}}/ * Digunakan untuk melepasi pegangan tugas yang dibuat. * /}} lain {Serial.print (("Menghentikan POX…")); // Tugas baca Detele POX jika (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Padamkan Tugas Pub MQTT jika (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } berhentiReadPOX (); }}}}/ * Digunakan untuk melepasi pegangan tugas yang dibuat. * /}} lain {Serial.print (("Menghentikan POX…")); // Detele POX baca tugas jika (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Padamkan Tugas Pub MQTT jika (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } berhentiReadPOX (); }}}}
Demonstrasi Pulse Oksimeter Berasaskan IoT
Litar dihubungkan dengan betul di papan roti dan program yang diberikan di bawah dimuat naik ke ESP32. Pastikan anda menukar kelayakan Wi-Fi dan Adafruit dalam kod anda untuk menjadikannya sesuai untuk anda.
Selepas sambungan dengan pelayan WiFi dan Adafruit IO, ia mula berfungsi seperti yang diharapkan.
Seperti yang kita lihat bahawa tahap SPO2 menunjukkan 96% dan degupan jantung menunjukkan 78 hingga 81 bit per minit. Ini juga memberikan waktu ketika data ditangkap.
Seperti yang dapat kita lihat pada gambar di atas, suis dimatikan dan datanya 0. Video kerja lengkap projek juga boleh didapati di bahagian bawah halaman ini.
Harap anda menikmati artikel ini dan mempelajari sesuatu yang berguna, jika anda mempunyai sebarang pertanyaan, sila tinggalkan di bahagian komen di bawah atau hantar di forum kami.