- Sensor MAX30100
- Komponen yang Diperlukan
- Menghubungkan MAX30100 Oximeter dengan ESP32
- Adafruit IO dengan ESP32 untuk Pemantauan Denyut Jantung
- Penjelasan Kode
- Demonstrasi Pulse Oximeter Berbasis IoT
Pulse oximetry adalah instrumen pengukuran medis yang banyak digunakan dan merupakan tes non-invasif dan tanpa rasa sakit yang mengukur tingkat saturasi oksigen dalam darah kita yang dapat dengan mudah mendeteksi perubahan kecil pada oksigen. Dalam situasi Covid-19 saat ini, menjadi penting untuk melacak tingkat oksigen beberapa pasien pada saat yang sama dari jarak jauh tanpa melakukan kontak dengan pasien.
Jadi, dalam proyek ini, kami membangun oksimeter pulsa menggunakan MAX30100 Pulse oximeter dan ESP32 yang akan melacak level Oksigen Darah dan mengirimkan data melalui internet dengan menghubungkan ke jaringan Wi-Fi. Dengan cara ini, kami dapat memantau banyak pasien dari jarak jauh dengan menjaga jarak sosial dengan pasien. Data yang diperoleh akan ditampilkan dalam bentuk grafik yang memudahkan pelacakan dan analisis kondisi pasien. Sebelumnya, kami juga telah membangun monitor detak jantung lainnya dengan menggunakan sensor denyut. Dan jika Anda tertarik dengan proyek terkait Covid-19 lainnya, Anda dapat melihat termometer tubuh Manusia, Termometer IR Cerdas untuk pemantauan demam, dan pemindai Suhu Dudukan Dinding yang kami buat sebelumnya.
Selain aplikasi Covid-19, proyek ini juga dapat digunakan secara luas pada penyakit paru obstruktif kronik (PPOK), asma, pneumonia, kanker paru-paru, anemia, serangan jantung atau gagal jantung, atau pada kelainan jantung bawaan.
Perhatikan bahwa, sensor yang digunakan dalam proyek ini tidak dinilai secara medis, dan proyek tersebut tidak diuji untuk aplikasi anti-gagal. Selalu gunakan oksimeter denyut yang dinilai secara medis untuk menentukan denyut nadi dan tingkat oksigen pasien dan diskusikan dengan praktisi medis. Proyek yang dibahas di sini hanya untuk tujuan pendidikan.
Sensor MAX30100
Sensor MAX30100 terintegrasi dengan modul pulse oximetry dan monitor detak jantung. Ini berkomunikasi dengan jalur data I2C dan memberikan informasi SpO2 dan Pulse ke unit mikrokontroler host. Ia menggunakan photodetectors, elemen optik di mana merah, hijau IR LED memodulasi pulsa LED. Arus LED dapat dikonfigurasi dari 0 hingga 50mA. Gambar di bawah ini menunjukkan sensor MAX30100.
Modul sensor di atas bekerja dengan 1,8V hingga kisaran 5,5V. Resistor pull-up untuk pin I2C sudah termasuk dalam modul.
Komponen yang Diperlukan
- Koneksi WiFi
- ESP32
- Sensor MAX30100
- ID pengguna Adafruit IO dan dasbor yang dibuat khusus (Akan membuatnya lebih jauh)
- 5V unit catu daya yang memadai dengan arus pengenal minimal 1A
- Kabel USB Micro USB ke USBA
- PC dengan Arduino IDE dengan lingkungan pemrograman ESP32.
Menghubungkan MAX30100 Oximeter dengan ESP32
Diagram sirkuit lengkap untuk MAX30100 dengan ESP32 diberikan di bawah ini.
Ini adalah skema yang sangat sederhana. Pin 21 dan 22 dari ESP32 devkit C dihubungkan dengan sensor pulse oximeter MAX30100 dengan pin SDA dan SCL. Oximeter juga didukung oleh pin 5V pada papan pengembangan ESP32. Saya membuat koneksi saya menggunakan papan tempat memotong roti dan menghubungkan kabel dan pengaturan pengujian saya terlihat seperti ini-
Adafruit IO dengan ESP32 untuk Pemantauan Denyut Jantung
Kami sebelumnya telah membangun banyak proyek Adafruit IO untuk berbagai aplikasi IoT. Adafruit IO adalah platform luar biasa tempat dasbor khusus dapat dibuat. Untuk membuat dasbor kustom untuk sensor Pulse-Oximeter berbasis IoT, gunakan langkah-langkah di bawah ini-
Langkah 1: Pertama daftar di adafruit IO setelah memberikan nama Fist, nama belakang, alamat email, nama pengguna, dan kata sandi.
Langkah 2: Jendela dasbor kosong akan terbuka setelah proses masuk selesai. Pada segmen ini, kita perlu membuat dashboard untuk menampilkan data dengan berbagai cara. Jadi, sekarang saatnya membuat dasbor baru dan memberikan nama dasbor dan deskripsinya.
Langkah 3: Setelah mengisi form di atas, sekarang saatnya membuat grafik dan bagian kontrol untuk sensor.
Pilih blok pengalih. Ini akan diperlukan untuk MENGAKTIFKAN atau MEMATIKAN sensor oksimeter pulsa.
Langkah 4: Tuliskan nama blok. Seperti yang bisa kita lihat pada gambar di atas, fungsi sakelar akan menyediakan dua status, ON dan OFF. Dalam proses yang sama, pilih blok grafik.
Bagian grafik ini perlu dipilih dua kali karena dua grafik akan ditampilkan, Heart bit dan SpO2. Kedua bagian tersebut dibuat. Seperti yang bisa kita lihat, kita telah memilih semua fungsionalitas input dan output.
Langkah 5: Langkah selanjutnya dan terakhir adalah memiliki kunci adafruit. Seperti yang bisa kita lihat, kita mendapatkan kunci adafruit dan ini perlu ditambahkan ke dalam kode.
Adafruit IO sekarang dikonfigurasi. Saatnya menyiapkan perangkat keras dan membuat firmware untuk proyek ini.
Penjelasan Kode
Kode ini menggunakan banyak pustaka dan semuanya penting. Library tersebut adalah MAX30100 Pulse oximeter sensor library, Wire.h untuk I2C, WiFi.h untuk dukungan terkait WiFi di perpustakaan ESP32, Adafruit MQTT , dan MQTT Client . Program lengkapnya dapat ditemukan di bagian bawah halaman ini.
Pustaka yang disebutkan di atas disertakan di awal kode.
#include
Dua definisi berikutnya adalah WLAN SSID dan WLAN Password. Ini harus tepat dan akan digunakan oleh ESP32 untuk terhubung dengan jaringan WiFi.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Selanjutnya, kita mendefinisikan definisi Adafruit io.
#tentukan AIO_UPDATE_RATE_SEC 5 #tentukan AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Tingkat pembaruan akan memperbarui data setiap 5 Detik, server akan menjadi io.adafruit.com dengan port server 1883. Nama pengguna dan kata sandi akan menjadi nama pengguna dan kata sandi yang dihasilkan dari dasbor adafruit IO. Ini akan berbeda untuk semua dan perlu dibuat seperti yang dijelaskan di bagian penyiapan adafruit.
Porta I2C ditentukan setelahnya seperti yang ditunjukkan pada skema.
# Tentukan I2C_SDA 21 # Tentukan I2C_SCL 22
Selanjutnya, tiga variabel digunakan untuk menyimpan laporan terakhir dan nilai bpm dan spo2.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT bekerja dengan model pub-sub (terbitkan dan berlangganan). Dalam model kerja ini, perangkat yang mengirimkan data ke server Adafruit tetap dalam mode terbitkan di mana server Adafruit IO berlangganan ke titik data yang sama. Dalam efek seperti itu, setiap kali perangkat menerbitkan data baru, server, karena berlangganan ke data yang sama, menerima data dan menyediakan tindakan yang diperlukan.
Hal yang sama terjadi saat server mempublikasikan data, dan perangkat berlangganan. Dalam aplikasi kami, perangkat mengirimkan data SPO2 dan BPM ke server, sehingga menerbitkan data yang sama dan menerima status ON-OFF dari server, sehingga berlangganan yang satu ini. Hal ini dikonfigurasi dalam potongan kode yang dijelaskan di bawah-
Klien WiFiClient; Adafruit_MQTT_Client mqtt (& klien, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Perhatikan jalur MQTT untuk AIO ikuti formulir:
Dalam fungsi pengaturan , kami memulai I2C, menghubungkan WiFi dengan SSID dan Kata Sandi yang telah ditentukan, dan memulai proses berlangganan MQTT untuk status sakelar (Tombol sakelar dibuat di dasbor 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 tersambung"); Serial.println ("alamat IP:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("Menginisialisasi oksimeter pulsa.."); // Inisialisasi instance PulseOximeter // Kegagalan umumnya disebabkan oleh kabel I2C yang tidak tepat, catu daya tidak ada // atau chip target yang salah if (! Pox.begin ()) {Serial.println ("FAILED"); untuk(;;); } lain {Serial.println ("SUKSES"); } // Arus default untuk LED IR adalah 50mA dan dapat diubah // dengan menghilangkan komentar pada baris berikut. Periksa MAX30100_Registers.h untuk semua // opsi yang tersedia. cacar.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Daftarkan callback untuk deteksi ketukan pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
Setelah semua ini, max30100 dimulai dengan pengaturan arus led. Pengaturan yang berbeda saat ini juga tersedia di file header MAX30100 untuk konfigurasi yang berbeda. Fungsi panggilan balik deteksi detak jantung juga dimulai. Setelah semua pengaturan ini, sensor oksimeter dihentikan.
Dalam fungsi loop , koneksi MQTT dimulai dan model langganan diperiksa setiap 5000 milidetik. Dalam situasi ini, jika sakelar dihidupkan, ia mulai membaca sensor oksimeter dan menerbitkan data Detak Jantung dan nilai SPO2. Jika sakelar dimatikan, itu menangguhkan semua tugas yang terkait dengan sensor oksimeter pulsa.
void loop () {MQTT_connect (); Berlangganan 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, / * Fungsi yang mengimplementasikan tugas. * / "pox_read", / * Nama teks untuk tugas. * / 1024 * 3, / * Ukuran tumpukan dalam kata, bukan bytes. * / NULL, / * Parameter yang diteruskan ke tugas. * / 2, / * Prioritas saat tugas dibuat. * / & poxReadTaskHld); / * Digunakan untuk membagikan pegangan tugas yang dibuat. * /} penundaan (100); jika (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Fungsi yang mengimplementasikan tugas. * / "mqttPub", / * Nama teks untuk tugas. * / 1024 * 3, / * Ukuran tumpukan dalam kata, bukan byte. * / NULL, / * Parameter diteruskan ke tugas. * / 2, / * Prioritas saat tugas dibuat. * / & mqttPubTaskHld); / * Digunakan untuk membagikan pegangan tugas yang dibuat. * /}} lain {Serial.print (("Stoping POX…")); // Detele POX membaca tugas if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Hapus Tugas Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Digunakan untuk membagikan pegangan tugas yang dibuat. * /}} lain {Serial.print (("Stoping POX…")); // Detele POX membaca tugas if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Hapus Tugas Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Digunakan untuk membagikan pegangan tugas yang dibuat. * /}} lain {Serial.print (("Stoping POX…")); // Detele POX membaca tugas if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Hapus Tugas Pub MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Demonstrasi Pulse Oximeter Berbasis IoT
Sirkuit terhubung dengan benar di papan tempat memotong roti dan program yang diberikan di bawah ini diunggah ke ESP32. Pastikan Anda mengubah kredensial Wi-Fi dan Adafruit sesuai dengan kode Anda agar berfungsi untuk Anda.
Setelah terkoneksi dengan WiFi dan server Adafruit IO, itu mulai berfungsi seperti yang diharapkan.
Seperti yang dapat kita lihat bahwa level SPO2 menunjukkan 96% dan detak jantung menunjukkan 78 hingga 81 bit per menit. Ini juga menyediakan waktu saat data diambil.
Seperti yang dapat kita lihat pada gambar di atas, sakelar dimatikan dan datanya 0. Video kerja lengkap dari proyek ini juga dapat ditemukan di bagian bawah halaman ini.
Semoga Anda menikmati artikel ini dan mempelajari sesuatu yang bermanfaat, jika Anda memiliki pertanyaan, silakan tinggalkan di bagian komentar di bawah atau posting di forum kami.