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:
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.
boleh juga mbak, terimakasih artikelnya,
BalasHapusAssalumalaikum mbak mau tanya jadi alat anda untuk mengukur bpm apakah harus selama 1 menit ?
BalasHapus