Arduino ile nabız ölçer yapımı, gömülü sistemler ve medikal elektronik dünyasına adım atmak isteyen geliştiriciler için harika ve öğretici bir projedir. Bu rehberimizde, biyomedikal ölçüm sistemlerinin temeli olan Fotopletismografi (PPG) sinyal işleme tekniklerini ele alarak, piyasada yaygın olarak bulunan KY-039 Kızılötesi Nabız Sensörü‘nü inceleyeceğiz. Sensörden gelen gürültülü analog sinyalleri filtrelemeyi, elektrik şebekesinden kaynaklanan 50 Hz parazitleri yok etmeyi ve Arduino ile kararlı nabız dalga formları (PPG) elde etmeyi adım adım öğreneceğiz.
Diğer gelişmiş nabız ve biyosensör okuma rehberlerimiz:
Fotopletismografi (PPG) ve KY-039 Çalışma Prensibi
KY-039 sensörünün kalbinde Fotopletismografi (PPG) adı verilen optik bir ölçüm tekniği yatar. Bu yöntem, organların ve dokuların hacmindeki kan akışına bağlı değişimleri ışık absorbsiyonu (emilimi) üzerinden tespit eder. Donanım seviyesinde Kapsamlı Arduino Sensör Rehberi modellerinden biri olan KY-039, yüksek yoğunluklu bir kızılötesi (IR) Yarı İletken LED Teknolojisi elemanı ve bu ışığı karşıdan toplayan hassas bir fototransistörden oluşur.
Parmağınızı IR LED ile fototransistör arasına yerleştirdiğinizde şu fiziksel süreç gerçekleşir:
- Sistolik Evre (Kalp Kasılması): Kalp her pompaladığında, parmağınızdaki kılcal damarlara ani bir temiz kan hücumu olur. Kandaki hemoglobin miktarı artar, bu da kızılötesi ışığı daha fazla absorbe etmesine (emmesine) yol açar. Fototransistöre ulaşan IR ışık miktarı azalır ve analog çıkış voltajı düşer.
- Diyastolik Evre (Kalp Gevşemesi): Kalp çevrimi gevşeme evresine geçtiğinde kan hacmi azalır, IR ışık absorbsiyonu düşer. Foto-transistöre daha fazla ışık çarpar ve analog sinyal seviyesi yükselir.
Bu sürekli darbelenme (AC bileşeni), zaman içinde periyodik bir dalga formu oluşturur ve bu dalganın tepe noktaları (peaks) arasındaki süre bize nabız (BPM) bilgisini verir. Sensörün resmi şeması ve bacak bağlantı şemasına Joy-IT KY-039 Teknik Veri Sayfası (Datasheet) üzerinden ulaşabilirsiniz.

Devre Şeması ve Bağlantı Tablosu
KY-039 analog bir sensördür ve Arduino’nun Analog Giriş-Çıkış (ADC) pinlerine bağlanarak çalışır. Besleme voltajı gürültüsüz bir çalışma için 5V seviyesinde tutulmalıdır.

| KY-039 Pin | Arduino Uno Bağlantısı | Açıklama |
|---|---|---|
| S (Signal) | A0 | Analog Çıkış Sinyali |
| + (VCC) | 5V | Pozitif Besleme Voltajı |
| – (GND) | GND | Toprak Hattı |
Aşama 1: Ham Verinin Okunması (Filtresiz Grafik)
Eğer sensörün analog çıkışını hiçbir filtre uygulamadan doğrudan okuyup Seri Çizici (Serial Plotter) üzerinde görüntülersek, elektriksel ve çevresel faktörlerden ötürü son derece gürültülü ve kesintili bir grafik elde ederiz:
// KY-039 Ham Veri Okuma Kodu
const int sensorPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int rawValue = analogRead(sensorPin);
Serial.println(rawValue);
delay(10); // 100 Hz örnekleme sıklığı
}
Aşama 2: Hareketli Ortalama Filtresi (Moving Average Filter)
Ham verideki yüksek frekanslı rastgele elektriksel gürültüleri bastırmak için en hızlı ve etkili yöntemlerden biri Basit Hareketli Ortalama Filtresi (SMM) kullanmaktır. Bu algoritmada, son 4 veya 8 örnek sürekli bir dizi (buffer) içerisinde tutulur, her yeni okumada en eski veri silinip en yeni veri diziye eklenir ve bu grubun ortalaması alınır:
// Hareketli Ortalama Filtreli PPG Okuma Kodu
const int sensorPin = A0;
const int filterOrder = 8; // Filtre pencere boyutu
int readings[filterOrder];
int readIndex = 0;
long total = 0;
int average = 0;
void setup() {
Serial.begin(9600);
for (int i = 0; i < filterOrder; i++) {
readings[i] = 0;
}
}
void loop() {
// En eski okumayı toplamdan çıkar
total = total - readings[readIndex];
// Yeni veriyi oku
readings[readIndex] = analogRead(sensorPin);
// Yeni veriyi toplama ekle
total = total + readings[readIndex];
readIndex = (readIndex + 1) % filterOrder;
// Ortalama değeri hesapla
average = total / filterOrder;
Serial.println(average);
delay(10);
}
Aşama 3: Donanımsal 50 Hz Şebeke Parazitlerinin Temizlenmesi
Yukarıdaki grafikte, ana dalga formunun üzerinde küçük “tırtıklar” (zikzaklar) olduğunu fark edeceksiniz. Bu durum, Türkiye’deki 220V 50 Hz alternatif akım (AC) şebekesinden ve yapay aydınlatma armatürlerinden kaynaklanan optik gürültüdür. Lambalar saniyede 50 (veya floresanlar gibi 100) kez yanıp söner ve bu kızılötesi spektrumda parazit yaratır.
Mühendislik Çözümü (Entegrasyon Zamanlaması): 50 Hz sinyalin bir tam periyodu 20 milisaniyedir (T = 1/50 = 0.02 sn). Eğer biz analog ölçümlerimizi tam olarak 20 ms’lik pencereler boyunca entegre edersek (örnekleri bu süre zarfında alıp ortalamasını çıkarırsak), 50 Hz gürültü dalgasını tam bir periyodu boyunca entegre etmiş oluruz. Matematiksel olarak sinüzoidal bir dalganın tam periyottaki integrali sıfıra eşit olduğundan, şebeke gürültüsü tamamen yok olur (Notch filtre etkisi).
Eğer 60 Hz elektrik şebekesi kullanılan bir ülkedeyseniz, periyot süresini 16.67 ms (1/60) olarak güncellemelisiniz. İşte bu akıllı filtrelemeyi uygulayan nihai kararlı kod:
// 50 Hz Şebeke Gürültüsünü Yok Eden Gelişmiş Biyomedikal PPG Filtresi
const int sensorPin = A0;
void setup() {
Serial.begin(115200); // Hızlı çizim için baud rate artırıldı
}
void loop() {
unsigned long baslangic_zamani = micros();
long toplam_deger = 0;
int ornek_sayisi = 0;
// 50 Hz için 20 ms (20000 mikrosaniye) boyunca entegrasyon yap
while (micros() - baslangic_zamani < 20000) {
toplam_deger += analogRead(sensorPin);
ornek_sayisi++;
}
// 20 ms'lik entegrasyon penceresinin ortalamasını al
int net_sinyal = toplam_deger / ornek_sayisi;
Serial.println(net_sinyal);
}
Bu yöntem sayesinde hiçbir pahalı harici analog donanımsal aktif filtre kartına ihtiyaç duymadan, yalnızca yazılımsal entegrasyon yöntemiyle kusursuz bir biyomedikal sinyal kalitesi elde etmiş olduk.
PPG sinyal analizi, nabız dalgası hız hesaplamaları veya KY-039 sensörü ile yaşadığınız donanımsal kararsızlıklar hakkında sormak istediklerinizi yorumlar bölümünde bizimle paylaşabilirsiniz.
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.

