back to top

Arduino ile Nabız Ölçer

Herkese merhabalar, bu yazımızda medikal sensörlerden biri olan Pulse nabız sensörünü kullanarak nabız verisini okumayı ve elde ettiğimiz sonucu Nokia 5110 ekranda göstermeyi öğreneceğiz. Bu sayede kendi nabız ölçerimizi üretmiş olacağız.

Yapacağımız Projenin Son Hali

Nokia 5110 ekranların kullanımıyla ilgili detaylı bilgiye bu yazımızdan ulaşabilirsiniz >>> Arduino ile Nokia 5110 ekranı kullanımı

Bu yazıda anlatılan proje için ihtiyacınız olan malzemeler:

Pulse Nabız Ölçer Nedir ve Nasıl Çalışır?

Öncelikle, projemizin en önemli malzemelerinden biri olan Pulse Nabız Ölçer’i tanıyarak başlayalım. Pulse Nabız Ölçer, parmak ucunuza veya kulağınıza sabitleyerek kolayca nabzınızı ölçmeye yarayan bir sensördür. Bu sensörü 3V veya 5V ile beslemek mümkündür. Üzerinde bulunan gürültü engelleme özellikli devre sayesinde temiz ve stabil bir ölçüm alabilirsiniz. 

Pulse Nabız Ölçer’in çalışma prensibi şu şekildedir: Sensör parmak ucunuza veya kulağınıza gönderdiği ışığın ne kadarının yansıdığı bilgisini ölçerek sinyal pini üzerinden 0 ile 1023 arasında analog bir değer verir. Bu değer nabız atışı sırasında yükselir ve daha sonra tekrar düşer. Arduino’ya yazacağımız kod bu değişimleri kullanarak dakikadaki nabız sayımızı ölçer.

Nabız Ölçer Projesi

Projemiz iki kısımdan oluşacak. İlk kısımda, Pulse sensörü ile Arduino arasındaki bağlantıyı gerçekleştireceğiz. Bu kısmı başarıyla tamamladıktan sonra ise elde ettiğimiz nabız değerini 5110 ekranımıza yansıtacağız. İlk kısımla başlayalım.

Sensör bağlantılarını bu şekilde gerçekleştiriyoruz:

Pulse Sensörünün Bağlantısı

Sıra Arduino için olan kodu yazmaya geldi. Arduino IDE’yi açtıktan sonra, sensörümüzü kullanabilmek için yapmamız gereken ilk şey gerekli kütüphaneyi bilgisayarımıza kurmak. Bunun için, yukarıdaki seçeneklerden “Araçlar” seçeneğine tıklayıp oradan “libraryleri düzenle” seçeneğine tıklamalıyız. Bu işlemin ardından “Library Yönetici” olarak adlandırılan sekme açılacaktır. Buradan gerekli kütüphaneyi kurmak için yapmamız gereken arama kısmına “pulse sensor playground” yazmak, “versiyon seç” kısmından en güncel versiyonu seçmek ve “Kur” butonuna basmak.

Pulse Sensöründen Gelen Veriyi Okuma

Gerekli kütüphaneyi başarıyla kurduğumuza göre sıradaki adıma geçebiliriz. Yukarıdaki kısımda da anlattığım üzere, Arduino nabız atışının gerçekleşip gerçekleşmediğini sensörden gelen analog değerin büyüklüğüne göre karar veriyor. Bu nedenle bizim önceden bir threshold, yani eşik değeri, belirlememiz gerekiyor. Bu sayede Arduino belirlediğimiz eşik değerinin üzerinde bir sinyal geldiğinde nabız atışının gerçekleştiğini anlayabilecek. Eşik değerini belirleyebilmek için sensörden gelen değerleri görmemiz gerekiyor. Bunu yapmanın en kolay yolu indirmiş olduğumuz kütüphanede yer alan örnek kodlardan birini kullanmak. Gerekli örnek kod dosyasını açabilmek için sırasıyla Dosya>Örnekler>Pulse Sensor Playground>GettingStartedProject seçeneklerine tıklıyoruz. Daha sonra, ekranda açılmış olan kodu Arduino’muza yüklüyoruz. Şimdi gelen sinyalleri bilgisayarımızda görüntüleyebilmek için Araçlar>Seri Çizici seçeneklerine tıklıyoruz. Ekranda, sensörden gelen veriler ışığında ilerleyen bir çizgi oluştuğunu göreceksiniz. Şimdi yapmanız gereken sensöre parmak ucunuzu yerleştirmek. Şimdi ise ekranda aşağıdaki görseldeki gibi dalgalar oluştuğunu görmeniz gerekiyor. Eğer durum buysa herşey yolunda gidiyor demektir ve yolumuza devam edebiliriz. Ancak aşağıdakine benzer bir sinyal akışı elde edemediyseniz bu yazının en aşağısında bulunan “Sorun Giderme” kısmını inceleyebilirsiniz.

Eşik Değerini Belirleme

Sıradaki adım, ekranınızdaki grafiğe göre eşik değerini belirlemek. Bunun için öyle bir değer belirlemeliyiz ki grafikteki yükselişler bu değerin üzerine çıkmalı ama yükselişler dışındaki kısımlar da bu değerin altında kalmalı. Örneğin aşağıdaki görselde 520 uygun bir eşik değeri. Ama siz kendi değerinizi ekranınızdaki grafiğe göre belirlemelisiniz çünkü farklılık gösterebilir.

Eşik değerimizi de belirlediğimize göre sıra sensörümüz ile nabız değerini ölçüp Nokia 5110 ekranımıza yazdırmada. Bunun için öncelikle devremize 5110 ekranımızı eklemeliyiz. Aşağıdaki devre şemasında bunun nasıl yapıldığını görebilirsiniz.

Kod

Şimdi sıra, sensörden aldığı veriyle dakikadaki nabzı hesaplayıp 5110 ekranına yazdıracak kodu yazmaya geldi. Bu aşamada Pulse Playground ve LCD5110 Basic kütüphaneleri işimizi oldukça kolaylaştırıyor. Yazmamız gereken kodu aşağıda bulabilirsiniz. Her bir kısmın ne işe yaradığını yanlarına yorum satırı olarak yazdım. Yine de aklınıza takılan herhangi bir nokta olursa aşağıdaki Yorumlar kısmından sorabilirsiniz. İhtiyacımız olan  LCD5110 Basic kütüphanesini buradan indirip arduino/library/ klasörüne atabilirsiniz. Aşağıdaki kodda yer alan threshold değişkeninin değerini yazının öncei kısmından belirlemiş olduğunuz değerle değiştirmeyi unutmayın.

#include <LCD5110_Basic.h> //5110 ekranımız için gerekli kütüphaneyi ekliyoruz.
LCD5110 myGLCD(8, 9, 10, 11, 12); // Ekran objemizi bağlamış olduğumuz pinleri belirterek oluşturuyoruz
#define USE_ARDUINO_INTERRUPTS true    // Pulse kütüphanesinin daha doğru ölçüm yapabilmesi için bu ayarı etkinleştiriyoruz
#include <PulseSensorPlayground.h> //Yazının başında bilgisayarımıza kurmuş olduğumuz Pulse Playground kütüphanesini ekliyoruz.
int nabiz; //İçinde dakikadaki nabzı tutacağımız değişkeni oluşturuyoruz.
int lcd_ledi = 6; //5110 ekranımızın arka plan aydınlatmasının bağlı olduğu pini belirliyoruz.
extern uint8_t SmallFont[];
extern uint8_t BigNumbers[]; //5110 ekranımızda yazacağımız yazı için gerekli fontları ekliyoruz.
const int PulseWire = 0; // Pulse sensörümüzü bağlamış olduğumuz Analog pinini belirliyoruz.
const int LED13 = 13; // Arduino üzerindeki ledin nabzımızla birlikte yanıp sönmesi için bu değişkeni 13 numaralı pin olarak ayarlıyoruz.
int Threshold = 580; // Yazının başında belirlemiş olduğumuz eşik değerini bu değişkene atıyoruz.
PulseSensorPlayground pulseSensor; //Sensörümüzü kodumuzda kullanabilmek için onu obje olarak oluşturuyoruz.

void setup() {
  Serial.begin(9600);  //Bilgisayrımızla olan seri iletişimi başlatıyoruz.
  pulseSensor.analogInput(PulseWire); //Pulse sensörünün bağlıu olduğu pini belirliyoruz.
  pulseSensor.blinkOnPulse(LED13);       //arduino üzerindeki ledin nabzımızla yanıp sönmesini istediğimizi söylüyoruz.
  pulseSensor.setThreshold(Threshold); //Değişkene atamış olduğumuz eşik değerini uyguluyoruz.
  // put your setup code here, to run once:
  digitalWrite(lcd_ledi, HIGH); //5110 ekranın arka plan aydınlatmasına güç veriyoruz.
  myGLCD.InitLCD(); //5110 ekranımızı başlatıyoruz.
  myGLCD.setContrast(58); //5110 ekranımızın kontrastını belirliyoruz.
  myGLCD.setFont(SmallFont); //Birazdan yazacağımız yazıların küçük fontla yazılmasını sağlıyoruz.
  //myGLCD.drawBitmap(0,0, cmon, 84, 48);
  myGLCD.print("Dakikadaki", CENTER, 0);
  myGLCD.print("Nabziniz:", CENTER, 15); //Ekrana dakikadaki nabzınız yazdırıyoruz.
  myGLCD.setFont(BigNumbers); //Birazdan yazacağımız yazıların büyük sayı fontuyla yazılmasını sağlıyoruz.
  myGLCD.printNumI(0, CENTER, 25); //Dakikadaki nabzınız yazısının altına 0 yazıyoruz.
  if (pulseSensor.begin()) {
    Serial.println("Pulse sensörü objesini yarattık."); 
  } //Pulse sensörü başarıyla başlatılırsa bilgisayara mesaj gönderioyoruz.

}

void loop() {
  // put your main code here, to run repeatedly:
  if (pulseSensor.sawStartOfBeat()) { //Eğer nabız algılarsak
    nabiz = pulseSensor.getBeatsPerMinute(); //Dakikadaki nabzı nabiz değişkenine kaydediyoruz.
    myGLCD.clrScr(); //5110 ekranı temizliyoruz.
    myGLCD.setFont(SmallFont); //Birazdan yazacağımız yazıların küçük fontla yazılmasını sağlıyoruz.
    myGLCD.print("Dakikadaki", CENTER, 0);
    myGLCD.print("Nabziniz:", CENTER, 15); //Ekrana dakikadaki nabzınız yazdırıyoruz.
    myGLCD.setFont(BigNumbers); //Birazdan yazacağımız yazıların büyük sayı fontuyla yazılmasını sağlıyoruz.
    myGLCD.printNumI( nabiz, CENTER, 25); //Dakikadaki nabzınız yazısının altına dakikadki nabzı değerini yazıyoruz.
    Serial.println("Nabız attı. ");
    Serial.print("BPM: ");                        
    Serial.println(nabiz); //Dakikdaki nabız değerini aynıo zamanda bilgisayarımıza da gönderiyoruz.
  }


  delay(20); //20 milisaniye bekletiyoruyuz.

}

Arduino ile Nabız Ölçer projemizi tamamlamış olduk. Proje ile ilgili aklınıza takılan her türlü soru ve proje hakkındaki yorumlarınızı bekliyorum. Sonraki projelerde görüşmek üzere… 👋


Sorun Giderme

Eğer sensörünüzden düzgün bir veri akışı elde edemediyseniz bunun çeşitli sebepleri olabilir. Yazının bu bölümünden birkaç olası sorundan ve çözümlerinde bahsedeceğim.

Parmağınızı sensöre bastırma gücünüz oldukça önemli. Çok bastırmanız halinde parmağınıza kan gitmeyeceğinden nabzını ölçmek zorlaşır. Yeterince bastırmamanız durumunda ise sensörle parmağınız arasına ışık gürültüsü girer ve düzgün bir veri akışı elde edemezsiniz. Bu nedenle parmağınızı sensöre ne çok bastırmalısınız, ne de çok az bastırmalısınız.

Karşılaşabileceğiniz bir diğer sorun ise benim de projeyi yapış sürecinde karşılaştığım bir sorun. Arduino’yu besleme şeklinize göre bazı durumlarda sensör düzgün çalışmayabiliyor. Örneğin benim yaşadığım durumda, Arduino’nun bağlı olduğu dizüstü bilgisayar şarja bağlıyken düzgün bir veri akışı elde edemezken dizüstü bilgisayarı şarjdan çıkarınca düzgün bir veri akışı elde edebiliyordum. Aynı şekilde, denediğim farklı bilgisayarlarda da bazılarında düzgün sonuçlar elde ederken bazılarında edemedim. Bu nedenle eğer sensörden doğru veri elde etmede sorun yaşıyorsanız farklı bir bilgisayarda veya şarja takılı/değilken denemeyi, hiçbiri işe yaramaz ise Arduino’yu dışardan beslemeyi deneyebilirsiniz.

Son Çıkan Yazılar

51 YORUMLAR

    • Merhabalar,
      Yazıda da bahsettiğim üzere sensörden sağlıklı bir veri akışı alamamanızın pek çok sebebi olabilir. Eğer yazıdaki Sorun Giderme kısmını okuyup denediyseniz ve halen bu sorunu yaşıyorsanız size yardımcı olmaktan mutluluk duyarım. Yazının ilk kısımlarından bahsettiğim grafiğinizin ekran görüntüsünü alıp [email protected] mailine gönderirseniz en azından problemin nereden kaynaklandığını tespit edip size destek olabilirim. İyi günler 🙂

    • Merhabalar,
      Projenin düzgün çalışığ çalışmaması pek çok faktöre bağlı. Bu nedenle yapmamız gereken ilk şey problemin kaynağını anlamak. Eğer problemin ne ile alakalı olduğu hakkında bir fikriniz varsa paylaşabilir misiniz? Eğer problemin kaynağı ile ilgili hiçbir fikriniz yok ise yazının ilk kısımlarından bahsettiğim grafiğinizin ekran görüntüsünü alıp [email protected] mailine gönderirseniz en azından problemin nereden kaynaklandığını tespit edip size destek olabilirim. İyi günler dilerim 🙂

    • Yapmış olduğunuz projenin çalışmaması pek çok nedene bağlı olabilir. Hatalı bağlantı, yanlış belirlenen bir eşik değeri, parmağınızı sensöre ne kadar bastırdığınız, sensörün güç beslenmesinin sağlıklı olup olmaması bunlardan yalnızca birkaçı. Eğer sorunun kaynağı hakkında en ufak bir fikriniz yok ise ve yazının soz kısmında yer alan sorun giderme basamaklarını uygulamış iseniz yazının ilk kısımlarından bahsettiğim grafiğinizin ekran görüntüsünü alıp [email protected] mailine gönderirseniz en azından problemin nereden kaynaklandığını tespit edip size destek olabilirim. İyi günler 🙂

    • Merhabalar,
      Öncelikle yazıya olan ilginiz için teşekkürler 🙂 2×16 lcd ekranın Arduino ile kullanımıyla ilgili detaylı bir yazıya buradan ulaşabilirsiniz. Bu projeye nasıl dahil edebileceğinize gelecek olursak, kodun baş kısmında yer alan 5110 ekranın kütüphanesini ekleme ve ekranın bağlandığı pinleri belirleme kodlarını az önce bahsetmiş olduğum yazıda yer alanlarla değiştirmelisiniz. Daha sonramyGLCD.setFont(SmallFont); //Birazdan yazacağımız yazıların küçük fontla yazılmasını sağlıyoruz.
      myGLCD.print("Dakikadaki", CENTER, 0);
      myGLCD.print("Nabziniz:", CENTER, 15);
      myGLCD.setFont(BigNumbers);
      myGLCD.printNumI( nabiz, CENTER, 25);
      ve benzeri ekrana yazı yazdırdığımız yerlerdeki kodları lcd.print("Nabziniz: ");
      lcd.print(String(nabiz));
      şeklind yeni kütüphaneye uyarlıyoruz. Ayrıca eski kodda myGLCD.clrScr(); satırıyla ekrana temizlerken yeni kodda lcd.clear ( ); satırıyla temizlemelisiniz. Projeyi 2×16 ekrana nasıl uyarlayabileceğiniz hakkında bir fikir vermeye ve yol göstermeye çalıştım. Umarım faydalı olmuştur. Eğer herhangi bir noktada takılırsanız veya daha detaylı bir yardıma ihtiyacınız olursa tekrardan iletişime geçebilirsiniz. İyi günler dilerim…

  1. Aşağıdaki kodda yer alan threshold değişkeninin değerini yazının öncei kısmından belirlemiş olduğunuz değerle değiştirmeyi unutmayın. burayı açıklarmısınız

    • Tabii ki açıklarım👍 Yazının ilk kısmında GettingStartedProject adında bir örneği Arduino’ya yükleyip sensörden gelen veriyi bir grafik halinde bilgisayarımızda görüyoruz. Yazının başındaki grafik resminde de görebileceğiniz üzere grafik belirli noktalarda yükseliyor ve sonra tekrar alçalıyor. Bir eşik değeri belirlerken yapmamız gereken grafiğin en yüksekteki değerinin belirlediğimiz eşik değerinden yukarıda, grafiğin diğer kısımlarının ise eşik değerinin altında olduğundan emin olmak. Örneğin yazının başında paylaşmış olduğum grafiği incelediğinizde, grafiğin yükselirken 520’yi geçtiğini ve başka hiçbir kısmın 520’yi geçmediğini görebilirsiniz. Bu nedenle o örnekte uygun eşik değeri 520 olacaktır. Fakat bu sizin için farklı olabilir, bu nedenle bahsettiğim adımlara yaparak kendi eşik değerinizi bulmalısınız. Sizin bahsettiğiniz cümlede ise şundan bahsediyordum: En altta paylaşmış olduğum kodda int Threshold = 580; şeklinde bir satır var. Bu satırda yer alan değeri az önce bahsetmiş olduğum şekilde bulduğunuz eşik değeri ile değiştirmelisiniz. Örneğin grafiğinizi inceleyerek eşik değerinin 410 olduğuna karar verdiyseniz bu satırı int Threshold = 410; şeklinde değiştirmelisiniz. Umarım sorunuzu yanıtlayabilmişimdir. Kafanıza takılan başka bir şey olursa yazmayı unutmayın. İyi günler:)

  2. merhaba biz kodu yukleyemıyoruz projemız var nasıl kodlayacagız yardım eder mısınız . ındırme dosyasaını ındırdım ama gerısını getıremıyoruz lutfen yardımcı olur musunuz

    • Merhabalar,
      Kütüphaneyi yazıda bahsedildiği şekilde kütüphaneyi indirip kurmayı unutmayın. Eğer bunu yaptıysanız karşınıza çıkan hatayı daha detaylı paylaşırsanız yardımcı olmaya çalışırım.

  3. Ben adım adım yaptım lakin 5110 ekranında mavi ışık yandı harfler falan gelmedi nabız sensörümde çok değişik algılıyor sanki nabzımı ölçmüyor gürültü algılıyor gibi lütfen yardım edin

  4. benim portum COM4 eşik değerilerini fazla yüksekte gösteriyor ve sizin yaptıklarınızın birebir aynısını yazdım kod ile beraber fakat 5110 ekranda hep sayı gösteriyor 230, 110 bazen 30. Kendi kendine sayılar değişiyor.
    Ne yapmam lazım?

  5. Merhaba öncelikle proje için teşekkür ederim. Emeğinize sağlık. Burada pulse sensor yerine aynı kodlarla “Klipsli Nabız Ölçer Sensör – Ear-clip Heart Rate Sensor” sensörünü kullanmamız mümkün mü?

    • Merhabalar,
      Ben de projeye olan ilginiz için teşekkür ederim 🙂 Yazıda yer alan kod ve kütüphane kullanılan sensöre özeldir. Bahsetmiş olduğunuz sensör için farklı bir yaklaşım gereklidir. Daha detaylı bilgiye ulaşmak isterseniz konuyla ilgili İngilizce bir kaynağa buradan ulaşabilirsiniz.

  6. Merhaba, yazınızdaki adımları harfiyen yaptım. Sensörden düzgün veri akışı alabiliyorum fakat 5110 ekrana çıktı gelmiyor. Hata kodunu da bırakıyorum, yardımcı olursanız sevinirim.

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino: In function ‘void setup()’:

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino:25:39: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

    myGLCD.print(“Dakikadaki”, CENTER, 0);

    ^

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino:26:39: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

    myGLCD.print(“Nabziniz:”, CENTER, 15); //Ekrana dakikadaki nabzınız yazdırıyoruz.

    ^

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino: In function ‘void loop()’:

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino:41:41: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

    myGLCD.print(“Dakikadaki”, CENTER, 0);

    ^

    C:\Users\Furkan Zora\Documents\Arduino\sketch_may14a\sketch_may14a.ino:42:41: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

    myGLCD.print(“Nabziniz:”, CENTER, 15); //Ekrana dakikadaki nabzınız yazdırıyoruz.

    ^

  7. Merhabalar;
    Ürünleri bu siteden aldım ve söylenildiği üzere bütün her şeyi yaptım lakin sonuç olumsuz. Ekranda sadece mavi led yanıyor hiç bir şey olmuyor.

    • Merhabalar,
      Sorun giderme kısmını incelemenizi öneririm. Sağlıklı bir veri akışı alamamanıza neden olabilecek olası sorunlar orada yer almaktadır. Eğer sorununuz devam ederse tekrar iletişime geçebilirsiniz. İyi günler dilerim…

  8. Kodu oldugu gıbı attım gerekli kutuphaneleride ekledim. bana ” Stray ‘#’ in program ” hatası verıp duruyor bunun sebebi nedir sizce ?

  9. Merhabalar yazı ve proje çok güzel. Ancak ben Nokia 5110 kütüphanesini indirdim ve bir zip dosyası olarak indi sonra da Arduino/libraries klasörüne attım ama kodu yüklerken kütüphane indirilmedi diyor . Ne yapabilirim ?
    Teşekkür ederim.

    • Merhabalar,
      Arduino IDE’ye nasıl kütüphane eklyeceğinizi öğrenmek için bu yazımıza göz atabilirsiniz. “ZIP Dosyasından Kütüphaneyi Eklemek” başlığının altındaki adımları takip ederek kütüphaneyi kurabilirsiniz.

  10. Hocam merhaba, ellerinize sağlık öncelikle.
    Benim Ateş ve nabız ölçer yapmam lazım. Bu projeye nasıl ilave edebilirim sıcaklık ölçümünü biraaz anlatabilir misiniz. Kodları birbirine nasıl entegre ediceğimi falan bilmiyorum devre şebasıda yok hiç bişey yok yani :(( ne önerirsiniz. çok teşekkür ederim.

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz