Arduino ile İleri Düzey Kalp Atış Hızı Ölçer Sensörü

Arduino ile Kalp Atış Hızı Ölçer Sensörü

Pulse Sensor

Bu makalede, Arduino kullanarak bir kalp atış hızı ölçer sensörü tasarlamayı detaylı bir şekilde anlatacağız. Bu sistem, Pulse Sensor gibi sensörler kullanarak nabzınızı ölçebilir ve verileri seri port üzerinden görüntüleyebilir.

Gerekli Malzemeler

  1. Arduino Uno
  2. Pulse Sensor (Kalp Atış Hızı Sensörü)
  3. 10k Ohm direnç
  4. Jumper kablolar
  5. Breadboard

Bağlantı Şeması

Aşağıdaki bağlantıları yaparak devreyi kurabilirsiniz:

  1. Pulse Sensor’un VCC bacağını Arduino’nun 5V pinine bağlayın.
  2. Pulse Sensor’un GND bacağını Arduino’nun GND pinine bağlayın.
  3. Pulse Sensor’un SIGNAL bacağını Arduino’nun A0 analog girişine bağlayın.

Arduino Kodu

Aşağıdaki kodu kullanarak Arduino’nun seri port üzerinden kalp atış hızını okumasını sağlayabilirsiniz.


#include <Arduino.h>

int pulsePin = A0; // Sensör A0 pinine bağlı
int signalValue = 0; // Sensörden okunan değeri saklayacak değişken

void setup() {
    Serial.begin(9600); // Seri haberleşmeyi başlat
}

void loop() {
    signalValue = analogRead(pulsePin); // Sensör değerini oku
    Serial.println(signalValue); // Seri port üzerinden gönder
    delay(10); // 10ms gecikme
}

Verileri Görüntüleme

Kod yüklendikten sonra Arduino’nun seri monitörünü açarak sensörden gelen verileri görebilirsiniz.

  1. Arduino IDE’yi açın.
  2. Araçlar > Seri Port seçeneğinden doğru portu seçin.
  3. Araçlar > Seri Monitör seçeneğini açarak verileri izleyin.

Kalp Atış Hızını Hesaplama

Sensörden gelen sinyali işleyerek gerçek kalp atış hızını (BPM) hesaplayabilirsiniz.


int threshold = 520; // Nabız algılama eşiği
unsigned long previousMillis = 0;
int beatCount = 0;
float bpm = 0;

void loop() {
    signalValue = analogRead(pulsePin);
    
    if (signalValue > threshold) { 
        beatCount++;
        delay(200); // Gürültüyü önlemek için küçük bir bekleme
    }
    
    unsigned long currentMillis = millis();
    
    if (currentMillis - previousMillis >= 60000) { // 1 dakika geçtiyse BPM hesapla
        bpm = beatCount;
        Serial.print("BPM: ");
        Serial.println(bpm);
        beatCount = 0;
        previousMillis = currentMillis;
    }
}

Gürültü Filtreleme ve Stabil Ölçüm

Kalp atış hızı sensörleri çevresel gürültüden etkilenebilir. Bu nedenle, ham veriyi işleyerek daha doğru ölçümler elde edebiliriz.

Yumuşatma (Smoothing) Algoritması

Ölçülen veriyi yumuşatarak ani değişimlerden kurtulmak için basit bir hareketli ortalama (Moving Average) filtresi uygulayabiliriz.


#define BUFFER_SIZE 10
int readings[BUFFER_SIZE]; 
int readIndex = 0;
int total = 0;
int average = 0;

void setup() {
    Serial.begin(9600);
    for (int i = 0; i < BUFFER_SIZE; i++) { 
        readings[i] = 0; 
    }
}

void loop() {
    total -= readings[readIndex]; 
    readings[readIndex] = analogRead(A0); 
    total += readings[readIndex]; 
    readIndex = (readIndex + 1) % BUFFER_SIZE; 

    average = total / BUFFER_SIZE; 
    Serial.println(average);
    delay(10);
}

Bu yöntem, ani yükseliş ve düşüşleri filtreleyerek ölçümlerin daha stabil olmasını sağlar.

Ölçülen Nabzı LCD Ekranda Gösterme

Sonuçları 16x2 LCD ekranına yazdırabiliriz.

Bağlantılar

LCD ekranı aşağıdaki gibi bağlayın:

  1. LCD’nin VCC bacağını 5V’a bağlayın.
  2. LCD’nin GND bacağını Arduino’nun GND’sine bağlayın.
  3. LCD’nin SDA bacağını Arduino’nun A4 pinine bağlayın.
  4. LCD’nin SCL bacağını Arduino’nun A5 pinine bağlayın.

LCD Kodları


#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
    lcd.begin();
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("Nabiz Olculuyor...");
}

void loop() {
    int bpm = analogRead(A0);
    lcd.setCursor(0, 1);
    lcd.print("BPM: ");
    lcd.print(bpm);
    delay(1000);
}

Bluetooth ile Mobil Uygulamaya Veri Gönderme

Kalp atış hızını Bluetooth modülü kullanarak bir mobil uygulamaya gönderebiliriz.

HC-05 Bluetooth Modülü Bağlantıları

  1. HC-05’in VCC bacağını 5V’a bağlayın.
  2. HC-05’in GND bacağını Arduino’nun GND’sine bağlayın.
  3. HC-05’in TX bacağını Arduino’nun RX (pin 0)’ına bağlayın.
  4. HC-05’in RX bacağını Arduino’nun TX (pin 1)’ine bağlayın.

Bluetooth ile Veri Gönderme Kodu


#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // RX, TX

void setup() {
    Serial.begin(9600);
    BTSerial.begin(9600);
}

void loop() {
    int bpm = analogRead(A0);
    BTSerial.print("BPM: ");
    BTSerial.println(bpm);
    delay(1000);
}

Bu verileri Android uygulaması ile Bluetooth Terminal uygulamasıyla okuyabilirsiniz.

IoT Entegrasyonu (Verileri İnternete Gönderme)

Arduino ile ölçülen kalp atış verilerini ThingSpeak veya Firebase gibi platformlara gönderebiliriz.

ESP8266 Kullanarak Veri Gönderme

  1. ESP8266’nın VCC bacağını 3.3V’a bağlayın.
  2. ESP8266’nın GND bacağını Arduino’nun GND’sine bağlayın.
  3. ESP8266’nın TX bacağını Arduino’nun RX (pin 2)’ine bağlayın.
  4. ESP8266’nın RX bacağını Arduino’nun TX (pin 3)’üne bağlayın.

ESP8266 ile ThingSpeak’e Veri Gönderme Kodu


#include <ESP8266WiFi.h>

const char* ssid = "WiFi_ADINIZ";
const char* password = "WiFi_SIFRENIZ";
const char* server = "api.thingspeak.com";
String apiKey = "API_KEYINIZ";

WiFiClient client;

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("WiFi Bağlandı!");
}

void loop() {
    int bpm = analogRead(A0);
    
    if (client.connect(server, 80)) {
        String postStr = "api_key=" + apiKey + "&field1=" + String(bpm);
        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);
    }
    
    client.stop();
    delay(20000);
}

Veri Analizi ve Grafik Çizimi

Ölçülen kalp atış hızını analiz etmek ve grafik çizmek için Python ve Matplotlib kullanabiliriz.

Arduino’dan Python’a Veri Okuma

Öncelikle, Arduino’dan seri port üzerinden gelen verileri bir Python programı ile okumamız gerekiyor.

Python Kodları


import serial
import time
import matplotlib.pyplot as plt

ser = serial.Serial('COM3', 9600)  # Arduino'nun bağlı olduğu port
time.sleep(2)

bpm_values = []

plt.ion()
fig, ax = plt.subplots()

while True:
    try:
        bpm = int(ser.readline().decode().strip())
        bpm_values.append(bpm)
        
        if len(bpm_values) > 50:
            bpm_values.pop(0)
        
        ax.clear()
        ax.plot(bpm_values, label="BPM")
        ax.set_title("Gerçek Zamanlı Kalp Atış Grafiği")
        ax.set_xlabel("Zaman")
        ax.set_ylabel("BPM")
        ax.legend()
        plt.pause(0.1)
    
    except KeyboardInterrupt:
        ser.close()
        break

Bu Python kodu, Arduino’dan gelen BPM verilerini anlık olarak grafik üzerinde gösterir.

Mobil Uygulama ile Nabız Takibi

Kalp atış hızını takip etmek için **Android** veya **iOS** üzerinde çalışan bir mobil uygulama geliştirebiliriz.

MIT App Inventor ile Bluetooth Bağlantısı

  1. MIT App Inventor web sitesine girin.
  2. Yeni bir proje oluşturun ve Bluetooth Client bileşenini ekleyin.
  3. HC-05 Bluetooth modülü ile bağlantı kuran kodları ekleyin.

MIT App Inventor Blokları

Aşağıdaki kod, Bluetooth üzerinden gelen BPM verisini bir etiket üzerinde gösterir.


when BluetoothClient1.ReceiveText
do set Label1.Text to BluetoothClient1.ReceivedText

Yapay Zeka ile Anomali Tespiti

Makine öğrenmesi kullanarak anormal kalp ritimlerini tespit edebiliriz.

Python ile Anomali Algılama


import numpy as np
from sklearn.ensemble import IsolationForest

# Örnek BPM verileri
bpm_data = [72, 75, 74, 73, 120, 125, 130, 72, 74, 73, 72, 200, 202]

# Modeli eğitme
model = IsolationForest(contamination=0.1)
bpm_data = np.array(bpm_data).reshape(-1, 1)
model.fit(bpm_data)

# Tahmin etme
anomalies = model.predict(bpm_data)
for i, val in enumerate(anomalies):
    if val == -1:
        print(f"Anormal Kalp Atışı: {bpm_data[i][0]} BPM")

Veri Kaydı ve Geçmiş Analizi

Kalp atış hızını sadece anlık olarak değil, geçmiş verilerle birlikte analiz etmek için bir veri kaydı sistemi oluşturabiliriz.

SD Kart Modülü ile Veri Kaydı

SD kart modülü kullanarak, Arduino’dan gelen verileri kalıcı olarak saklayabiliriz.

Bağlantılar

  1. SD kart modülünün VCC pinini 5V’a bağlayın.
  2. GND pinini Arduino’nun GND’sine bağlayın.
  3. MOSI, MISO, SCK ve CS pinlerini Arduino’nun 11, 12, 13 ve 4 numaralı pinlerine bağlayın.

SD Kart ile Veri Kaydetme Kodu


#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;
int pulsePin = A0;
File dataFile;

void setup() {
    Serial.begin(9600);
    if (!SD.begin(chipSelect)) {
        Serial.println("SD Kart Başlatılamadı!");
        return;
    }
}

void loop() {
    int bpm = analogRead(pulsePin);
    dataFile = SD.open("bpm_data.txt", FILE_WRITE);
    
    if (dataFile) {
        dataFile.println(bpm);
        dataFile.close();
    } else {
        Serial.println("Dosya yazılamadı!");
    }
    
    delay(1000);
}

Bulut Tabanlı İzleme Sistemi

Kalp atış hızı verilerini uzaktan izleyebilmek için Firebase veya AWS IoT gibi servisleri kullanabiliriz.

Firebase Kullanarak Gerçek Zamanlı Veri Gönderme

Firebase kullanarak nabız verilerini bir veritabanına kaydedebiliriz.

ESP8266 ile Firebase’e Veri Gönderme


#include <ESP8266WiFi.h>
#include <FirebaseESP8266.h>

#define FIREBASE_HOST "your_project.firebaseio.com"
#define FIREBASE_AUTH "your_firebase_secret"
#define WIFI_SSID "your_wifi"
#define WIFI_PASSWORD "your_password"

FirebaseData firebaseData;
int pulsePin = A0;

void setup() {
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}

void loop() {
    int bpm = analogRead(pulsePin);
    Firebase.setInt(firebaseData, "/bpm", bpm);
    delay(5000);
}

Daha Hassas Sensörler

Gelişmiş sensörler kullanarak daha doğru kalp atış ölçümleri yapabiliriz.

MAX30102 Kullanımı

MAX30102, oksijen seviyesi ve kalp atış hızını hassas bir şekilde ölçebilen bir sensördür.

Bağlantılar

  1. VCC pinini 3.3V’a bağlayın.
  2. GND pinini GND’ye bağlayın.
  3. SDA ve SCL pinlerini Arduino’nun A4 ve A5 pinlerine bağlayın.

MAX30102 Kodu


#include <Wire.h>
#include "MAX30102.h"

MAX30102 pulseSensor;

void setup() {
    Serial.begin(115200);
    pulseSensor.begin();
}

void loop() {
    int bpm = pulseSensor.getHeartRate();
    Serial.print("BPM: ");
    Serial.println(bpm);
    delay(1000);
}

Yapay Zeka Destekli Tahmin Modelleri

Makine öğrenmesi ve derin öğrenme algoritmaları ile kullanıcının kalp sağlığı hakkında tahminler yapabiliriz.

Python ile Derin Öğrenme Modeli


import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# Örnek BPM verileri
X_train = np.array([[72], [75], [120], [130], [140]])
y_train = np.array([0, 0, 1, 1, 1])  # 1 = Anormal, 0 = Normal

# Modeli oluştur
model = Sequential([
    Dense(10, activation='relu', input_shape=(1,)),
    Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=100)

# Test
test_data = np.array([[80], [125]])
predictions = model.predict(test_data)
print(predictions)

Son Söz

Bu makalede veri kaydı, bulut tabanlı izleme, gelişmiş sensörler ve yapay zeka kullanımı gibi ileri seviye konuları ele aldık. Bu bilgileri kullanarak profesyonel bir sağlık takip sistemi geliştirebilirsiniz.

Yorum Gönder