Bu rehberde, ESP8266 NodeMCU geliştirme kartına I2C haberleşme protokolü üzerinden MAX30102 (veya MAX30100/105) yüksek hassasiyetli nabız ve kanda oksijen (SpO2) sensörünü bağlayarak anlık kalp ritmi ve IR/Kırmızı ışık yansıma verilerini okuma uygulamasını gerçekleştiriyoruz.
Görseldeki şemaya uygun I2C pin bağlantıları şu şekildedir:
0x57'dir. Bazı mor/yeşil MAX30102 modül kartlarında I2C hatlarındaki dahili pull-up dirençleri (4.7kΩ veya 1.8kΩ) 1.8V mantık seviyesine bağlı gelebilir. Eğer sensör 0x57 adresinde bulunamazsa, modül üzerindeki 3.3V jumper lehimlerini ve hat dirençlerini kontrol etmek gerekebilir.
Kodu derlemeden önce Arduino IDE Kütüphane Yöneticisi (Ctrl+Shift+I) üzerinden SparkFun tarafından geliştirilen SparkFun MAX3010x Pulse and Proximity Sensor Library kütüphanesini yüklemeniz gerekmektedir:
// ESP8266 NodeMCU & MAX30102 Nabız Sensörü Okuma Kodu
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h" // SparkFun kütüphanesinin nabız algılama algoritması
MAX30105 particleSensor;
const byte RATE_SIZE = 4; // Ortalama almak için kullanılacak örnek sayısı
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0; // Son kalp atışının zamanı
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(115200);
Serial.println("MAX30102 Başlatılıyor...");
// ESP8266 I2C başlatma (D2: SDA, D1: SCL)
Wire.begin(D2, D1);
// MAX30102 Sensör Kontrolü (I2C adresi: 0x57)
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 Sensörü bulunamadı! Bağlantıları veya I2C voltajını kontrol edin.");
while (1);
}
Serial.println("Parmağınızı sensör üzerine sabit ve hafifçe bastırmadan koyun.");
// Sensör varsayılan konfigürasyonu
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A); // Kırmızı LED gücü
particleSensor.setPulseAmplitudeGreen(0); // Yeşil LED kapalı
}
void loop() {
// Kızılötesi (IR) emilim değerini okuyoruz
long irValue = particleSensor.getIR();
// Parmağın sensör üzerinde olup olmadığını kontrol et (IR eşik değeri)
if (irValue < 50000) {
Serial.println("Parmak algılanmadı!");
delay(500);
return;
}
// Kalp atışı (Peak) algılandı mı?
if (checkForBeat(irValue) == true) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
// Mantıklı nabız aralığında mı? (20 - 255 BPM)
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
// Son okumaların ortalamasını al
beatAvg = 0;
for (byte x = 0 ; x < RATE_SIZE ; x++)
beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
// Seri port çıktısı
Serial.print("IR Sinyali: ");
Serial.print(irValue);
Serial.print(" | Anlık BPM: ");
Serial.print(beatsPerMinute);
Serial.print(" | Ortalama BPM: ");
Serial.println(beatAvg);
}
Henüz yorum yapılmamış. İlk yorumu siz yapın!