Göksel Akdemir
2026-06-03
Kalp atışlarınızla senkronize şekilde parlayan bir lamba, hem estetik bir dekor unsuru hem de sakinleştirici bir biofeedback aracı olabilir. İster yeni başlayan olun ister maker topluluğunda deneyimli, bu rehber nabız sensörlü lamba kurulumunu A’dan Z’ye anlaşılır, güvenli ve pratik bir şekilde ele alır. Adım adım gidecek, doğru bileşenleri seçecek, güç bağlantılarını güvenle yapacak, örnek kodu yükleyip ışık efektlerinizi kişiselleştireceksiniz. Üstelik tüm süreçte en fazla sorulan “nabız sensörlü lamba nasıl kurulur” sorusunun pratik cevaplarını baştan sona bulacaksınız.
Gündelik aydınlatmanın ötesine geçen nabız tabanlı ışık, kalp atış hızınızı (BPM) ölçerek LED’leri anlık olarak kontrol eder. Sonuç: Her vuruşta yanıp sönen veya nefes alıp veriyormuş gibi dalgalanan bir ışık. Bu yaklaşım:
Bu yazıda, Arduino veya ESP32 ile PPG temelli nabız sensörü kullanarak kalbinizin ritmini renge ve parlaklığa dönüştürmeyi öğreneceksiniz.
Nabız ölçümü için iki pratik yol öne çıkar: Optik PPG sensörleri ve BLE göğüs bantları. Projenizde kablolama yapmayı tercih ediyorsanız PPG, kablosuz ve spor sınıfı doğruluk istiyorsanız BLE seçebilirsiniz.
Avantajları: Uygun maliyet, doğrudan mikrokontrolöre bağlanma. Dikkat: Ortam ışığı ve hareketten etkilenir, bu yüzden sabit yerleştirme ve yazılımsal filtre şarttır.
İsteğe bağlı:
Not: Sensör ve LED güç hatlarını mümkün olduğunca kısa ve temiz tutun; veri hattını güç hatlarından ayırın.
Aşağıdaki örnek, MAX30102’den kalp atışını okur, basit bir tepe (peak) algılama ve hareketli ortalama uygular, WS2812B LED şeridi BPM’e göre nefes efekti ve vuruş flaşıyla sürer. Kod, açıklamalarla en anlaşılır hâle getirilmiştir.
// Gerekli kütüphaneler
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#include <SparkFun_MAX3010x.h> // MAX30102 için
// Donanım ayarları
#define LED_PIN 6 // Arduino D6 (ESP32 kullanıyorsanız uygun GPIO)
#define LED_COUNT 24 // LED sayısı
#define BRIGHTNESS 80 // 0-255 arası toplam parlaklık sınırı
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
SFE_MAX3010X particleSensor;
// Sinyal işleme değişkenleri
const int avgWindow = 8; // Hareketli ortalama penceresi
long samples[avgWindow];
int idx = 0;
long sum = 0;
// Tepe algılama
bool aboveThreshold = false;
unsigned long lastBeat = 0;
float bpm = 0;
// Eşik ve filtre parametreleri
long dcOffset = 0; // DC ofseti takip eder
float alpha = 0.95; // DC ofset için IIR katsayısı
int threshold = 2000; // Deneysel eşik (ortama göre ayarlayın)
// Zamanlama
unsigned long lastUpdate = 0;
void setup() {
Wire.begin();
Serial.begin(115200);
strip.begin();
strip.setBrightness(BRIGHTNESS);
strip.show();
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX3010x bulunamadı. Bağlantıları kontrol edin.");
while (1) delay(10);
}
// Sensör yapılandırması: kırmızı/IR LED, örnekleme ve kazanç
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x1F); // Kırmızı LED parlaklığı
particleSensor.setPulseAmplitudeIR(0x1F); // IR LED parlaklığı
particleSensor.setSampleRate(100); // 100 SPS
particleSensor.setFIFOAverage(4); // Ortalaması alınmış veri
particleSensor.setADCRange(4096);
// Başlangıç
for (int i = 0; i < avgWindow; i++) { samples[i] = 0; }
}
long movingAverage(long x) {
sum -= samples[idx];
samples[idx] = x;
sum += x;
idx = (idx + 1) % avgWindow;
return sum / avgWindow;
}
void setAll(uint8_t r, uint8_t g, uint8_t b) {
for (int i = 0; i < LED_COUNT; i++) strip.setPixelColor(i, strip.Color(r, g, b));
}
void beatFlash(uint8_t r, uint8_t g, uint8_t b) {
// Vuruş anında kısa bir flaş
setAll(r, g, b);
strip.show();
}
void loop() {
// Sensörden yeni veri var mı?
if (particleSensor.check() == true) {
while (particleSensor.available()) {
// Kırmızı LED okuması nabız için daha uygundur
long raw = particleSensor.getRed();
// DC ofseti çıkar (IIR filtre)
dcOffset = alpha * dcOffset + (1 - alpha) * raw;
long ac = raw - dcOffset;
// Basit hareketli ortalama ile yumuşatma
long filtered = movingAverage(ac);
// Tepe algılama
unsigned long now = millis();
if (!aboveThreshold && filtered > threshold) {
aboveThreshold = true;
if (lastBeat > 0) {
float ibi = (now - lastBeat) / 1000.0; // saniye
if (ibi > 0.3 && ibi < 2.0) { // 30–200 BPM aralığı
bpm = 60.0 / ibi;
Serial.print("BPM: "); Serial.println(bpm);
// Vuruş efekti
beatFlash(255, 50, 50);
}
}
lastBeat = now;
}
if (aboveThreshold && filtered < threshold / 2) {
// Histerezis ile eşikten aşağı inince bekle
aboveThreshold = false;
}
// Nefes efekti: BPM’e göre yavaş hızlı parlaklık dalgası
if (millis() - lastUpdate > 15) {
lastUpdate = millis();
float rate = (bpm > 40 && bpm < 160) ? bpm : 60; // bilinmiyorsa 60 BPM varsay
float t = (millis() % (unsigned long)(60000 / rate)) / (60000.0 / rate);
float breath = 0.5 * (1 - cos(2 * 3.14159 * t));
uint8_t r = (uint8_t)(30 + 70 * breath);
uint8_t g = (uint8_t)(10 + 30 * breath);
uint8_t b = (uint8_t)(60 + 140 * breath);
setAll(r, g, b);
strip.show();
}
particleSensor.nextSample();
}
}
}
İpucu: Eşik (threshold) değeri ortamınıza göre değişir. Seri Monitör ile sinyal seviyesine bakıp bu sayıyı artırıp azaltarak güvenilir tepe algılaması elde edin.
LED’leri süt beyaz (opal) bir difüzör arkasına yerleştirmek, noktasal parlamayı yumuşatır ve nefes efektini daha “organik” hissettirir. Sensör için parmağı doğal şekilde konumlandıran hafif eğimli bir yuva, veri kalitesini artırır. Kutu içinde güç kaynağından gelen kablolar ile veri kablolarını ayırın; manyetik girişimi azaltın.
Bir BLE göğüs bandı kullanmak istiyorsanız ESP32, standart Heart Rate Service (0x180D)’i okuyarak BPM değeri alabilir. Bu sayede sensör kalibrasyonu ve parmak sabitleme derdi ortadan kalkar; yalnızca BPM sayısını LED efektlerine map edersiniz. Bağlantı adımları:
Temel seviyede kablo bağlama ve Arduino IDE kullanımı yeterlidir. Bu rehberde tüm adımlar yalın biçimde anlatıldı.
Eğer akıllı saatiniz BPM’yi BLE üzerinden yayınlıyorsa evet. Aksi halde üretici kısıtları olabilir.
Yüksek akım çekişi güç hattında dalgalanma oluşturur. Büyük kapasitör, kalın kablo ve sağlam lehimler şart.
Yoğun ortam ışığı değişimi veya farklı kullanıcı parmağı için kısa bir kalibrasyon süresi en iyi sonucu verir.
Bu rehber boyunca “nabız sensörlü lamba nasıl kurulur” sorusuna doğal ve akıcı yanıtlar verilirken, “nabız sensörü”, “Arduino ile nabız ölçümü”, “RGB LED şerit”, “ESP32 nabız projesi”, “MAX30102”, “WS2812B” gibi ikincil ifadeler de dengeli şekilde geçmektedir. Böylece içerik arama niyetiyle uyumlu, tekrarları abartmadan, okunurluğu yüksek bir yapıdadır.
Artık kendi nabızla senkronize lambanızı kurmak için gereken tüm bileşenleri, bağlantıları, örnek kodu ve ince ayar ipuçlarını biliyorsunuz. En önemlisi: Ortak toprak, doğru güç ve basit ama etkili filtreleme. Bundan sonra yapmanız gereken tek şey, favori efektlerinizi seçmek ve yaşam alanınızı kalp atışınızla nefes alan benzersiz bir ışıkla dönüştürmek. Eğer “nabız sensörlü lamba nasıl kurulur” sorusunu ilk kez düşünüyorsanız, yukarıdaki adımlar sizi hızlıca çalışır bir prototipe götürür; daha ileri düzeydeyseniz BLE, dinamik renk eşleme ve akıllı kutu tasarımıyla projenizi bir üst seviyeye taşıyabilirsiniz.
Hızlı Özet
Şimdi sıra sizde: Işığınızı kalbinizin ritmine bırakın!
Ayrıca bakınız
Blog kategorileri