Biyomedikal projelerde ve giyilebilir teknolojilerde hassasiyet en önemli kriterdir. Bu yazımızda, daha önce incelediğimiz Arduino ile Nabız Ölçer Yapımı (KY-039) projesinde kullanılan analog çözümlere kıyasla, endüstriyel kalitede dijital ölçüm sunan MAX30102 Nabız ve Oksimetre (SpO2) Sensörü‘nü inceleyeceğiz. MAX30100’de sıkça yaşanan donanımsal kilitlenme sorunlarını, iki sensör arasındaki yapısal farkları, donanım seviyesindeki I2C voltaj uyumsuzluklarını ve Arduino ile donanımsal FIFO tampon belleğini kullanan kusursuz bir kütüphane uygulamasını teknik detaylarıyla ele alacağız.
Diğer alternatif kalp atış hızı sensörü incelememiz:
MAX30102 Kalp Atış Hızını ve SpO2 Değerini Nasıl Algılar?
MAX30102, kan hacmindeki optik değişimleri algılamak için Fotopletismografi (PPG) yöntemini kullanır. Ancak analog sensörlerden farklı olarak bünyesinde iki adet spesifik LED barındırır: Kırmızı LED (660 nm) ve Kızılötesi (IR) LED (880 nm). Bu iki dalga boyu, kandaki oksijen doygunluğunu (SpO2) ölçmek için kritik öneme sahiptir.
Kırmızı ve kızılötesi ışığın kandaki absorbsiyon mekanizması şu şekildedir:
- Oksijenli Hemoglobin (O2Hb): Kızılötesi (IR) ışığı daha fazla absorbe eder ve kırmızı ışığın daha fazlasını geçirir.
- Oksijensiz Hemoglobin (HHb): Kırmızı ışığı daha fazla absorbe eder ve kızılötesi ışığın daha fazlasını geçirir.
MAX30102, bu iki ışık kaynağını mikrosaniyeler mertebesinde ardışık olarak yakıp yansıyan ışık miktarlarını dahili yüksek çözünürlüklü fotodiyotu ile ölçer. Elde edilen analog voltaj değerleri entegre içerisindeki ADC tarafından dijital veriye dönüştürülerek, mikrodenetleyici tarafından Arduino I2C Haberleşme Protokolü hattı üzerinden okunmak üzere FIFO (First-In-First-Out) bellek bölgesine aktarılır.
MAX30100 ve MAX30102 Arasındaki Farklar ve Donanım Mühendisliği Hataları
Birçok geliştirici, ucuz MAX30100 kartlarını (RCWL-0530) Arduino Uno gibi 5V’luk sistemlere doğrudan bağladığında I2C hattının kilitlendiğini veya cihazın hiç yanıt vermediğini fark eder. Bu durum yazılımsal bir hatadan değil, tamamen bir donanım mühendisliği kusurundan kaynaklanır.
RCWL-0530 modül şemasında, I2C hatlarındaki çekme (pull-up) dirençleri (R1 ve R2) yanlışlıkla 1.8V hattına bağlanmıştır:

ATmega328P tabanlı bir Arduino Uno’nun bir dijital pini “Lojik HIGH” olarak algılayabilmesi için voltajın en az 3.0V ($0.6 \times V_{CC}$) olması gerekir. I2C hattı 1.8V ile çekildiğinde Arduino hatları sürekli Lojik LOW olarak görür ve I2C hattı tamamen kilitlenir.
MAX30102 entegreli yeni nesil RCWL-0531 modülü, bu hatayı düzeltmek amacıyla pull-up voltajını seçebileceğiniz bir köprü (jumper ped) eklemiştir:

RCWL-0531 üzerinde bu hat lojik olarak 3.3V seviyesine çekilmiştir ve bu seviye Arduino Uno’nun I2C giriş pini için güvenli eşiğin üzerindedir.
Neden MAX30102 Tercih Edilmelidir?
- 32-Örnek FIFO Bellek: MAX30100’ün 16-örneklik kısıtlı FIFO belleğine karşılık MAX30102, 32-örnek depolayabilir. Bu, mikrodenetleyicinin sürekli kesmeye girmesini önler ve arka planda başka işlemler yürütmesine imkan tanır.
- 18-Bit ADC Çözünürlüğü: MAX30100’ün 16-bit çözünürlüğüne karşılık MAX30102, 18-bit ADC çözünürlüğü sunar. Bu sayede dokudaki en ufak kılcal kan dalgalanmaları dahi yüksek kararlılıkla yakalanır.
- Optik İzolasyon Kılıfı: Sensör yüzeyindeki entegre optik cam koruma, harici ışık sızıntılarını minimuma indirir.
Piyasadaki MAX30102 Kart Modelleri
Piyasada iki popüler MAX30102 modül kartı bulunmaktadır:
- Yeşil Kart (RCWL-0531): Oldukça küçüktür. Hatları doğrudan 3.3V seviyesindedir. 5V’luk Arduino Uno ile doğrudan kullanıldığında I2C pinlerinin zarar görmemesi için araya çift yönlü Lojik Seviye Dönüştürücü (Logic Level Converter) konulması şiddetle önerilir. ESP32, STM32 veya Arduino Due gibi 3.3V lojik seviyeli işlemcilerle ise doğrudan sorunsuz şekilde çalışır.
- Siyah Kart (MH-ET LIVE): Üzerinde dahili 5V-3.3V lojik seviye dönüştürücü entegre ve voltaj regülatörleri barındırır. Arduino Uno gibi 5V’luk mikrokontrolcülere doğrudan, hiçbir ek eleman gerekmeden güvenle bağlanabilir.


MAX30102 Arduino Donanım Bağlantısı
Aşağıdaki bağlantı şeması, dahili seviye dönüştürücüsü bulunan siyah MH-ET LIVE modeli referans alınarak hazırlanmıştır:

| MAX30102 Pin | Arduino Uno Pin | Açıklama |
|---|---|---|
| VCC | 5V veya 3.3V | Besleme Girişi |
| GND | GND | Ortak Toprak Hattı |
| SCL | A5 / SCL | I2C Saat Hattı |
| SDA | A4 / SDA | I2C Veri Hattı |
| INT | D2 (Opsiyonel) | Harici Kesme Çıkışı |
Arduino Kodlama Uygulaması
MAX30102’nin FIFO, LED akımı, örnekleme hızı ve entegrasyon parametrelerini en verimli şekilde yönetebilmek için SparkFun tarafından geliştirilen resmi kitaplığı kullanacağız. Kitaplığa SparkFun MAX3010x Sensör Kütüphanesi GitHub Sayfası adresinden ulaşabilir veya Arduino IDE Kütüphane Yöneticisi’ne SparkFun MAX3010x yazarak kurabilirsiniz.
// MAX30102 Kararlı Kalp Nabız Hızı (BPM) Ölçüm Programı
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4; // Nabız ortalaması için örnek boyutu
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0; // Son kalp atışının milisaniye cinsinden zamanı
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(115200);
Serial.println("MAX30102 Baslatiliyor...");
// Varsayılan I2C hızında başlat
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 bulunamadi. Lutfen kablolari kontrol edin!");
while (1);
}
// Sensör parametrelerini hassas ölçüm için yapılandırıyoruz
particleSensor.setup();
particleSensor.setLEDMode(3); // 3 = Kırmızı + IR + Yeşil (MAX30102 için Kırmızı + IR)
particleSensor.setADCRange(ADC_16384_BYTES); // 18-bit hassasiyet seviyesi
particleSensor.setSampleRate(SAMPLE_RATE_100); // 100 Hz örnekleme hızı
particleSensor.setPulseWidth(PULSE_WIDTH_411); // Optimum fotodiyot entegrasyon süresi
// LED akımlarını parmak dokusuna nüfuz edecek şekilde ayarlıyoruz (Yaklaşık 6.4 mA)
particleSensor.setLEDAmplitude(0x1F);
}
void loop() {
// Sensörün dahili FIFO tampon belleğindeki kızılötesi okumasını alıyoruz
long irValue = particleSensor.getIR();
// Algoritmanın çalışması için parmağın sensörün üzerinde olduğunu doğruluyoruz
if (irValue > 50000) {
// heartRate.h kütüphanesinin tepe noktası algılama algoritması (peak detection)
if (checkForBeat(irValue) == true) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute > 20 && beatsPerMinute < 255) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
// Okumaları yumuşatmak için hareketli ortalama alıyoruz
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++) {
beatAvg += rates[x];
}
beatAvg /= RATE_SIZE;
}
}
Serial.print("IR Sinyal Gucu: ");
Serial.print(irValue);
Serial.print(" | Anlik BPM: ");
Serial.print(beatsPerMinute, 1);
Serial.print(" | Ortalama BPM: ");
Serial.println(beatAvg);
} else {
Serial.println("Lutfen parmaginizi sensorun uzerine yerlestirin.");
delay(500);
}
}Bu kodda, checkForBeat() fonksiyonu sensörden gelen IR (kızılötesi) sinyal gücündeki dinamik yükselişleri (systolic peak) gerçek zamanlı olarak takip eder. İki tepe noktası arasındaki milisaniye farkı üzerinden anlık kalp atış hızı (BPM) yüksek doğrulukla hesaplanmış olur.
MAX30102 entegresi ile ilgili yaşayabileceğiniz I2C adresi çakışmaları, gürültü bastırma veya oksijen satürasyonu (SpO2) algoritmaları konusundaki tüm sorularınızı aşağıdaki yorumlar kısmından bize iletebilirsiniz.
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.

