Öncelikle MAX30100’ün nabız hızını nasıl ölçtüğünü açıklamaya çalışayım. Cihaz, biri kırmızı ışık yayan, diğeri kızılötesi ışık yayan iki LED’e sahiptir. Nabız hızı için yalnızca kızılötesi ışık gereklidir. Hem kırmızı ışık hem de kızılötesi ışık, kandaki oksijen seviyelerini ölçmek için kullanılır.
Eğer elinizde bu modül yoksa, farklı modüller kullandığımız diğer nabız ölçüm yazılarımıza bakabilirsiniz:

Kalp kan pompaladığında, daha fazla kan olması sonucu oksijenli kanda bir artış olur. Kalp rahatladıkça oksijenli kan hacmi de azalır. Sonuçta cihaz, oksijenden zengin kanın artması ve azalması arasındaki süreyi bilerek nabız hızını hesaplar.
Oksijenli kan daha fazla kızılötesi ışığı emer ve daha fazla kırmızı ışık geçirirken, oksijensiz kan kırmızı ışığı emer ve daha fazla kızılötesi ışık geçirir. MAX30100’ün ana işlevi budur: her iki ışık kaynağı için de ışığı emme seviyelerini okur ve bunları I2C aracılığıyla okunabilen bir arabellekte saklar.
MAX30100 Modülü

Yaygın olarak bulunan iki adet MAX30100 devre kartı vardır. GY-MAX30100 modülünüz varsa:
Diğer modüllere kıyasla bu kart Arduino ile kullanıma hazırdır. Sadece bu kablolama kurulumunu takip edin:
| GY-MAX30100 Modülü | Arduino UNO/Nano |
| VIN | 5V |
| GND | GND |
| SCL | A5 |
| SDA | A4 |
| INT | D2 |
Sadece bu kablolama kurulumunu takip edin ve buradaki MAX30100 kütüphanesini kullanın. Kütüphanenin kullanımı oldukça kolaydır; örnek bir kod:
Burada kalp nabız hızı seri monitör aracılığıyla görüntülenir. Kan oksijen konsantrasyonunu eklemeniz gerekiyorsa, yalnızca şu satırı eklemeniz gerekir:
Serial.print( "SaO2: " );
Serial.print( result.SaO2 );
Serial.println( "%" );Problemli MAX30100 Modülü
Eğer RCWL-0530’a sahipseniz:

Maalesef bu modülü kullanıyorsanız yapacak çok işiniz var. Bu ucuz modülün bazı ciddi tasarım sorunları mevcut. Eğer veri sayfasına bakarsanız böyle bir şemayı kullandığını göreceksiniz:

MAX30100 entegresi, VDD için 1.8V kullanır ve bu özel modül, bu voltajı elde etmek için iki regülatör kullanır. Bunda yanlış bir şey yok. Ancak yakından bakarsanız, SCL ve SDA pinleri 4.7k ohm dirençler aracılığıyla 1.8V’a çekilir! Bu, daha yüksek mantık seviyelerine sahip mikrodenetleyicilerle iyi çalışmayacağı anlamına gelir. Arduino, minimum 2 V’luk bir YÜKSEK voltajı algılayabilir!
Çözüm, dirençleri karttan çıkarmak (aşağıdaki resimde çevrelenmiştir) ve bunun yerine harici 4.7k ohm dirençler eklemektir.

Dirençleri çıkartılmış modülün görüntüsü:

Dirençleri çıkardıktan sonra, bu kablo şemasını kullanarak bu modülü Arduino UNO’ya bağlayabilirsiniz:

Burada SCL, SDA ve INT, 4.7k ohm’luk direnç aracılığıyla 3.3V’a çeker. Bu, Arduino UNO’nun MAX30100’ü aşırı beslemeden YÜKSEK mantık seviyesini tespit edebilmesini sağlar.
Örnek için bu kütüphaneyi kullandık. Kütüphane birkaç örnek sunar. En temel örnek hazır olarak kütüphane ile gelmektedir:
Bağlantı şemasını takip edip bu kodu Arduino’nuza yüklediyseniz, kart üzerindeki kırmızı LED yanmalıdır ve bunu seri monitörde görmelisiniz:

Benzer bir çıktı alıyorsanız MAX30100’ün çalıştığı anlamına gelir. Tek yapmanız gereken, parmağınızı entegre’nin (LED’li olan) üstüne koymak ve nabız hızınız görüntülemektir
Eğer LED yanmıyorsa ve seri monitörde “FAILED” mesajını alıyorsanız, bu bir güç sorunu olabilir. Yukarıdaki kodun 58. satırına bakarsanız:
//pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);Bu, LED üzerindeki akımı ayarlar. Bu, başlangıçta, LED akımı varsayılan 50 mA olacak şekilde yorumlanmıştır. LED’den geçen akımı 7,6 mA’ya eşit yapmak için bunu yorumlayın. Bu güç sorununu çözecektir.
Bu arada, yukarıdaki setIRLedCurrent() işlevinde kullanabileceğiniz diğer olası değerler şunlardır:
MAX30100_LED_CURR_0MA
MAX30100_LED_CURR_4_4MA
MAX30100_LED_CURR_7_6MA
MAX30100_LED_CURR_11MA
MAX30100_LED_CURR_14_2MA
MAX30100_LED_CURR_17_4MA
MAX30100_LED_CURR_20_8MA
MAX30100_LED_CURR_24MA
MAX30100_LED_CURR_27_1MA
MAX30100_LED_CURR_30_6MA
MAX30100_LED_CURR_33_8MA
MAX30100_LED_CURR_37MA
MAX30100_LED_CURR_40_2MA
MAX30100_LED_CURR_43_6MA
MAX30100_LED_CURR_46_8MA
MAX30100_LED_CURR_50MAAkım ne kadar yüksek olursa, LED’in o kadar parlak olduğunu ve cildinize o kadar derine ulaştığını unutmayın.
Sensör Güncelleme Hızı
Bu kod satırını çalıştırmaya gelince kullandığımız kitaplıktaki bu fonkyison ise şu işe yarar:
pox.update();Bu satır sensör okumalarını günceller ve loop() içine yerleştirilir. Kitaplığın yazarı, bu işlevin çağrılması arasındaki sürenin 10 ms’den az olması gerektiğini vurgulamaktadır. Görünen o ki, MAX30100’ün örnekleme frekansını ayarlayabilirsiniz ancak kütüphanede bu frekans 100 Hz olarak ayarlanmıştır. Örnekleme frekansının düzenlenmesi, MAX30100’den gelen verileri işlemek için kullanılan filtrenin FIR katsayılarını gerektirir.
Kısacası, bu kodu kullanarak 10 ms’den fazla bir gecikme koyamaz veya bu süreyi loop() içinde yapamazsınız.
Bu nedenle yukarıdaki kod için şunu görüyoruz:
if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
Serial.print("Heart rate:");
Serial.print(pox.getHeartRate());
Serial.print("bpm / SpO2:");
Serial.print(pox.getSpO2());
Serial.println("%");
tsLastReport = millis();
}normal delay() rutini yerine sensör değerlerini okurken. millis() işlevi arka planda çalışmaya devam eder ve kod yürütülmesini engellemez.
MAX30100 ile 16×2 LCD Kullanma
Zamanlama sorunları nedeniyle, şimdi MAX30100 ile diğer cihazları kullanırken bir sorun ortaya çıkıyor. pox.update()’nin 100 ms’den az olmamak üzere yürütüldüğünden emin olun.

Arduino Kodu
loop() içinde hiçbir delay() yoktur ve görüntü yalnızca her saniyede bir güncellenir, bu nedenle pox.update() mümkün olduğunca hızlı yürütülür.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.

