5 Eylül 2015 Cumartesi

ANDROID UYGULAMA DESTEKLİ NABIZ ÖLÇER

     Merhaba arkadaşlar, bu proje Muhammed İçen ve Hasan Tunay ile birlikte gerçekleştirilmiştir. Özellikle projenin Android Programlama aşamasında ki yardımlarından dolayı  her iki arkadaşıma teşekkür ederim.
   Projemiz mikrodenetleyici tabanlı ve android uygulama destekli olacaktır. Bu projemizde parmaktan nabız ölçüp LCD  de göstereceğiz ve ayrıca ölçüm sonucunu HC-06 bluetooth  modül vasıtasıyla akıllı telefonumuzda oluşturduğumuz Android Uygulamamıza göndereceğiz.
     Nabız, kalbin 1 dakika içerisinde kaç defa kasıldığının karşılığıdır yani kalp atış hızıdır. Kalbin kasılması ile kan damarlara iletilir ve her bir kalp kasılmasında damarlardaki kan hacmi artar dolayısıyla da damar hacmi genişler. Damar elastik yapısı itibari ile bir süre sonra tekrar eski hacmine döner. Bu olay kalbin her bir kasılmasında tekrarlanır. Bu hacim değişikliğini vücudumuzun belirli bölgelerinde (el bileği, boyun, dirsek içi gibi) hissedebiliriz. 
    Projemizde nabız ölçümünü parmaktan yapacağız. Bunun için HRM-2511E infrared parmak sensörü kullanacağız. Bu sensörün içinde bir adet verici IR Led ve bir adet de alıcı foto-transistör vardır. Parmaktan geçen kan hacminin değişimi alıcı foto-transistöre düşen ışık şiddetinde değişikliğe neden olur. Bu değişim alıcı foto-transistör tarafından algılanır. Algılanan bu sinyal mV düzeyindedir ve elektriksel gürültü içermektedir. Mikrodenetleyicinin, nabızı doğru şekilde sayabilmesi için sensör çıkışındaki bu sinyalin şiddeti yükseltilir ve filtre devresinden geçirilir.
     Aşağıda infrared parmak sensörü ve iç yapısı yer almaktadır.



     Projemizin blok diyagramı da aşağıdaki gibi olacaktır.
     Şimdi yükseltici ve filtre devre şemasını inceliyelim. Aşağıda devre şemasından da görüldüğü üzere IR led 150Ω ve foto-transistör de 39KΩ üzerinden 5V ile beslenerek parmak sensörünün çalışması sağlanmıştır. Foto-transistörün çıkışı OP295 opampa giriş olarak verilmiştir. Yükseltme işlemi için LM358 de kullanılabilir fakat OP295 daha iyi sonuç vermektedir. Devredeki opamplar evirmeyen yükselteç olarak kullanılmıştır. Yani opampların giriş sinyali ile çıkış sinyali arasında herhangi bir faz farkı olmayıp sadece genlik yükseltilecektir. Evirmeyen girişli yükseltecin kazanç formulü Kv = 1 + (Rf / Ri) şeklindedir. Buna göre birinci opampın kazancı Kv1= 1 + (R5 / R4) = 122 ve ikinci opampın kazancı Kv2= 1 + (R7 / R6) = 560 dır. 100nF kondansatörler de filtre görevi görmektedirler.
     
    İkinci opampın çıkışındaki led kalp atışı ile eş zamanlı olarak yanıp sönecektir. Bu opampın çıkışı nabızın ölçülmesi için  PIC16F628 mikrodenetleyiciye giriş olarak verilecektir. Mikrodenetleyici nabızı yani kalbin 1 dakika içerisindeki kasılma sayısını belirledikden sonra sonucu LCD ye yazdıracaktır. Ayrıca bu ölçüm sonucu HC-06 bluetooth modül aracılığıyla akıllı telefonumuza gönderilip android uygulamamıza yazdırılacaktır.
     Kullandığımız bluetooth modül aşağıdaki gibidir. Bu modülerin en çok tercih edilenleri HC-05 ve HC-06 dır. Bu modüller mikrodenetleyici ile Uart Seri Haberleşme Protokolü ile haberleşir. Daha sonra diğer bluetooth uyumlu cihazlara bluetooth üzerinden yayın yapar. Projemizde HC-06 yı kullanmayı tercih ettik. HC-06 slave modda çalışırken, HC-05 hem master hem de slave modda çalışabilir. HC-06 Slave modda çalıştığından haberleşmeyi başlatamaz. Haberleşmeyi Master cihaz başlatabilir. Bu nedenle HC-06 nin haberleşmeye başlayabilmesi için Master cihaza ihtiyaç duyar. Master ve Slave durumu sadece haberleşmenin başlamasında önceliği belirler. Haberleşme başladıktan sonra herhangi bir öncelik söz konusu olmadan çift yönlü veri transferi yapılabilir.



     Nabız Ölçer cihazımızın genel devre şeması aşağıdaki gibi olacaktır. Devreyi besleyip ve sensörü parmağımıza takdıkdan sonra çıkışdaki led in sağlıklı bir şekilde yanıp sönmesi için 10KΩ luk pot ayarlanmalıdır. Yazacağımız program doğrultusunda nabız ölçme işleminin başlaması için devrede ki RA0 pinine bağlı butona veya da Android Uygulamamızda oluşturduğumuz butona dokunulmalıdır. Her bir ölçme işlemi tamamlandıktan sonra sonuç hem LCD yazdırılır hemde bluetooth ile Android Uygulamamıza yazdırılır.


     Mikrodenetleyici programını MikroC PRO for PIC derleyicisinde yazdık. Devremizde LCD yer aldığından ve HC-06 modül Uart Haberleşme ile çalıştığı için yazacağımız programa LCD ve Uart kütüphaneleri dahil edilmelidir. Şimdi PIC16F628 için yazdığımız programı ardından da Android Uygulamamızı inceleyeceğiz.


// LCD module connections
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

#define buton  porta.B0
#define nabiz_giris  porta.B1

unsigned short tmr1syc=0,nabiz_syc=0,nabiz_snc=0,nabiz_ort=0,i=0,j=0,bekle=1;
unsigned  nabiz_top=0,son;
bit izci;
char  txt[3];
char  txt1[5];
char uart_rd='h',uart_rd1='h';

//Timer1
//Prescaler 1:8; TMR1 Preload = 3036; Actual Interrupt Time : 500 ms

//Place/Copy this part in declaration section
void InitTimer1(){
  T1CON         = 0x31;
  TMR1IF_bit         = 0;
  TMR1H         = 0x0B;
  TMR1L         = 0xDC;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}

void Interrupt(){
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
    TMR1H         = 0x0B;
    TMR1L         = 0xDC;
    
     UART1_Write_text(txt);
        tmr1syc++;
    if(tmr1syc==20){    //10 saniiye
     tmr1syc=0;
     izci=1;


    }
  }
}
void nabiz_olcum(){

           if(nabiz_giris){
               //delay_ms(50);
               nabiz_syc++;
               //ByteToStr(nabiz_syc,txt);
               // Lcd_Out(1,1,txt);

               while(nabiz_giris);
              }
              
             
              if(izci==1){
                izci=0;
                nabiz_snc=nabiz_syc*6;
                nabiz_top=nabiz_top+nabiz_snc;
                

                 //WordToStr(nabiz_top,txt1);
                 // Lcd_Out(2,1,txt1);
                     
                 //  ByteToStr(nabiz_snc,txt);
                 // Lcd_Out(2,10,txt);
                 j++; if(j==3){
                       Lcd_Cmd(_LCD_CLEAR);
                       Lcd_Out(1,1,"NABIZ:");
                       Lcd_Out(1,12,"bmp");
                       son=nabiz_top/3;
                       ByteToStr(son,txt);
                       Lcd_Out(1,8,txt);
                       //UART1_Write_text(txt);
                       j=0;
                       nabiz_top=0;
                       }
                       
                 nabiz_syc=0;

                       }

  }

 void SARTLA(){
 CMCON=0x07;
   TRISA.B0=1;    //buton
   TRISA.B1=1;

 }

void main() {
SARTLA();

   UART1_Init(9600);               // Initialize UART module at 9600 bps
   delay_ms(100);
   Lcd_Init();                     // Initialize LCD
   Lcd_Cmd(_LCD_CLEAR);             // Clear display
   Lcd_Cmd(_LCD_CURSOR_OFF);        // Cursor off

    
BAS:
  Lcd_Cmd(_LCD_CLEAR);             // Clear display
  

    Lcd_Out(1,1,"NABIZ HESAPLAMA ");
    Lcd_Out(2,3,"BUTONA BASIN");
    bekle=1;
    while(bekle){if(!buton){/*uart1_write('k');*/ bekle=0; }
    
    if(uart_rd=='t') bekle=0;
    if (UART1_Data_Ready()) {     // If data is received,
      uart_rd = UART1_Read();     // read the received data,
    }
 }
     delay_ms(50);
    // while((uart_rd!='t'));
     Lcd_Cmd(_LCD_CLEAR);
     
     Lcd_Out(1,6,"NABIZ");
     Lcd_Out(2,3,"HESAPLANIYOR");

     InitTimer1();
     izci=0;

     while(1){
       if (UART1_Data_Ready()){     // If data is received,
      uart_rd1 = UART1_Read();     // read the received data,
        if(uart_rd1=='f'){
         tmr1on_bit=0;
          tmr1syc=0;
          uart_rd='h';
          uart_rd1='h';
          
          nabiz_syc=0;
          nabiz_snc=0;
          nabiz_top=0;
          j=0;
         goto BAS;}
         }
     
     nabiz_olcum();
              
      }
  
  }


    Nabız Ölçer cihazımızın Android Uygulamasını, MIT App Invertor 2 programında tasarladık. MIT App Invertor, Google ve MIT üniversitesinin birlikte geliştirdiği android işletim sistemi için program geliştirme platformudur. Bu platform  Designer ve Blocks olmak üzere 2 temel kısımdan oluşur. Designer kısmında uygulamanın ekran görseli tasarlanır. Blocks kısmında ise kod yazmadan puzzle şeklinde kod blokları birleştirilerek uygulamanın programı geliştirilir. Tabi kod yazılmasada puzzle ların doğru şekilde birleştirilmesi için temel programlama mantığının bilinmesi gerekir.
     MIT App Invertor platformunda uygulama geliştirmeye başlamak için öncelikle bir gmail hesabına sahip olmanız gerekmektedir. Daha sonra  http://ai2.appinventor.mit.edu/  web adresinden gmail hesabınızla giriş yaparak uygulama geliştirme platformuna erişmiş olursunuz.

     Designer kısmında tasarladığımız uygulama ekranı aşağıdaki gibidir. Nabız ölçüm sonucu ekranda ki kalbin ortasında gösterilecektir.


    Blocks kısmında geliştirdiğimiz programda aşağıdaki gibidir.

     Nabız Ölçer cihazımız kutulanmış vaziyette fotoğraflardaki gibidir. Cihaz ve Android Uygulamanın çalışmasını da aşağıya koyduğum videodan inceleyebilirsiniz.








    İlgilenenlere kolay gelsin. Başarılar Dilerim...





6 yorum:

  1. Aynı sistemi telefon modülü ile ama uygulamasiz gönderimi için programı nasıl yazabiliriz

    YanıtlaSil
  2. Aynı sistemi telefon modülü ile ama uygulamasiz gönderimi için programı nasıl yazabiliriz

    YanıtlaSil
  3. Telefon modülü derken GSM modülden mi bahsediyorsunuz.

    YanıtlaSil
  4. acaba devrenin kutulanmamış biçiminide atabilir misiniz

    YanıtlaSil
  5. android kısmında appinventor ile ilgili olan kısım hakkında biraz daha detaylı bilgi verebilirmisiniz veya puzzle seklindeki kdoların yerleştirilmesi hakkında nerden bilgi edinebilirim

    YanıtlaSil
  6. hocam app inventor da designer resmini de atabilirmisiniz

    YanıtlaSil