DETEKTOR DETAK JANTUNG MENGGUNAKAN SENSOR


Monitoring kesehatan tubuh saat ini sangat penting seiring semakin banyaknya penyakit yang muncul. Salah satu cara untuk melakukan monitoring kesehatan yang mudah dilakukan adalah dengan memperhatikan kesehatan detak jantung. Oleh karena itu, untuk memenuhi tugas proyek matakuliah EL3014 Sistem Mikroprosesor, saya bersama teman saya Luisa Catherine membuat suatu alat untuk monitoring detak jantung.
 Alat penghitung detak jantung yang kami buat memiliki spesifikasi dapat menampilkan angka detak jantung setiap menit dalam bpm pada suatu layar LCD. Layar LCD tersebut dihubungkan dengan suatu rangkaian yang berisikan mikrokontroler. Untuk pembacaan detak jantungnya sendiri kami menggunakan modul pulse sensor yang sudah jadi yang kami pinjam dari dosen kami. Penjelasan tentang sensor tersebut dapat dilihat di http://elektrologi.kabarkita.org/sensor-detak-jantung/. Berikut gambar sensor yang kami gunakan:
Tampak Depan Pulse Sensor
Tampak Belakang Pulse Sensor
Alat yang kami buat menggunakan beberapa komponen sebagai berikut:
·         Mikrokontroler ATMega16
·         Modul pulse sensor CJMCU
·         LCD Display 16x2
·         PCB dot matrix
·         Rangkaian regulator tegangan menggunakan LM7805
Pada alat detektor detak jantung ini, sinyal akan keluar dari sensor detak jantung yang menggunakan Pulse Heart Rate Sensor CJMCU dan menjadi input pada sistem mikrokontroler. Sensor detak jantung dihubungkan pada PORTA0 dari ATMega16. Port tersebut merupakan port ADC pada ATMega16 yang akan menerima masukan sinyal dari sensor detak jantung. Hasil dari pengolahan informasi sinyal tersebut kemudian ditampilkan pada LCD 16x2 yang terhubung dengan PORTB dan beberapa PORTD dari ATMega16.
Untuk implementasi yang kami lakukan, pertama-tama kami mengecek apakah sensor dapat bekerja atau tidak terlebih dahulu menggunakan kode program pada Arduino yang kami dapatkan dari www.pulsesensor.com. Hasil yang kami dapatkan menggunakan Arduino sebagai berikut:
 Selanjutnya kami cobakan rangkaian yang telah kami rancang pada breadboard seperti berikut:
Setelah rancangan desain rangkaian tersebut dapat dijalankan, kami melakukan implementasi rangkaian menggunakan PCB dot matrix.
Tampak belakang rangkaian pada PCB dot matrix
Gambar rangkaian jadi 

Adapun penjelasan dari cara kerja software kami adalah sebagai berikut:
Inter Beat Interval (IBI): waktu antar ‘instantaneous moment’ detak jantung, dapat diprediksi dengan bentuk dan pola dari gelombangnya.
        Kode ini didesain untuk mengukur IBI dengan cara mengukur waktu saat sinyal mencapai 50% dari amplitude. BPM diturunkan dengan merata-ratakan 10 nilai IBI terakhir. Program terdiri atas 5 bagian besar, yaitu inisialisasi ADC, pembacaan ADC, inisialisasi interrupt, ISR2, dan program utama.
       Prosedur inisialisasi ADC digunakan untuk menginisialisasi register-register yang dibutuhkan. Aref diset = AVcc (ADC voltage reference pin) pada register ADMUX. Sedangkan register ADCSRA diset untuk enable ADC dan ADPS (ADC Prescaler Select Bit) diset 111 atau division factor 128. Pembacaan ADC dimulai dengan memilih kanal ADC, dipilih dari 0 sampai 7. Konversi single dimulai dan ditunggu hingga selesai. ADIF diclear dan nilai ADC di return.
      Untuk mendapatkan nilai BPM, pertama-tama dibutuhkan sample rate yang konstan dengan resolusi yang cukup tinggi untuk mendapatkan pengukuran yang akurat mengenai waktu antar detakan. Untuk itu timer2 pada ATMega16 diset pada sample rate 500Hz dan resolusi 2mS. Prosedur init_int pun diset untuk mendapatkan interupsi setiap 2mS. Source code untuk prosedur init_int ini adalah:
void init_int (void){
      TCCR2 = 0b00001101;
      OCR2 = 0x7C;
      TIMSK = 0x80;
      sei();
}
        Nilai register TCCR2 diset pada 0b00001101, yaitu bekerja pada mode CTC dengan prescaler sebesar 128. Nilai register OCR2 pada 0x7C. Nilai register TIMSK diset pada 0x80. Bit OCF2 (Output Compare Flag 2) diset 1, yaitu untuk mengaktifkan timer/counter 2 compare match interrupt pada saat timer2 = OCR2. sei() digunakan untuk mengaktifkan interrupt. Pengesetan register-register tersebut akan menyebabkan program menghitung hingga 124 terus-menerus, sehingga dengan clock 8MHz dan prescaler 128 maka membutuhkan waktu 2mS untuk menghitung hingga 124. Interrupt flag diset setiap kali timer2 mencapai 124 dan ISR2 dijalankan. Adapun kode dari ISR2 adalah:
ISR(TIMER2_COMP_vect){
      cli();
      Signal=ReadADC(0);
      sampleCounter = sampleCounter + 2;
      int N = sampleCounter - lastBeatTime;
      if(Signal < thresh && N > (IBI/5)*3){      
            if (Signal < T){                      
                  T = Signal;                     
            }
      }
     
      if(Signal>thresh && Signal>P){
            P = Signal;
      }
     
      if (N > 250){                                  
            if ( (Signal > thresh) && (Pulse == 0) && (N > (IBI/5)*3) ){       
                  Pulse = 1;                              
                  IBI = sampleCounter - lastBeatTime;        
                  lastBeatTime = sampleCounter;              
                  if(secondBeat==1){                       
                        secondBeat = 0;                 
                        for(int i=0; i<=9; i++){            
                              rate[i] = IBI;                     
                        }
                  }

                  if(firstBeat==1){                        
                        firstBeat = 0;                  
                        secondBeat = 1;                  
                        sei();                              
                        return;                             
                  }
                 
                  int runningTotal=0;
                  for (int i=0; i<=8; i++){
                        rate[i]=rate[i+1];
                        runningTotal += rate[i];
                  }
                  rate[9]=IBI;
                  runningTotal += rate[9];
                  runningTotal /= 10;
                  BPM = 60000/runningTotal;
                  QS=1;
            }
      }
     
      if (Signal<thresh && Pulse==1){
            Pulse=0;
            amp=P-T;
            thresh = amp/2 +T;
            P=thresh;
            T=thresh;
      }
     
      if (N>2500){
            thresh=512;
            P = 512;
            T = 512;
            lastBeatTime=sampleCounter;
            firstBeat=1;
            secondBeat=0;
      }
      sei();
}
         Fungsi ISR(TIMER2_COMP_vect) dipanggil setiap 2mS. Hal pertama yang dilakukan adalah mendisable interrupt, lalu membaca pembacaan analog dari Pulse Sensor. Variabel sampleCounter ditambahkan sebanyak 2, karena variabel ini digunakan untuk mengecek waktu. Variabel N digunakan untuk menghindari adanya noise dengan menghitung waktu sekarang – waktu detak terakhir.
         Selanjutnya, program akan mengecek nilai tertinggi dan terendah dari sinyal. Variabel P dan T merupakan nilai tertinggi dan nilai terendah. Variabel thresh merupakan threshold yang diinisialisasi pada 512 (pertengahan range analog) dan akan berganti seiring berjalannya waktu pada 50% amplitude. Terdapat periode waktu sebesar 3/5 IBI yang harus dilalui sebelum T dapat diupdate untuk menghindari adanya noise dan pembacaan yang salah dari dicrotic notch (tekanan yang drop tiba-tiba setelah kontraksi systole). Variabel P diupdate apabila nilai lebih tinggi dari P sebelumnya.
       Program kemudian akan mengecek akan adanya pulsa. Sebelum mencari detak jantung, kita harus melalui suatu waktu minimum untuk menghindari adanya noise dengan frekuensi tinggi. N minimum diset pada 250 mS dengan batasan atas 240BPM. Saat nilai telah melebihi nilai threshold dan 3/5 IBI maka kita akan menemukan sebuah pulsa. Variabel Pulse pun diset 1. Setelah itu nilai IBI didapatkan dengan mengkalkulasi waktu sejak beat sebelumnya terjadi, dan lastBeatTime pun diupdate.
      Bagian selanjutnya dibuat untuk memastikan kita memiliki nilai BPM awal yang realistis. Terdapat 2 buah variabel firstBeat dan secondBeat bertipe boolean (0 atau 1). Variabel firstBeat diinisialisasi 1 dan secondBeat 0. Nilai IBI yang pertama akan dibuang, dan pada kali kedua nilai IBI dapat lebih dipercaya dan digunakan untuk mengukur BPM yang lebih akurat. BPM didapatkan dari rata-rata 10 IBI terakhir, maka digunakan sebuah array bernama rate yang akan menampung data dari kesepuluh IBI terakhir.
        Variabel runningTotal diinisialisasi dengan nilai awal nol. Untuk i=0 hingga 8, nilai rate[i] = rate [i+1] dan runningTotal merupakan penjumlahan dari semua rate[i]. rate[9] diisi dengan nilai IBI yang baru dan runningTotal kembali diupdate dan dirata-rata. Nilai BPM didapatkan dari 60000/runningTotal, karena 1 menit = 60 detik = 60000mS. Setelah itu variabel Boolean QS diset 1 untuk menandakan beat telah ditemukan.
        Jika besar sinyal analog lebih kecil dari threshold dan pulse = 1, maka pulse akan diset 0, dan amp = P-T serta threshold diset pada amp/2 + T. P dan T diisi dengan nilai threshold yang baru. Jika tidak ada beat lebih dari 2500mS maka nilai thresh, P, dan T diset ke 512 dan firstBeat diset 1 sementara secondBeat diset 0. lastBeatTime diset = sampleCounter. Nilai-nilai ini merupakan nilai awal sehingga dapat berfungsi sebagai reset.
Program utama akan terus memastikan konversi ADC berjalan dengan baik, lalu menginisalisasi LCD, ADC, dan interrupt. Saat nilai QS = 1, maka nilai BPM akan ditampilkan pada LCD display dan nilai QS kembali dinolkan.

Komentar

  1. boleh juga mbak, terimakasih artikelnya,

    BalasHapus
  2. Assalumalaikum mbak mau tanya jadi alat anda untuk mengukur bpm apakah harus selama 1 menit ?

    BalasHapus

Posting Komentar

Postingan Populer