- MAX30100 Sensör
- Gerekli Bileşenler
- MAX30100 Oksimetre ile ESP32 arasında arayüz
- Kalp Atış Hızı İzleme için ESP32'li Adafruit IO
- Kod Açıklama
- IoT Tabanlı Nabız Oksimetresi Gösterimi
Nabız oksimetresi, yaygın olarak kullanılan bir tıbbi ölçüm aracıdır ve kanımızdaki oksijen satürasyon seviyesini ölçen, oksijendeki küçük değişiklikleri kolayca tespit edebilen, non-invaziv ve ağrısız bir testtir. Mevcut Covid-19 durumunda, hasta ile temas kurmadan aynı anda birden fazla hastanın oksijen seviyesini uzaktan takip etmek önemli hale geldi.
Bu nedenle, bu projede, Kan Oksijen seviyesini takip edecek ve verileri bir Wi-Fi ağına bağlanarak internet üzerinden gönderecek olan MAX30100 Pulse oksimetre ve ESP32 kullanarak bir nabız oksimetresi oluşturuyoruz. Bu şekilde, hastalarla sosyal mesafeyi koruyarak birden fazla hastayı uzaktan izleyebiliriz. Elde edilen veriler, hastanın durumunun izlenmesini ve analiz edilmesini kolaylaştıran bir grafik olarak gösterilecektir. Daha önce, nabız sensörlerini kullanarak başka kalp atış hızı monitörleri de yaptık. Ve Covid-19 ile ilgili diğer projelerle ilgileniyorsanız, İnsan vücudu termometresini, ateş izleme için Akıllı IR Termometresini ve daha önce oluşturduğumuz Duvara Montaj Sıcaklığı tarayıcısını inceleyebilirsiniz.
Covid-19 uygulaması dışında bu proje, kronik obstrüktif akciğer hastalığı (KOAH), astım, pnömoni, akciğer kanseri, anemi, kalp krizi veya kalp yetmezliği veya doğuştan kalp kusurlarında da yaygın olarak kullanılabilir.
Bu projede kullanılan sensörün tıbbi olarak derecelendirilmediğini ve projenin arızaya dayanıklı uygulamalar için test edilmediğini unutmayın. Hastanın nabız ve oksijen seviyesini belirlemek için her zaman tıbbi olarak derecelendirilmiş bir nabız oksimetresi kullanın ve bunu bir tıp doktoru ile görüşün. Burada tartışılan proje sadece eğitim amaçlıdır.
MAX30100 Sensör
MAX30100 sensörü, entegre nabız oksimetresi ve kalp atış hızı izleme modülüdür. I2C veri hattı ile iletişim kurar ve SpO2 ve Nabız bilgilerini ana mikro denetleyici birimine sağlar. Kırmızı, yeşil IR LED'in LED darbelerini modüle ettiği fotodetektörler, optik elemanlar kullanır. LED akımı, 0 ila 50mA arasında yapılandırılabilir. Aşağıdaki görüntü MAX30100 sensörünü göstermektedir.
Yukarıdaki sensör modülü 1.8V ile 5.5V aralığında çalışır. I2C pinleri için kaldırma dirençleri modüle dahildir.
Gerekli Bileşenler
- WiFi bağlantısı
- ESP32
- MAX30100 Sensör
- Adafruit IO kullanıcı kimliği ve özel oluşturulmuş bir gösterge tablosu (Daha da ileri götürür)
- En az 1A anma akımına sahip 5V yeterli güç kaynağı ünitesi
- USB kablosu Mikro USB'den USBA'ya
- ESP32 programlama ortamına sahip Arduino IDE'ye sahip bir bilgisayar.
MAX30100 Oksimetre ile ESP32 arasında arayüz
ESP32 ile MAX30100 için tam devre şeması aşağıda verilmiştir.
Bu çok basit bir şematik. ESP32 devkit C'nin pimi 21 ve 22, SDA ve SCL pimleri ile nabız oksimetre sensörü MAX30100 ile bağlanır. Oksimetre ayrıca ESP32 geliştirme kartındaki 5V pini ile güçlendirilmiştir. Bağlantımı bir devre tahtası ve bağlantı kabloları kullanarak yaptım ve test kurulumum şöyle görünüyor:
Kalp Atış Hızı İzleme için ESP32'li Adafruit IO
Daha önce farklı IoT uygulamaları için birçok Adafruit IO projesi inşa etmiştik. Adafruit IO, özel bir gösterge panosunun oluşturulabileceği mükemmel bir platformdur. IoT tabanlı Nabız Oksimetre sensörü için özel gösterge tablosu oluşturmak için aşağıdaki adımları kullanın.
Adım 1: İlk adı, soyadını, e-posta adresini, kullanıcı adını ve şifreyi verdikten sonra adafruit IO'ya kaydolun.
Adım 2: Oturum açma işlemi tamamlandıktan sonra boş kontrol paneli penceresi açılacaktır. Bu segmentte, verileri çeşitli şekillerde göstermek için bir gösterge tablosu oluşturmamız gerekecek. Bu nedenle, yeni gösterge panosunu oluşturmanın ve gösterge tablosunun adını ve açıklamasını vermenin zamanı geldi.
Adım 3: Yukarıdaki formu doldurduktan sonra sıra sensör için grafik ve kontrol bölümü oluşturmaya gelir.
Anahtar bloğunu seçin. Nabız oksimetre sensörünü AÇMAK veya KAPATMAK için gerekli olacaktır.
Adım 4: Blok adını yazın. Yukarıdaki görüntüde görebileceğimiz gibi, geçiş işlevi AÇIK ve KAPALI olmak üzere iki durum sağlayacaktır. Aynı işlemde grafik bloğunu seçin.
Kalp biti ve SpO2 olmak üzere iki grafik görüntüleneceğinden, bu grafik bölümünün iki kez seçilmesi gerekir. Her iki bölüm de oluşturulur. Gördüğümüz gibi, tüm giriş ve çıkış işlevlerini seçtik.
Adım 5: Sonraki ve son adım, adafruit anahtarına sahip olmaktır. Gördüğümüz gibi adafruit anahtarını alıyoruz ve bunun koda eklenmesi gerekiyor.
Adafruit IO artık yapılandırılmıştır. Bu proje için donanımı hazırlamanın ve bellenimi oluşturmanın zamanı geldi.
Kod Açıklama
Bu kod birçok kitaplık kullanır ve hepsi önemlidir. Kütüphaneler MAX30100 Darbe oksimetre sensörü kütüphanesi vardır Wire.h I2C için, WiFi.h ESP32, WiFi ilgili destek için Adafruit MQTT ve MQTT Müşteri kütüphanesine. Programın tamamı bu sayfanın alt kısmında bulunabilir.
Yukarıda bahsedilen kütüphaneler kodun başında yer almaktadır.
#Dahil etmek
Sonraki iki tanım, WLAN SSID ve WLAN Parolasıdır. Bu kesin olmalı ve WiFi ağına bağlanmak için ESP32 tarafından kullanılacaktır.
#define WLAN_SSID "xxxxxxxxx" #define WLAN_PASS "2581xxxxx2"
Daha sonra Adafruit io tanımlarını tanımladık.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx" #define AIO_KEY "abcdefgh"
Güncelleme hızı verileri her 5 Saniyede bir güncelleyecektir, sunucu 1883 sunucu portu ile io.adafruit.com olacaktır. Kullanıcı adı ve şifre, adafruit IO panosundan oluşturulan kullanıcı adı ve şifre olacaktır. Hepsi için farklı olacaktır ve adafruit kurulum bölümünde açıklandığı gibi oluşturulması gerekir.
I2C portları, şemada gösterildiği gibi daha sonra tanımlanır.
#define I2C_SDA 21 #define I2C_SCL 22
Daha sonra, son raporu ve bpm ve spo2 değerini saklamak için üç değişken kullanılır.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT bir pub-sub modeliyle çalışır (yayınlayın ve abone olun). Bu iş modelinde verileri Adafruit sunucusuna ileten cihaz, Adafruit IO sunucusunun aynı veri noktalarına abone olduğu yayın modunda kalır. Böyle bir etkide, cihaz herhangi bir yeni veri yayınladığında, sunucu, abone olduğu için verileri alır ve gerekli eylemi sağlar.
Aynı şey, sunucu verileri yayınladığında ve cihaz buna abone olduğunda da olur. Uygulamamızda cihaz, SPO2 ve BPM verilerini sunucuya gönderir, böylece aynısını yayınlar ve sunucudan ON-OFF durumunu alır, böylece buna abone olur. Bu şey, aşağıda açıklanan kod pasajında yapılandırılmıştır.
WiFiClient istemcisi; Adafruit_MQTT_Client mqtt (& müşteri, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // AIO için MQTT yollarının şu formu izlediğine dikkat edin:
In kurulum fonksiyonu, biz, I2C başlayan önceden SSID ve Şifre ile WiFi bağlantı ve geçiş durumuna (Adafruit IO pano oluşturulan anahtar düğmesi) için MQTT abonelik süreci başlıyor.
geçersiz kurulum () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {gecikme (500); Seri.baskı ("."); } Serial.println (); Serial.println ("WiFi bağlı"); Serial.println ("IP adresi:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Seri.print ("Nabız oksimetresi başlatılıyor.."); // PulseOximeter örneğini başlatın // Hatalar genellikle hatalı bir I2C kablolaması, eksik güç kaynağı // veya yanlış hedef çipten kaynaklanır eğer (! Pox.begin ()) {Serial.println ("FAILED"); için(;;); } else {Serial.println ("BAŞARILI"); } // IR LED için varsayılan akım 50mA'dır ve aşağıdaki satırın açıklaması kaldırılarak // değiştirilebilir. Mevcut tüm seçenekler için MAX30100_Registers.h adresini kontrol edin. çiçek.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Vuruş algılama pox.setOnBeatDetectedCallback (onBeatDetected) için bir geri çağrı kaydedin; stopReadPOX (); }
Tüm bunlardan sonra max30100 bir led akım ayarı ile başlatılır. MAX30100 başlık dosyalarında farklı konfigürasyonlar için farklı mevcut ayarlar da mevcuttur. Kalp atışı algılama geri arama işlevi de başlatılır. Tüm bu kurulumlardan sonra oksimetre sensörü durdurulur.
In döngü fonksiyonu, MQTT bağlantısı başlatılır ve abonelik modeli içinde kontrol edilir her 5000 milisaniyede. Bu durumda, anahtar açılırsa, oksimetre sensörünü okumaya ve Kalp Atışı ve SPO2 değerinin verilerini yayınlamaya başlar. Anahtar kapatılırsa, nabız oksimetre sensörüyle ilgili tüm görevleri askıya alır.
geçersiz döngü () {MQTT_connect (); Adafruit_MQTT_Subscribe * aboneliği; while ((abonelik = 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 (("POX Başlatılıyor…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Görevi uygulayan işlev. * / "pox_read", / * Görev için metin adı. * / 1024 * 3, / * Sözcüklerde yığın boyutu, değil bytes. * / NULL, / * Göreve geçirilen parametre. * / 2, / * Görevin oluşturulduğu öncelik. * / & poxReadTaskHld); / * Oluşturulan görevin tanıtıcısını iletmek için kullanılır. * /} gecikme (100); eğer (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Görevi uygulayan işlev. * / "mqttPub", / * Görev için metin adı. * / 1024 * 3, / * Bayt değil, sözcüklerdeki yığın boyutu. * / NULL, / * Göreve geçen parametre. * / 2, / * Görevin oluşturulduğu öncelik. * / & mqttPubTaskHld); / * Oluşturulan görevin tanıtıcısını iletmek için kullanılır. * /}} else {Serial.print (("POX Durduruluyor…")); // Detele POX okuma görevi if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Eğer (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld) ise MQTT Pub Görevini silin; mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Oluşturulan görevin tanıtıcısını iletmek için kullanılır. * /}} else {Serial.print (("POX Durduruluyor…")); // Detele POX okuma görevi if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Eğer (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld) ise MQTT Pub Görevini silin; mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Oluşturulan görevin tanıtıcısını iletmek için kullanılır. * /}} else {Serial.print (("POX Durduruluyor…")); // Detele POX okuma görevi if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Eğer (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld) ise MQTT Pub Görevini silin; mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT Tabanlı Nabız Oksimetresi Gösterimi
Devre bir breadboard'a düzgün şekilde bağlanır ve aşağıda verilen program ESP32'ye yüklenir. Sizin için çalışmasını sağlamak için kodunuzdaki Wi-Fi ve Adafruit kimlik bilgilerini uygun şekilde değiştirdiğinizden emin olun.
WiFi ve Adafruit IO sunucusu ile bağlantı kurulduktan sonra beklendiği gibi çalışmaya başladı.
SPO2 seviyesinin% 96 gösterdiğini ve kalp atışının dakikada 78 ila 81 bit gösterdiğini görebildiğimiz gibi. Ayrıca verilerin yakalandığı zamanı da sağlar.
Yukarıdaki görselde görebileceğimiz gibi, anahtar kapalıdır ve veriler 0'dır. Projenin tam çalışma videosu da bu sayfanın alt kısmında bulunabilir.
Umarım makaleyi beğenmişsinizdir ve yararlı bir şey öğrenmişsinizdir, herhangi bir sorunuz varsa, lütfen bunları aşağıdaki yorum bölümüne bırakın veya forumlarımızda yayınlayın.