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
- Arduino Uno
- Pulse Sensor (Kalp Atış Hızı Sensörü)
- 10k Ohm direnç
- Jumper kablolar
- Breadboard
Bağlantı Şeması
Aşağıdaki bağlantıları yaparak devreyi kurabilirsiniz:
- Pulse Sensor’un VCC bacağını Arduino’nun 5V pinine bağlayın.
- Pulse Sensor’un GND bacağını Arduino’nun GND pinine bağlayın.
- 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.
- Arduino IDE’yi açın.
- Araçlar > Seri Port seçeneğinden doğru portu seçin.
- 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:
- LCD’nin VCC bacağını 5V’a bağlayın.
- LCD’nin GND bacağını Arduino’nun GND’sine bağlayın.
- LCD’nin SDA bacağını Arduino’nun A4 pinine bağlayın.
- 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ı
- HC-05’in VCC bacağını 5V’a bağlayın.
- HC-05’in GND bacağını Arduino’nun GND’sine bağlayın.
- HC-05’in TX bacağını Arduino’nun RX (pin 0)’ına bağlayın.
- 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
- ESP8266’nın VCC bacağını 3.3V’a bağlayın.
- ESP8266’nın GND bacağını Arduino’nun GND’sine bağlayın.
- ESP8266’nın TX bacağını Arduino’nun RX (pin 2)’ine bağlayın.
- 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ı
- MIT App Inventor web sitesine girin.
- Yeni bir proje oluşturun ve Bluetooth Client bileşenini ekleyin.
- 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
- SD kart modülünün VCC pinini 5V’a bağlayın.
- GND pinini Arduino’nun GND’sine bağlayın.
- 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
- VCC pinini 3.3V’a bağlayın.
- GND pinini GND’ye bağlayın.
- 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.