Arduino ile Nabız Ölçer Yapımı KY-039 Kullanımı
Arduino ile nabız ölçer yapımı, geliştirme kartları, kodlama gibi konulara ilk defa giriş yapan kullanıcılar için oldukça ilgi çekici bir konsepttir. Bu proje ile geliştirme kartınızı gerçek bir olgu olan nabız sayısı ile birleştiriyoruz.
Diğer nabız okuma yazılarımız:
Bu sensörün çalışma mantığı aslında oldukça basittir. Sensörün sağladığı kızılötesi ışık ve bu kızılötesi ışığı algılayan kısımdan ibarettir.
Kısacası: Parmağınızı IR LED ile sensörün ışık transistörü arasına yerleştirin. Kalp atışınız, parmağınızdaki kan damarlarını genişletir ve bu da IR’yi filtreler. Bu, titreşimli bir sinyal oluşturur.
Bu projede, bu sinyali nasıl bir kalp atış hızına yani nabıza dönüştürüldüğünü anlatıyoruz.
Gerekli Malzemeler
- KY-039 Nabız Sensörü
- Geliştirme Kartı
- Bağlantı Kabloları
KY-039 Nabız Sensörü Nedir?
KY-039 nabız sensörü, kızılötesi diyot ve foto transistör arasına bir insan parmağı yerleştirildiğinde nabzı algılamak için tasarlanmıştır. Nabız, sinyal çıkış pininde görülecektir. Ayrıca KY-039 nabız sensörünün veri sayfasına buradan bakabilirsiniz.
Bu sensör, ışığın varlığını, bu durumda bir parmaktan ne kadar ışık geçtiğini algılamak için bir foto transistör kullanarak çalışır. Kan hareket ettiğinde, ışık miktarı değişir ve bu değişiklik bir nabız olarak algılanabilir.
Devre Şeması
Arduino Kodu
Bu kod ile seri ekran üzerinden ya da seri çizici üzerinden nabız verilerini kontrol edebilirsiniz.
#define ornekleme_boyutu 4 #define yukselis_esigi 4 int sensorPin = 0; void setup() { Serial.begin(9600); } void loop () { float oku[ornekleme_boyutu], toplam; long int simdi, ptr; float son, okuyucu, baslat; float ilk, ikinci, ucuncu, onceki, degeri_yazdir; bool yukselis; int yukselis_sayisi; int n; long int son_nabiz; for (int i = 0; i < ornekleme_boyutu; i++) oku[i] = 0; toplam = 0; ptr = 0; while(1) { //20ms bekleme süresi ile 50Hz elektrik hattından gelen gürültüyü engeller n = 0; baslat = millis(); okuyucu = 0.; do { okuyucu += analogRead (sensorPin); n++; simdi = millis(); } while (simdi < baslat + 20); okuyucu /= n; // ortalama aldık // diziye en yeni ölçümü ekle // ve diziden en eski ölçümü çıkar // toplam son ölçümlerini koru toplam -= oku[ptr]; toplam += okuyucu; oku[ptr] = okuyucu; son = toplam / ornekleme_boyutu; // simdi dizideki değerlerin ortalamasını tutar // yukselis egrisini kontrol et if (son > onceki) { yukselis_sayisi++; if (!yukselis && yukselis_sayisi > yukselis_esigi) { // bir kalp atışı anlamına gelen bir yukselis eğrisi tespit ettik. // son vuruştan bu yana geçen süreyi kaydeder, önceki ikiliyi takip eder // (ilk, ikinci, ucuncu) ortalama alınır. // yükseliş kontrolu aynı yükselişi birden fazla algılamamızı engeller. yukselis = true; ilk = millis() - son_nabiz; son_nabiz = millis(); // ortalamayi hesaplar degeri_yazdir = 60000. / (0.4 * ilk + 0.3 * ikinci + 0.3 * ucuncu); Serial.print(degeri_yazdir); Serial.print('\n'); ucuncu = ikinci; ikinci = ilk; } } else { // egri dusuyor yukselis = false; yukselis_sayisi = 0; } onceki = son; ptr++; ptr %= ornekleme_boyutu; } }
Kodun Açıklaması
KY-039 sensöründen sadece değerleri okuyup çizdirirseniz, şöyle bir şey elde edersiniz:
int sensorPin = 0;
void setup() {
Serial.begin(9600);
}
void loop ()
{
while(1)
{
Serial.print(analogRead(sensorPin));
Serial.print('\n');
}
}
Değerler tamsayı değerlerdir. Çok doğru değildir. Bunun yerine bir grup ortalamasını hesaplayan ve ortalamayı çizdiren örnekle deneyelim
Daha düzgün bir çıktı elde etmek için sensörden ortalama 4 son okumayı alalım:
#define ornekleme_boyutu 4
Bu örnekler bir dizi içeresinde tutalım:
float oku[ornekleme_boyutu], toplam;
Her yeni okuma için toplamdan en eski okumayı çıkarır ve en yeni okumayı toplama ekleriz. Dizide en eski okumayı en yeni okumayla değiştirelim:
okuyucu += analogRead (sensorPin);
n++;
simdi = millis();
Seri monitörde dizi boyutu 4 ve baud hızı 9600 ile şöyle bir çizim elde ederiz:
Burada gerçek kalp atışlarını dik bir yükselen eğri olarak görüyorsunuz. Ama aynı zamanda küçük bir zikzak deseni de görüyorsunuz. Küçük zikzak ışıktan kaynaklanıyor. Ortamdaki elektrik şebekesi 220 V, 50 Hz AC’dir. Yani kullandığım lamba, saniyede 50 kez yanıp sönüyor, görünüşe göre IR bandında da ışık yoğunluğunda bir artış var. Bu 50 Hz gürültüyü yumuşatmak gerekiyor. 20 ms’lik bir süre boyunca sensörden değerleri okuyup tüm değerlerin ortalamasını alırsak bu gürültüyü kaldırabiliriz.
n = 0;
baslat = millis();
okuyucu = 0.;
do
{
okuyucu += analogRead (sensorPin);
n++;
simdi = millis();
}
while (simdi < baslat + 20);
okuyucu /= n;
Bu kod ile sensör okumalarını 20 ms’lik parçalar halinde alıyoruz, bu da yapay ışığın neden olduğu 50 Hz’lik titremeyi ortadan kaldıracaktır. 60 Hz’lik kullanan bir şebekeniz varsa , bunun yerine 16,67 ms’lik parçalar kullanabilirsiniz:
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.