Anda di halaman 1dari 124

PENGEMBANGAN STETOSKOP SEBAGAI ALAT REKAM MEDIK

TERINTEGRASI DENGAN SMARTPHONE

LAPORAN TUGAS AKHIR

YUNUS RAHMADHANI
1311511046

Pembimbing:
Budi Rahmadya, M. Eng

JURUSAN SISTEM KOMPUTER


FAKULTAS TEKNOLOGI DAN INFORMASI
UNIVERSITAS ANDALAS
PADANG
2018
PENGEMBANGAN STETOSKOP SEBAGAI ALAT REKAM MEDIK
TERINTEGRASI DENGAN SMARTPHONE

LAPORAN TUGAS AKHIR

Sebagai Salah Satu Syarat Untuk Menyelesaikan Program Sarjana


Pada Jurusan Sistem Komputer Universitas Andalas

YUNUS RAHMADHANI
1311511046

JURUSAN SISTEM KOMPUTER


FAKULTAS TEKNOLOGI INFORMASI
UNIVERSITAS ANDALAS
PADANG
2018
i
ii
iii
iv
PERNYATAAN

Dengan ini menyatakan bahwa :

1. Tugas Akhir dengan judul “Pengembangan Stetoskop Sebagai Alat Rekam


Medik Terintegrasi dengan Smartphone” adalah asli dan belum pernah diajukan
untuk mendapatkan gelar akademik (Sarjana, Magister, dan Doktor), baik di
Universitas Andalas maupun di perguruan tinggi lainnya.
2. Tugas Akhir ini murni gagasan dan rancangan saya sendiri, tanpa bantuan tidak sah
dari pihak lain, kecuali bantuan dan arahan dari tim pembimbing.
3. Tugas Akhir ini tidak terdapat hasil karya atau pendapat yang ditulis atau
dipublikasikan oleh orang lain, kecuali dikutip secara tertulis dengan jelas dan
dicantumkan sebagai acuan dalam tulisan saya dengan disebutkan nama pengarang
dan dicantumkan dalam daftar pustaka.
4. Pernyataan ini saya buat dengan sesungguhnya, dan apabila dikemudian hari terdapat
penyimpangan dan ketidakbenaran dalam pernyataan ini, maka saya bersedia
menerima sanksi akademik serta sanksi lainnya sesuai dengan norma dan ketentuan
lain yang berlaku.

Demikianlah surat ini dibuat, untuk dapat dipergunakan sebagaimana mestinya.

Padang, 19 Februari 2018


Yang membuat pernyataan,

Yunus Rahmadhani
No.BP 1311511046

v
HALAMAN PERSEMBAHAN

Sesungguhnya Sesudah Kesulitan, Ada Kemudahan, Maka Apabila Kamu Telah Selesai (Dari Suatu Urusan)
Maka Kerjakanlah Dengan Sungguh-Sungguh (Urusan) Yang Lain, Dan Kepada Tuhan Mu Hendaknya Kamu
Berharap
(QS. Al Insyirah : 6-8)

Alhamdulillah..Alhamdulillah..Alhamdulillahirobbil’alamin..
Sujud syukur kupersembahkan kepadamu Tuhan yang Maha Pengasih dan Maha Penyayang,
atas takdirmu telah kau jadikan aku manusia yang senantiasa berpikir, berilmu, beriman dan
bersabar dalam menjalani kehidupan ini. Semoga keberhasilan ini menjadi satu langkah awal
bagiku untuk meraih cita-cita besarku. Tak lupa lantunan shalawat dan salam ku ucapkan
kepada Nabi Muhammad SAW yang selalu dan selalu menjadi suri tauladan terbaik di muka
bumi ini.

Karya kecil ini Kupersembahkan kepada orang-orang orang-orang yang sangat kucintai dan
kusayangi, selalu berada di sekitarku dan selalu memberikan hal yang tak terduga dalam
hidupku.

~IBU dan APA~

Sebagai tanda bakti, hormat, cinta dan terima kasih yang tiada terhingga kupersembahkan
karya kecil ini kepada ibu dan apa tercinta yang telah memberikan kasih sayang, dukungan,
semangat, cinta kasih yang tiada dapat diungkapkan dengan kata-kata. Semoga ini menjadi
langkah awal untuk dapat membuat ibu dan apa bahagia. Karena kusadar sampai pada saat
ini, belum ada hal yang bisa kuberikan untuk membahagiakan ibu dan apa. Doakan selalu
anak mu ini bu pa semoga ini adalah langkah awal sehingga suatu saat nanti aku bisa
membuat ibu dan apa bangga. Sekali lagi terima kasih banyak untuk apa yang salalu
memberikan nasehat dan motivasi yang sangat membangun yang sangat sangat mengerti
kondisi anaknya selain itu juga selalu memberikan ilmu yang berguna untuk kehidupan terima
kasih pa. terima kasih yang tiada hingga juga kupersembahkan kepada ibu tercinta, karena
telah memberikan kasih sayang nasehat motivasi dan selalu mengingatkan dalam hal
kebaikan, maafkan anak mu ini ma yang masih jauh dari kata sempurna yang bisa ibu
banggakan. Insyaallah abang akan berusaha membuat ibu dan apa bangga.

Untuk ibu dan apa … tak ada hal yang paling membahagiakan dalam hidupku ini kecuali
melihat ibu dan apa bahagia.. sekali lagi terima kasih banyak ibu dan apa..

vi
~Dosen FTI~

Terima kasib banyak bapak Budi Rahmadya, MT atas nasehat arahan dan bimbingan yang
sangat berarti dalam menyelesaikan tugas akhir ini. kepada ibuk Derisma, M.T selaku
pembimbing akademik dan penguji 1 pada saat sidang komrehensif, terima kasih banyak pak
atas arahan, masukan dan nasehat yang selalu bapak berikan selama perkuliahan dan selama
penyelesaian tugas akhir ini. kepada bapak Dody Ichwana Putra, M.T dan ibuk Nefy Puteri, MT
yang telah memberikan arahan dan masukan selama menyelesaikan tugas akhir ini. terima
kasih kepada ibuk Desta Yolanda, M.T sebagai penguji 2 pada sidang komprehensif yang
memberikan arahan masukan dan nasehat yang sangat membangun. Dan terkhusus kepada
semua dosen Sistem Komputer Universitas Andalas Fakultas Teknologi Informasi Yang telah
membarikan ilmu yang sangat bermanfaat..

~ KELUARGA BESAR NEO TELEMETRI~

Teruntuk abang dan kakak, uda, dan uni, yang telah memberikan arahan, nasehat, dukungan,
ilmu yang sangat bermanfaat selama saya mendapat amanah di UKM neo Telemetri,
terimakasih yang sebesar-besarnya. Terimakasih buat da meiki, da oki, da naz, bg Nanda, bg
Yopie, bg Shaddiq, bg Icad, kak Indah, bg rakel, kak nisa, bg heru, bg ib, bg tony, bg fitra, bg
dicky, bg rudy, bg sya’ban, bg arifan, bg abdi, kak dissa, bg bing, bg habil, kak ira, kak ledy,
bg yovi, bg yayan, bg teguh, kaki lay, kak winna, kak rhien, bg bokir, kak icha, kak fifi, kak
mia, kak maya, kak ririn, kak ii. Terimakasih banyak, begitu banyak cerita yang terangkai
bersama orang-orang yang luarbiasa seperti mereka....
Teruntuk kawan-kawan seperjuangan A7, Andi partner dari zaman penjajahan sampai zaman
merdeka, Dika teman seperjuangan dari zaman penjajahan, sampai zaman wisuda yang
sangat luar biasa dalam menemani skripsi, Doni kameramen coga, Erik rekan push rank mobile
legend, Uul,preman parkiran sewaktu Firetech, Fendy si cerdas dengan berbagai kepandaian,
Hadi seorang datuak rumah gadang yang hobi travelling ke mentawai, Harlan avatarnya Neo
Telemetri, Seno, ketua Neo Telemetri pada zamannya, berwibawa, berwawasan luas, Ikhwan,
boya yang cepat sekali dewasa, ilas, partner Neo Blood, fhadly, desainer hebat bertampang
unyu, Mutia, kawan curhat pas pengurusan, Nita, yang katanya punya teman satu divisi yang
selalu memberi semangat Via, kawan dari zaman katumba, Oxsa, adik jurusan tetangga yang
ketemu di Neo Telemetri, Priska sekertarinya si ket yang sudah diambil Dio, Rahmat, ketua
generasi now, RC junior satu jurusan yang kebetulan bertemu di Neo Telemetri, Rifal, teman satu
kontrakan yang sekarang masih satu kontrakan, Dio, koor PR pada zamannya yang berhasil
membungkus sekretaris, Kiki adik terbaik yang rela menunggu abang ganteng 3 jam sewaktu
kompre, Rohim, teman nebeng pulang kalau bawa motor, Dona, teman paling keren dalam
berbahasa inggris, Uce, adik pling lucu dari jambi yang kebetulan bertemu di Neo Telemetri.
Untuk adik-adik A8 dan A9 yang tidak bisa disebutkan namanya satu-persatu dan masih
berjuang untuk UKM tercinta, Neo Telemetri. Semoga segala usaha, doa, tawakkal, Allah
berikan pahala yang berlipat ganda. Aamiin…

vii
~PAM-TECHNO~

Terimakasih untuk bang Hengki selaku direktur yang telah memberikan pekerjaan untuk
tambahan uang belanja,hehehe bang Fajar selaku manager marketing yang selalu berjuang
mencari proyek, bang Handra selaku manager TI yang selalu menolong dalam pekerjaan
maupun perTAan, bang Ojan selaku manager desain yang sangat humoris, bang Kojon selaku
staff divisi TI yang sangat luar biasa dalam bahasa ular(python), bang Inep selaku manager
maintenance yang sangat luar biasa mendukung perTAan ini...

Mereka semua adalah senior SISKOM yang sangat kreatif yang mampu membuat lapangan
pekerjaan sendiri dari awal sampai berdirinya CV.Putra Anugrah Mandiri(PAM-TECHNO)....

Semoga PAM-TECHNO dapat berkembang menjadi PT, ammiinnnn....

~KONTRAKAN SQUAD~

“Hidup untuk berkarya demi kejayaan bangsa” merupakan semboyan dari kontrakan squad
yang sudah di anut dari zaman perang dunia semester pertama sampai sekarang. Kontrakan
ini didirikan oleh beberapa orang tukang bangunan yang disewa oleh uni yang punya
kontrakan.

Berawal dari berakhirnya sistem pemerintahan asrama Unand pada akhir zaman semester
kedua, lima orang pejuang asrama turun ke kampung dalam untuk mencari tempat tinggal
baru yang dapat dijadikan tempat untuk berkarya dan juga ramah kantong. Akhirnya setelah
sekian lama mencari, didapatkan kontrakan uni yang tadi yang sangat pas dan sesuai kriteria.

Kemudian untuk mempersiapkan kemerdekaan pada zaman semester sepuluh, maka


dibentuklah badan persiapan kemerdekaan perTAan dengan beranggotakan, Raymas
sebagai seseorang yang berkarakter yang selalu tenang dalam menghadapi situasi apapun
sehingga dijuluki sebagai head of kontrakan squad, Rizki Fajri sebagai aktifis kampus yang
selalu mencoba untuk berkarya demi terjadinya kemerdekaan mahasiswa semester akhir, Piki
Saputra seorang enginer dikontrakan yang sangat imajinatif, Rifal aktifis super sibuk yang masih
berjuang dalam merebut kemerdekaan tahun akhir, M. Arief salah satu dari pendatang yang
sudah lama ikut dalam kegiatan kontrakan squad, ia merupakan seorang fisikawan yang
sangat kritis, Soza seorang artis korea yang sangat pintar, sangat cepat dalam belajar, tapi
tidak dalam perebutan kemerdekaan tahun akhir, dika seorang enginer yang sangat balik
kata salah satu dosen pembimbingnya, ia sudah sangat banyak membantu saya dalam
pengembangan persiapan perTAan, Amaik seorang atlip pelari tangguh kontrakan yang
mampu lari dari kenyataan, wkwkwk, Simar seorang penggila film yang sedang berjuang demi
kejayaan bangsa, dan beberapa orang yang mungkin terlupa oleh saya seperti Roni yang
sudah lebih dulu meninggalkan kontrakan, Seno yang saya lupa untuk menuliskan namanya
pada halaman ini...

viii
Dan pada akhirnya, gelar kemerdekaan S.KOM ini terasa sangat membahagiakan karena
mereka hadir didalam setiap cerita yang saya lalui, terimakasih kontrakan squad....

~TEMAN-TEMAN SEPER-SISKOM-AN~

Angkatan 2013 sistem computer yang telah sama-sama menempuh kehidupan berkuliah dari
zaman PAB sampai sekarang. Ivani, rizki, didiet, hani, fitri, luthfan, onny, sari, riddha, dicky,
fauzul, indah, welly, oki, ayu, khairul, hafni, rahmat, fino, zed, ipin, deski, ai, pak gub, datool,
danu, azmi, senaw, selfi, della, aini, amaik, dika, bayu, rizka, rifal, akbar, roni, upuk, masrief,
gentha, alfin, hadi, masdik, digo, piki, maman, yudes, rahmi, fatim, jamil, marreza, yogi, taufik,
iffah, dila, adit, masrey, kunug, yos, uti, omyon, makrin, edo, raihan, ridho, prima, robby, soza,
Robert, sobep dapen, Riyadh, raymas, reyhan, trully, yori, tito, cen, imam, dian, nasyith, rycho,
annisa, irzan, vivi, reza, faruq, toni, andre, maya, vero, hanif, aidil, diaz, dan yodi.. terimakasih
untuk cerita selama 4 tahun lebih ini. Semoga sukses terus dan yang belum bertoga,
dimudahkan Allah untuk bertoga. Aamiin…

~TEMAN-TEMAN DARI KECIL~

Berasal dari kota yang sama, yaitu kota sawahlunto terdapat beberapa anak-anak yang
bercita-cita untuk kuliah, dan akhirnya mereka berhasi menyelesaikan studi sesuai dengan cita-
citanya. Asadullah mahasiswa DKV UNP yang sekarang masih berusaha menyelesaikan masa
studinya, Bayu mahasiswa tambang D2 UNP yang sudah lama selesai dan rencananya akan
mencari pasangan hidup, Robby mahasiswa SisKom Unand seankatan saya dulunya dan
sekarang tengah studi di D3 Perkuliahan tentang optik(Lupa nama kampusnya), Ipong
mahasiswa D3 PNP yang sekarang tegah melanjutkan ke jenjang S1 di semarang karena susah
mencari kerja, Wafiq mahasiswa S1 SI, yang hampir sama dengan saya wisudanya, sanyangnya
tidak terkejar, Wawan mahasiswa tambang D3 UNP yang sekarang suka jalan-jalan....

Merekalah yang selama ini berjuang dari masa taman kanak-kanak sampai saat sekarang ini
untuk mengejar mimpi masing-masing, semoga kita masih bisa berkumpul seperti sedia kala,
hahaha....

ix
KATA PENGANTAR

Alhamdulillahirabbil’alamin, dengan mengucapkan segala puji bagi Allah


SWT yang telah melimpahkan segala rahmat dan karunia-Nya, yang telah memberikan
kekuatan kepada penulis sehingga bisa menyelesaikan tugas akhir ini. Serta salawat
beriring salam kepada junjungan Nabi Besar Muhammad SAW yang telah menjadi
suri tauladan bagi penulis selaku Mahasiswa Jurusan Sistem Komputer Universitas
Andalas untuk dapat menyelesaikan Tugas Akhir ini.

Selama penulisan Tugas Akhir ini penulis telah banyak mendapat bantuan dan
dukungan dari berbagai pihak, baik bantuan moril maupun materil. Sebagai tanda
hormat maka pada kesempatan kali ini penulis ingin mengucapkan terimakasih banyak
kepada :

1. Kedua orangtua dan Keluarga Penulis, yang selalu berdoa untuk kesehatan
penulis dan kesuksesan penulis. Selalu memberikan dorongan dan motivasi
agar penulis dapat menyelesaikan laporan tugas akhir ini.
2. Bapak Dr. Ahmad Syafrudin Indrapriyatna, MT selaku Dekan Fakultas
Teknologi Informasi Universitas Andalas besertas seluruh staf akademik
dan non akademik yang telah membantu penulis selama berada di Fakultas
Teknologi Informasi.
3. Bapak Budi Rahmadya, M. Eng selaku Pembimbing yang telah banyak
memberikan pengarahan, masukan dan saran kepada penulis selama
penulis menyelesaikan tugas akhir ini.
4. Ibuk Derisma, M.T selaku pembimbing akademik dan dosen penguji 1
penulis pada saat sidang komrehensif yang telah memberikan arahan dan
masukan kepada penulis.
5. Ibuk Nefy Puteri, MT dan Bapak Dody Ichwana Putra, M.T selaku penguji
pada saat seminar proposal dan seminar hasil yang telah memberikan
masukan dan arahan untuk tugas akhir ini.
6. Ibuk Desta Yolanda, MIT selaku penguji 2 sidang komprehensif yang telah
memberi masukan, arahan dan nasehat kepada penulis.

x
7. Ibuk Ratna Aisuwarya, M.Eng selaku ketua Jurusan Sistem Komputer,
ibuk bapak dosen pada Jurusan Sistem Komputer Fakultas Teknologi
Informasi Universitas Andalas yang telah memberikan ilmu dan
pengalamannya, serta seluruh staf akademis dilingkungan Jurusan Sistem
Komputer atas segala bantuan yang diberikan.
8. Teman-teman SISKOM 13, terima kasih telah berjuang bersama-sama dari
tahun 2013 dengan segala suka dan duka.
9. Junior-junior Sistem Komputer yang memberikan semangat dan membantu
dalam penyelesaian tugas akhir ini.
10. Dan semua pihak yang membantu penulis untuk menyelesaikan penulisan
tugas akhir ini.
Penulis menyadari bahwa dalam penulisan Tugas Akhir ini masih jauh dari
kesempurnaan. Oleh karena itu penulis mohon maaf apabila ada kekurangan maupun
kesalahan dalam penyajiannya. Serta mengharapkan kritikan dan saran yang
bermanfaat untuk dapat mengembangkan dan meningkatkan mutu Tugas Akhir ini.

Akhir kata hanya kepada Allah SWT tempat untuk berserah diri. Semoga
bimbingan dan bantuan yang telah diberikan kepada penulis mendapatkan balasan
yang setimpal dari-Nya. Aamiin Yaa Robbal’Alamin.

Padang, 19 Februari 2018

Penulis

xi
PENGEMBANGAN STETOSKOP SEBAGAI ALAT REKAM MEDIK
TERINTEGRASI DENGAN SMARTPHONE

Yunus Rahmadhani1), Budi Rahmdya, M. Eng2)


1)
Mahasiswa Jurusan Sistem Komputer Fakultas Teknologi Informasi Universitas
Andalas
2)
Dosen Jurusan Sistem Komputer Fakultas Teknologi Informasi Universitas Andalas

ABSTRAK

Penelitian ini berisi tentang perancangan stetoskop modern yang dapat merekam suara
detak jantung dan kemudian suara tersebut dapat disimpan sebagai rekam medik suara
jantung pasien yang nantinya dapat berguna untuk kepentingan medis. Stetoskop
modern ini dapat diintegrasikan dengan smarthone melalui media komunikasi
bluetooth sebagai pengontrol untuk merekam, memutar kembali, dan menampilkan
grafik dari hasil rekaman suara detak jantung pasien. Pada penelitian ini menggunakan
stetoskop yang telah dimodifikasi dengan memasukkan mikrofon elektret ke dalam
selang stetoskop. Mikrofon digunakan untuk merekam suara yang terdengar pada
stetoskop. Setelah itu suara yang direkam akan difilter dengan menggunakan Band
Pass Filter(BPF) untuk menghasilkan suara yang jernih tanpa noise yang
menggandeng suara rekaman detak jantung tersebut. Dari hasil pengujian perangkat
keras menunjukkan bahwa stetoskop modern ini dapat merekam suara detak jantung
pada amplitudo 20,96 dB – (-54,52) dB. Kemudian terdapat perbedaan durasi rekaman
dari yang ditampilkan smartphone dengan yang ada pada stetoskop modern sebesar
0,44 detik. Pada saat pengiriman data dari smartphone ke stetoskop modern,
didapatkan beberapa data yang hilang dengan presentasi error 27,33%. Perangkat
lunak pada stetoskop modern juga telah diuji dan telah berhasil untuk merekam suara
detak jantung, memutar ulang, menyimpan suara tersebut dan juga dapat menampilkan
hasil dari rekaman suara detak jantung tersebut.

Kata kunci: Stetoskop Modern, Band Pass Filter(BPF)

xii
DEVELOPMENT STETHOSCOPE AS INTEGRATED MEDICAL
RECORDER USING SMARTPHONE

Yunus Rahmadhani1), Budi Rahmdya, M. Eng2)


1)
Student of Computer Engineering Faculty of Information Technology Andalas
University
2)
Lecturer of Computer Engineering Faculty of Information Technology Andalas
University

ABSTRACK

This research is discussed about designing a modern stethoscope which is able to


record the heartbeat sound and it can be saved as medical record of patient's heartbeat
sound which later is used for medical necessities. This modern stethoscope can be
integrated with smartphone via Bluetooth communication as the controller for
recording, rewinding, and showing the graph of recorded heartbeat sound of the
patient's heartbeat.

The stethoscope is modified by inserting electret microphone into the stethoscope tube.
The microphone is used to record the sound from stethoscope. The recorded sound is
filtered by using Band Pass Filter (BPF) to produce clearer sound without noise that
comes together with the recorded sound.

The results of the testings show that the modern stethoscope is able to record the
heartbeat sound in amplitude of 20.96 dB to (-54.52) dB. The difference of recording
duration shown in smartphone and in modern stethoscope is 0.44 seconds. There are
several data loss while transfering the data from smartphone to modern stethoscope
with error percentage of 27.33%. The software in modern stethoscope has been tested
and succeeded on recording, rewinding, and saving also showing the recorded sound
of heartbeats.

KEYWORDS: Modern stethoscope, band pass filter (BPF)

xiii
DAFTAR ISI

HALAMAN PENGESAHAN .................................. Error! Bookmark not defined.


HALAMAN PERSETUJUAN TUGAS AKHIR ....... Error! Bookmark not defined.
LEMBARAN PEGESAHAN TUGAS AKHIR ......... Error! Bookmark not defined.
HALAMAN PERSEMBAHAN ................................................................................. vi
KATA PENGANTAR ................................................................................................. x
ABSTRAK ................................................................................................................. xii
ABSTRACK ............................................................................................................. xiii
DAFTAR ISI............................................................................................................. xiv
DAFTAR GAMBAR ............................................................................................... xvii
DAFTAR TABEL................................................................................................... xviii
BAB I ........................................................................................................................... 1
PENDAHULUAN ....................................................................................................... 1
1.1. Latar Belakang .................................................................................................. 1
1.2. Rumusan Masalah ............................................................................................. 2
1.3. Batasan Masalah................................................................................................ 2
1.4. Tujuan Penelitian .............................................................................................. 3
1.5. Manfaat Penelitian ............................................................................................ 3
1.6. Jenis dan Metodologi Penelitian ....................................................................... 3
1.7. Sistematika Penulisan........................................................................................ 6
BAB II.......................................................................................................................... 7
LANDASAN TEORI ................................................................................................... 7
2.1. Jantung .............................................................................................................. 7
2.1.1. Pengertian Jantung...................................................................................... 7
2.1.2. Struktur Internal Jantung Manusia ............................................................. 7
2.1.3. Detak Jantung ............................................................................................. 8
2.2. Stetoskop ........................................................................................................... 9
2.3. Mikrofon ......................................................................................................... 10
2.4. Rangkaian Filter.............................................................................................. 11
2.4.1. Macam-Macam Filter ............................................................................... 12
2.4.1.1. Berdasarkan sifat penguatannya ........................................................ 12

xiv
2.4.1.2. Berdasarkan Daerah Frekuensi Yang Dilewatkan ............................. 12
2.4.1.3. Berdasarkan Bentuk Respon Frekuensi Terhadap Gain .................... 14
2.5. Raspberry Pi .................................................................................................... 15
2.5.1. Pengertian Raspberry Pi ........................................................................... 15
2.5.2. Deskripsi Raspberry Pi 3 Model B ........................................................... 15
2.5.3. Bahasa Pemrograman Python ................................................................... 18
2.6. Aplikasi Mobile ............................................................................................... 20
BAB III ...................................................................................................................... 23
PERANCANGAN SISTEM ...................................................................................... 23
3.1. Analisa Kebutuhan Sistem .............................................................................. 23
3.2.1. Kebutuhan Fungsional Sistem .................................................................. 23
3.2.2. Kebutuhan Non-Fungsional Sistem .......................................................... 23
3.2. Rancangan Umum Sistem ............................................................................... 23
3.3. Rancangan Proses............................................................................................ 24
3.3.1. Perancangan Hardware ............................................................................ 26
3.3.2. Perancangan Software .............................................................................. 27
3.4.2.1. Perancangan Embedded Software ..................................................... 27
3.4.2.2. Perancangan Software pada Aplikasi Smartphone ............................ 28
3.3.3. Perancangan Interface Aplikasi Smartphone ........................................... 29
3.4.3.1. Interface Menu Utama ....................................................................... 29
3.4.3.2. Interface Halaman Rerekam .............................................................. 30
3.4.3.3. Interface Halaman Daftar Rekaman .................................................. 30
3.4. Rancangan Pengujian ...................................................................................... 31
3.4.1. Pengujian Hardware ................................................................................. 31
3.4.2. Pengujian Software ................................................................................... 32
3.5. Analisa Kebutuhan Penelitian ......................................................................... 33
BAB IV ...................................................................................................................... 34
IMPLEMENTASI DAN PENGUJIAN ..................................................................... 34
4.1. Implementasi ................................................................................................... 34
4.1.1. Implementasi Hardware ........................................................................... 34
4.1.2. Implementasi Software ............................................................................. 35
4.2.2.1. Implementasi Aplikasi Smartphone ................................................... 35

xv
4.2.2.2. Implementasi Program Python Pada Raspberry Pi ............................ 39
4.2. Pengujian dan Analisa ..................................................................................... 41
4.2.1. Pengujian dan Analisa Hardware ............................................................. 41
4.2.1.1. Pengujian Stetoskop ........................................................................... 41
4.2.1.2. Pengujian Bluetooth ........................................................................... 43
4.2.1.3. Pengujian Raspberry Pi ...................................................................... 44
4.2.2. Pengujian dan Analisa Software ............................................................... 45
4.2.2.1. Pengujian Aplikasi Smartphone......................................................... 45
4.2.2.2. Pengujian Program Python ................................................................ 46
4.2.2.3. Pengujian Pengiriman Data Grafik .................................................... 48
4.2.2.4. Pengujian Filter .................................................................................. 50
BAB V ....................................................................................................................... 57
PENUTUP ................................................................................................................. 57
5.1. Kesimpulan ..................................................................................................... 57
5.2. Saran ................................................................................................................ 57
DAFTAR PUSTAKA ................................................................................................ 59

xvi
DAFTAR GAMBAR

Gambar 1. 1 Diagram Rancangan Penelitian ............................................................... 4


Gambar 2. 1 Struktur Internal Jantung Manusia .......................................................... 8
Gambar 2. 2 Bagian-bagian Stetoskop ........................................................................ 9
Gambar 3.1 Arsitektur Rancangan Sistem ................................................................. 23
Gambar 3.2 Flowchart Alur Fungsi Sistem ............................................................... 25
Gambar 3.3 Perancangan Hardware .......................................................................... 26
Gambar 3.4 Flowchart Perancangan Embedded Software ........................................ 27
Gambar 3.5 Flowchart Perancangan Software pada Aplikasi Smartphone .............. 28
Gambar 3.6 Antarmuka Menu Utama........................................................................ 29
Gambar 3.7 Antarmuka Halaman Rekaman .............................................................. 30
Gambar 3.8 Antarmuka Halaman Daftar Rekaman ................................................... 30
Gambar 4.1 Implementasi Hardware ........................................................................ 34
Gambar 4.2 Implementasi Halaman Utama ............................................................... 36
Gambar 4.3 Implementasi Halaman Daftar Bluetooth............................................... 37
Gambar 4.4 Implementasi Halaman Rekaman. ......................................................... 37
Gambar 4.5 Implementasi Halaman Daftar Rekaman. .............................................. 38
Gambar 4.6 Implementasi Halaman Detail Rekaman. .............................................. 39
Gambar 4.7 Implementasi Program Pyton Pada Raspberry Pi. ................................. 40
Gambar 4.8 Sampel Suara Rekaman Detak Jantung M. Arief .................................. 41

xvii
DAFTAR TABEL

Tabel 2.1 Deskripsi Raspberry Pi 3 Model B ............................................................ 15


Tabel 3.1 Pengujian Hardware .................................................................................. 31
Tabel 3.2 Pengunjian Software. ................................................................................. 32
Tabel 3.3 Kebutuhan Penelitian. ................................................................................ 33
Tabel 4.1 Pengujian Stetoskop................................................................................... 42
Tabel 4.2 Pengujian Bluetooth ................................................................................... 43
Tabel 4.3 Pengujian Raspberry Pi.............................................................................. 44
Tabel 4.4 Pengujian Aplikasi Smartphone ............................................................... 46
Tabel 4.5 Pengujian Program Python ........................................................................ 47
Tabel 4.6 Pengujian Waktu Pengiriman Data Grafik ................................................ 48
Tabel 4.7 Pengujian Kecocokan Pengiriman Data .................................................... 49
Tabel 4.8 Perbandingan Grafik Rekaman Sebelum dan Setelah Difilter .................. 51

xviii
BAB I

PENDAHULUAN

1.1. Latar Belakang


Penyakit Jantung merupakan penyakit yang sangat berbahaya. Di Indonesia
tercatat 35% atau sekitar 1,8 juta kasus kematian akibat penyakit jantung[1].
Faktor-faktor yang menyebabkan penyakit jantung diantaranya seperti kebiasaan
merokok, konsumsi makanan yang mengandung kolesterol tinggi, kurangnya
aktifitas fisik, dan lain-lain. Perhatian khusus seperti pencegahan dan penanganan
perlu dilakukan mengingat tingginya angka kematian akibat penyakit jantung.

Penyakit jantung dapat dideteksi dengan mendengarkan suara detak jantung


melalui alat kedokteran yang disebut stetoskop. Alat ini berfungsi untuk
mendiagnosa penyakit yang dihasilkan oleh suara detak jantung. Teknik yang
digunankan para dokter dengan stetoskop adalah teknik auskultasi[2]. Teknik ini
merupakan suatu proses yang subjektif dimana hasilnya bergantung pada
kemampuan pendengaran seseorang, pengalamannya, dan kemampuannya
mengenali perbedaan antara pola-pola suara yang ada[3]. Kelemahan lainnya yaitu
hasil diagnosa yang tidak bisa direkam sehingga menimbulkan tidak akuratnya
hasil analisis suatu penyakit.

Di negara berkembang seperti Indonesia penanganan penyakit jantung tergolong


cukup rendah. Penyebabnya yaitu karena tidak meratanya penyebaran tenaga ahli
medis ke seluruh penjuru Indonesia dan peralatan medis yang terpusat pada
daerah-daerah perkotaan sehingga sulitnya menemukan tenanga ahli jantung di
daerah terpencil atau pedesaan.

Penelitian tentang pengembangan stetoskop sudah pernah dilakukan, misalnya


penelitian pengembangan stetoskop elektronik dan software analisis auskultasi.
Pada penelitian tersebut, menggunakan komputer untuk merekam dan memproses
suara detak jantung dari pasien[4]. Berdasarkan penelitian tersebut, maka
dilakukan pengembangan dengan mengganti fungsi dari komputer dengan mini PC

1
yang terintekgrasi dengan smartphone sehingga alat yang dirancang lebih kecil dan
praktis untuk digunakan.

Berdasarkan latar belakang tersebut, maka akan dirancang sebuah sistem dengan
judul “Pengembangan Stetoskop Sebagai Alat Rekam Medik Terintegrasi
dengan Smartphone” sebagai alat rekam medik pasien dengan prinsip kerja mirip
stetoskop yang terintegrasi dengan smartphone. Alat ini akan membaca detak
jantung seseorang dan merekamnya pada smartphone, sehingga suara hasil
rekaman detak jantung tersebut dapat dikirimkan ke dokter ahli jantung yang
berada di kota untuk dapat diperiksa.

1.2. Rumusan Masalah


Berdasarkan latar belakang yang telah diuraikan di atas, maka penulis akan
merumuskan masalah antara lain :

1. Bagaimana stetoskop dapat membaca detak jantung dari pasien.


2. Bagaimana suara detak jantung dapat terekam oleh Raspberry Pi.
3. Bagaimana menghilangkan noise yang dihasilkan mikrofon pada rekaman
suara detak jantung.
4. Bagaimana Raspberry Pi dapat terhubung dengan smartphone melalui
komunikasi bluetooth.
5. Bagaimana smartphone dapat menampilkan dan memutar hasil rekaman suara
detak jantung pada Raspberry Pi.

1.3. Batasan Masalah


Penulis membatasi permasalahan dalam tugas akhir ini antara lain :

1. Alat yang dirancang hanya dapat digunakan saat lingkungan disekitar alat tidak
gaduh(ramai).
2. Alat yang dirancang hanya dapat digunakan untuk merekam, memutar kembali
dan menampilkan grafik dari suara rekaman detak jantung.

2
1.4. Tujuan Penelitian
Tujuan yang ingin dicapai pada penelitian ini adalah :

1. Stetoskop dapat membaca detak jantung dari pasien.


2. Suara detak jantung dapat terekam oleh Raspberry Pi.
3. menghilangkan noise yang dihasilkan mikrofon pada rekaman suara detak
jantung.
4. Raspberry Pi dapat terhubung dengan smartphone melalui komunikasi
bluetooth.
5. Smartphone dapat menampilkan dan memutar hasil rekaman suara detak
jantung pada Raspberry Pi.

1.5. Manfaat Penelitian


Sebagai alat rekam medik suara detak jantung yang nantinya suara tersebut bisa
dikirimkan ke dokter ahli jantung, sehingga memudahkan pengguna dalam
memeriksakan kondisi keseharat jantungnya tanpa harus antri ke rumah sakit atau
tempat praktek dokter ahli jantung untuk diperiksa.

1.6. Jenis dan Metodologi Penelitian


Jenis penelitian yang digunakan dalam penulisan tugas akhir ini adalah penelitian
eksperimental (Experimental Research). Penelitian eksperimental adalah jenis
penelitian yang digunakan untuk melihat hubungan sebab akibat. Penelitian
eksperimental digunakan untuk mencari pengaruh perlakuan terhadap yang lain
dalam kondisi yang terkendalikan.

Penelitian eksperimental menggunakan sesuatu percobaan yang dirancang secara


khusus guna membangkitkan data yang diperlukan untuk menjawab pertanyaan
penelitian. Pada sistem modern stetoskop ini, akan dilakukan pengujian jarak
pembacaan antara smartphone dan Raspberry pi dengan media bluetooth sebagai
media perantara. Selanjutnya, akan divariasikan durasi rekaman detak jantung.
Kemudian akan dilihat kesesuaian data yang dikirim dari dan ke aplikasi.

3
Penelitian ini ditunjang dengan studi literatur (literatur research), yaitu dengan
membaca dan mempelajari literatur tentang kemampuan konektifitas antara
raspberry pi dan smartphone. Dimana pada penelitian ini raspberry pi digunakan
sebagai alat perekam suara detak jantung dan dapat mengirimkannya ke
smartphone.

Metodologi penelitian dapat dilihat pada Gambar 1.1 :

Gambar 1. 1 Diagram Rancangan Penelitian

Berdasarkan Gambar 1.1, dapat dijelaskan tahap-tahap yang akan dilakukan untuk
menyelesaikan penelitian ini, yaitu :

1. Identifikasi Masalah
Pada tahapan ini, dilakukan identifikasi permasalahan yang diangkat
menjadi penelitian tugas akhir. Proses identifikasi dilakukan melalui
penelusuran sistem yang sudah banyak digunakan untuk rekam medik

4
detak jantung. Kemudian, berdasarkan sistem yang sudah ada dirancang
sebuah sistem baru yang lebih efiesien dan efektif.
2. Studi Literatur
Pada tahap pertama, hal yang dilakukan yaitu mencari serta mengumpulkan
artikel dan jurnal dari penelitian-penelitian sebelumnya yang berkaitan
dengan penelitian ini. Studi literatur ini juga mempelajari teori-teori yang
mendukung dan berkaitan dengan pembuatan tugas akhir. Teori yang
dikumpulkan dan dipelajari meliputi pengenalan tentang jantung, cara kerja
jantung, detak jantung, pembuatan aplikasi smartphone, pengirim data dari
Raspberry Pi ke smartphone via bluetooth.
3. Perancangan Sistem
Perancangan sistem terdapat dua bagian yaitu hardware dan software.
a. Perancangan Hardware
Pada tahap ini dilakukan pemilihan hardware yang diperlukan
untuk implementasi tugas akhir ini. Hardware yang diperlukan
berupa stetoskop, mikrofon, earphone, dan sebuah smartphone
android.
b. Perancangan Software
Pada tahap ini, dilakukan pembuatan sebuah aplikasi smartphone
meliputi, pengontrolan raspberry pi oleh smartphone android untuk
memulai/berhenti merekam suara detak jantung, menyimpan hasil
rekaman tersebut pada raspberry pi, kemudian dapat menampilkan
data hasil rekaman detak jantung pada smartphone android berupa
grafik detak jantung.
4. Implementasi
Rancangan penelitian yang telah ada akan diimplementasikan dalam
bentuk software dan hardware.
5. Pengujian Sistem
Serangkaian pengujian terhadap sistem dilakukan untuk menguji kinerja
dari masing-masing komponen yang dipakai untuk membangun sistem
modern stetoskop. Pengujian yang dilakukan yaitu sistem dapat merekam,

5
menyimpan, dan memutar kembali suara detak jantung tersebut di
smartphone.
6. Analisa Hasil
Dari pengujian sistem dilakukan analisa kinerja sistem dan data-data yang
didapatkan selama pengujian.
7. Dokumentasi Penelitian Tugas Akhir
Dokumentasi dilakukan sebagai pelaporan hasil penelitian Tugas Akhir.

1.7. Sistematika Penulisan


Penulisan proposal tugas akhir dibagi menjadi beberapa bab, yaitu :

1. Bab I : Pendahuluan, berisi permasalahan yang menjadi latar belakang tugas


akhir ini, rumusan masalah, tujuan, batasan masalah, manfaat penelitian, jenis
dan metodologi penelitian dan sistematika penulisan laporan tugas akhir.
2. Bab II : Landasan Teori, berisi dasar-dasar ilmu yang mendukung
pembahasan penelitian ini.
3. Bab III : Rancangan Sistem, berisi langkah-langkah yang ditempuh dalam
pembuatan sistem dan penjelasan mengenai langkah-langkah tersebut.
4. Bab IV : Implementasi dan Pengujian, berisi penjelasan mengenai
implementsi program dan hasil pengujian dari sistem yang telah dibuat serta
analisa dari hasil pengujian tersebut.
5. Bab V : Penutup, berisi kesimpulan yang dapat diambil dari penelitian ini
beserta saran untuk pengembangan selanjutnya.

6
BAB II

LANDASAN TEORI

2.1. Jantung
2.1.1. Pengertian Jantung
Jantung adalah sebuah rongga organ berotot yang memompa darah ke pembuluh
darah dengan irama yang berulang. Istilah kardiak berarti berhubungan dengan
jantung, dari kata Yunani cardia untuk jantung. Jantung adalah salah satu organ
manusia yang berperan penting dalam sistem peredaran darah[5].

Letak Jantung berada agak sebelah kiri bagian dada, di antara paru-paru kanan dan
paru-paru kiri. Beratnya kurang lebih 300 gram, besarnya kira-kira sebesar kepalan
tangan. Fungsi jantung untuk memompa darah. Maka dengan adanya jantung,
darah dapat dialirkan ke seluruh tubuh melalui pembuluh darah, dan jika peredaran
ini terganggu maka inilah yang disebut sakit jantung[6].

2.1.2. Struktur Internal Jantung Manusia


Jantung terbagi atas empat ruang utama, yaitu Atrium atau Serambi kiri kanan dan
Ventrikel atau Bilik kiri-kanan. Secara fungsional, jantung dibagi menjadi alat
pompa kanan, yang memompa darah kotor menuju paru-paru melalui sirkulasi
pulmonari, dan alat pompa kiri, yang memompa darah bersih ke seluruh tubuh
manusia melalui sirkulasi sistemik. Dinding serambi jauh lebih tipis dibandingkan
dinding bilik karena bilik harus melawan gaya gravitasi bumi untuk memompa dari
bawah ke atas, khususnya di aorta, untuk memompa ke seluruh bagian tubuh yang
memiliki pembuluh darah. Dua pasang rongga (bilik dan serambi bersamaan) di
masing-masing belahan jantung disambungkan oleh sebuah katup[7]. Pada
Gambar 2.1 berikut adalah gambar struktur internal jantung manusia:

7
Gambar 2.1 Struktur Internal Jantung Manusia[7]

2.1.3. Detak Jantung


Detak jantung terjadi akibat adanya dua mekanisme pada jantung yaitu sistole dan
distole. Sistole merupakan fase dimana serambi relaksasi, serta bilik dari jantung
berkontraksi. Adanya kontraksi ini menyebabkan daerah dalam ruang bilik
bertekanan tinggi, serta terjadi gerakan peristaltik sehingga darah akan mengalir
ke ruang yang bertekanan lebih rendah, yakni menuju arteri, untuk selanjutnya
darah tersebut akan beredar ke organ-organ melalui pembuluh darah. Sedangan
distole merupakan suatu fase saat serambi kontraksi serta bilik relaksasi. Pada saat
kontraksi serambi, terjadi tekanan yang lebih besar pada ruang serambi akibat
kontraksi tersebut, sehingga adanya tekanan yang lebih besar pada serambi ini
dibandingkan pada daerah bilik, maka darah akan mengalir menuju bilik yang
bertekanan rendah[7].

Normalnya terdapat dua bunyi yang terjadi setiap satu siklus jantung. Yang
pertama "lub" rendah yang agak memanjang (bunyi pertama), yang disebabkan
oleh mulainya vibrasi oleh penutupan mendadak katup mitral dan trikuspid pada
awal sistole bilik. Yang kedua "dup" bernada tinggi yang lebih singkat (bunyi
kedua), yang disebabkan oleh vibrasi yang disertai dengan penutupan katup aorta
dan pulmonaris tepat setelah akhir sistole bilik. Bunyi ketiga bernada rendah yang

8
lunak terdengar sekitar sepertiga jalan melalui diastole dalam banyak individu
muda normal. Ia bersamaan dengan masa pengisian bilik yang cepat dan mungkin
karena vibrasi dimulai oleh aliran masuk darah. Bunyi keempat kadang-kadang
dapat terdengar segera sebelum bunyi pertama sewaktu tekanan serambi tinggi atau
bilik kaku dalam pengisian dan jarang terdengar dalam dewasa normal[7].

Teknik untuk dapat menganalisa dengan cara mendengarkan suara suara jantung
disebut auskultasi. Teknik ini menggunakan stetoskop sebagai alat bantu. Masalah
yang timbul dalam auskultasi adalah suara biologis biasanya menempati frekuensi
yang cukup rendah sekira 20 – 400 Hz, amplitudo yang rendah, masalah kebisingan
lingkungan, kepekaan telinga dan pola suara yang mirip antara jenis suara jantung
yang satu dengan yang lain[4].

2.2. Stetoskop
Stetoskop berasal dari bahasa Yunani yang artinya stethos yaitu dada dan skopein
yaitu melihat. Jadi stetoskop adalah sebuah alat medis akustik untuk memeriksa
bunyi dalam tubuh. Stetoskop banyak digunakan untuk mendengar bunyi jantung
dan pernafasan, meskipun stetoskop juga digunakan untuk mendengar kelainan di
dalam jantung dan aliran darah dalam arteri dan venol[8]. Pada Gambar 2.2 berikut
adalah gambar bagian-bagian stetoskop:

Gambar 2.2 Bagian-bagian Stetoskop

9
Stetoskop akustik berfungsi untuk menyalurkan suara dari bagian tubuh melalui
tabung kosong berisi udara ke telinga pendengar. Bagian chestpiece terdiri dari dua
sisi bagian yaitu diaphragm dan bell yang dapat diletakkan di bagian tubuh pasien
untuk memperjelas suara tubuh pasien. Ketika diaphragm diletakkan di tubuh
pasien, suara tersebut akan menggetarkan diaphragm dan menciptakan gelombang
akustik yang merambat sampai ke rubber tube hingga terdengar pada bagian ear
piece yang diletakkan ditelinga[8].

2.3. Mikrofon
Mikrofon merupakan tranduser yang berfungsi untuk mendeteksi sinyal suara dan
menghasilkan sinyal elektrik berupa tegangan atau arus yang proporsional
terhadap sinyal suara. Mikrofon memberikan nilai output sinyal analog yang
sebanding dengan perubahan tekanan akustik bergantung pada fleksibitas
diafragma. Sinyal listrik kemudian digunakan untuk pengiriman, perekaman atau
pengukuran pada karakteristik sinyal akustik[9].

Salah satu mikrofon yang biasa digunakan adalah tipi condenser. Condenser atau
yang lebih dikenal kapasitor merupakan komponen elektronika yang mampu
menyimpan energi dalam bentuk medan elektrostatik. Untuk dapat bekerja,
Condenser microphone memerlukan power dari batere atau suplai eksternal.
Sinyal audio yang dihasilkan oleh tipe condenser lebih kuat dibandingkan dengan
tipe yang lainnya. Condenser juga lebih sensitif dan responsif sehingga tepat
digunakan untuk mengambil perbedaan pada suara. Namun tipe ini tidak cocok
digunakan pada volume tinggi karena senstifitasnya membuat mudah
terdistorsi[9]. Pada Gambar 2.3 berikut adalah gambar cara kerja condenser
microphone:

10
Gambar 2.3 Cara Kerja Condenser Microphone[9]

Cara kerja condenser microphone yaitu didalam condenser microphone terdapat


kapasitor yang terdiri dari dua keping lempeng atau plat yang keduanya
mempunyai tegangan (voltage). Salah satu plat dibuat dari bahan yang sangat tipis
dan berfungsi sebagai diafragma (rongga). Ketika gelombang suara mengenai
diafragma, maka diafragma akan bergetar dan merubah jarak pada kedua
lempengan sehingga merubah nilai kapasitansinya[9].

Ketika kedua lempengan saling berdekatan, nilai kapasitansi naik dan terjadi
pengisian arus. Ketika kedua lempengan saling berjauhan, nilai kapasitansi turun
dan terjadi pengosongan arus. Agar condenser microphone dapat bekerja maka
diperlukan tegangan yang melewati kapasitor. Tegangan ini dapat disuplai oleh
batere maupun oleh phantom power eksternal[9].

2.4. Rangkaian Filter


Filter adalah sebuah rangkaian yang dirancang agar mengalirkan suatu pita
frekuensi tertentu dan menghilangkan frekuensi yang berbeda dengan pita ini.
Istilah lain dari filter adalah rangkaian yang dapat memilih frekuensi agar dapat
mengalirkan frekuensi yang diinginkan dan menahan, atau membuang frekuensi
yang lain[10].

11
2.4.1. Macam-Macam Filter
2.4.1.1. Berdasarkan sifat penguatannya
Berdasarkan sifat penguatannya, filter dapat dibagi menjadi dua bagian yaitu[10]:

a. Filter Aktif
Filter Aktif adalah rangkaian filter dengan menggunakan komponenkomponen
elektronik aktif. Komponen penyusunnya terdiri dari op-amp, transistor, dan
komponen lainnya. Kelebihan dari rangkaian filter aktif ini adalah ukurannya
lebih kecil, ringan, lebih murah, dan lebih fleksibel dalam perancangannya.
Sedangkan kerugiannya adalah pada komponen dihasilkan panas, terdapatnya
pembatasan frekuensi dari komponen yang digunakan sehingga pengaplikasian
untuk frekuensi tinggi terbatas. Dibutuhkan sumber untuk dapat
bekerja/digunakan.
b. Filter Pasif
Filter Pasif adalah rangkaian filter yang menggunakan komponenkomponen
elektronik pasif saja. Dimana komponen pasif itu adalah induktor, kapasitor,
dan resistor. Kelebihan dari rangkaian filter pasif ini adalah dapat tidak begitu
banyak noise (sinyal gangguan yang tidak diinginkan) karena tidak ada
penguatan, dan digunakan untuk frekuensi tinggi. Sedangkan kerugiannya
adalah tidak dapat menguatkan sinyal, sulit untuk merancang filter yang
kualitasnya/responnya baik

2.4.1.2. Berdasarkan Daerah Frekuensi Yang Dilewatkan


Berdasarkan daerah frekwensi yang dilewatkannya, filter dapat dibagi menjadi
empat bagian yaitu[10]:

a. Low Pass Filter (LPF)


Low Pass Filter (LPF) mempunyai penguatan tetap dari 0 Hz sampai
menjelang frekuensi cut off fH. Pada fH penguatan akan turun sebesar –3dB,
artinya frekuensi dari 0 Hz sampai fH dinamakan pass band frekuensi dengan
batas 0,707 Av max. Sedang frekuensi yang diredam di bawah –3dB atau 0,707
Av max dinamakan stop band frekuensi.

12
Gambar 2.4 Respon Frekuensi Low Pass Filter[10]

b. High Pass Filter (HPF)


High Pass Filter (HPF) mempunyai karakteristik meredam frekuensi yang
rendah sampai pada frekuensi cut off yang dianggap sebagai batas frekuensi
rendahnya sehingga diberi nama fL. Batasan stop band adalah 0 < f < fL dan
untuk pass band-nya adalah f > fL.

Gambar 2.5 Respon Frekuensi High Pass Filter[10]

c. Band Pass Filter (BPF)


Band Pass Filter dan Band Reject Filter dapat diperoleh dengan melakukan
kombinasi antara LPF dan HPF. Bila HPF dirangkai seri dengan LPF maka
akan mendapatkan Band Pass Filter (BPF).

13
Gambar 2.6 Respon Frekuensi Band Pass Filter[10].

d. Band Stop Filter (BSF)


Band Stop Filter merupakan kombinasi paralel antara LPF dan HPF akan
menghasilkan Band Stop Filter (BSF) atau Band Reject Filter (BRF).

Gambar 2.7 Respon Frekuensi Band Stop Filter[10].

2.4.1.3. Berdasarkan Bentuk Respon Frekuensi Terhadap Gain


Berdasarkan bentuk respon frekwensi terhadap gain, filter dapat dibagi menjadi
empat bagian yaitu:

a. Filter Bessel (Maximally Flat Time Delay)


b. Filter Cauer (Eliptic)
c. Filter Butterworth (Maximally Flat)
d. Filter Chebyshev (Tchebycheff)

14
2.5. Raspberry Pi
2.5.1. Pengertian Raspberry Pi
Raspberry Pi merupakan komputer mungil seukuran dengan sebuah kartu kredit
dengan berbagai fungsi yang dapat dilakukannya. Dikarenakan ukurannya yang
jauh lebih kecil dari komputer biasa, kemampuan komputer mini ini pun dibawah
komputer biasa. Raspberry Pi kebanyakan digunakan untuk kegiatan pembelajaran
yang tidak memerlukan alokasi memori yang besar seperti belajar
pemrograman[11].

Raspberry Pi menggunakan sistem operasi Raspbian. Terdapat 2 model dari


Raspberry Pi yakni model A dan B. Pada Gambar 2.8 berikut adalah gambar
Raspberry Pi 3 Model B:

Gambar 2.8 Raspberry Pi 3 Model B[12]

2.5.2. Deskripsi Raspberry Pi 3 Model B


Berikut tabel deskripsi spesifikasi Raspberry Pi 3 Model B :

Tabel 2.1 Deskripsi Raspberry Pi 3 Model B[12]


Nama Produk Raspberry Pi 3 Model B
Spesifikasi
Chip Broadcom BCM2837
Arsitektur Core 64-bit quad-core ARMv8
CPU 1.2GHz

15
GPU Broadcom VideoCore IV
RAM 1GB LPDDR2 (900 MHz)
Networking 10/100 Ethernet, 2.4GHz 802.11n wireless
Bluetooth Bluetooth 4.1 Classic, Bluetooth Low Energy
Storage microSD
GPIO 40-pin header, populated
HDMI, 3.5mm analogue audio-video jack, 4× USB 2.0,
Ports Ethernet, Camera Serial Interface (CSI), Display Serial
Interface (DSI)

Berikut penjelasan bagian – bagian dari Raspberry Pi[12]:

a. Processor
Raspberry Pi bekerja dengan prosesor keluaran ARM, dengan spesifikasi
arsitektur 64 bit dan clock 1.2GHz serta kapasitas RAM sebesar 1 GB.
b. SD card slot
Raspberry Pi tidak menggunakan hard disk seperti pada komputer biasa,
sebagai pengganti hard disk Raspberry Pi menggunakan kartu memori
(MicroSD card) sebagai media penyimpanan data.
c. Port USB
Raspberry Pi dilengkapi dengan port USB sebagai I/O port yang dapat
dipergunakan untuk keyboard, mouse maupun aksesoris lain seperti
wireless adaptor.
d. Port Ethernet
Port ethernet disediakan untuk koneksi internet kabel.
e. Wireless
Pada Raspberry pi 3 sudah dilengkapi dengan wireless LAN.
f. HDMI connector
Port HDMI digunakan untuk keluaran audio dan video.
g. Bluetooth
Bluetooth digunakan untuk mentranfer data dari perangkat lain atau dari
Raspberry ke perangkat lain.

16
h. Analog audio Output
Port keluaran analog audio dapat langsung dihubungkan dengan speaker
untuk menghasilkan suara.
i. Composite video out
Apabila tidak adanya dukungan HDMI yang tersedia pengguna dapat
menggunakan port ini dan menghubungkannya pada TV yang memiliki
fasilitas video input.
j. Power input
Untuk sumber tegangan Raspberry Pi menggunakan mikro USB dengan
tegangan 5V dan arus minimal 700mAh.
k. GPIO (General Purpose Input Output)
General Purpose Input Output merupakan port yang disediakan untuk
koneksi dengan hardware eksternal. GPIO dapat digunakan untuk
mengontrol LED atau untuk komunikasi serial.

Jumlah pin GPIO yang tersedia pada Raspberry Pi yaitu 40 buah. Untuk membaca
atau menulis nilai dari perangkat eksternal yang terhubung dilakukan dengan
menuliskan pin yang digunakan. Ada dua versi penamaan dari pin GPIO, yang
pertama adalah BCM dan yang kedua BOARD. Sistem penamaan BCM
berdasarkan pada channel yang digunaka oleh masing – masing pin sedangkan
penamaan pada sistem BOARD mengacu pada penomoran secara fisik. Untuk
lebih jelas mengenai perbedaan atara penamaan BCM dengan board dapat dilihat
pada Gambar 2.9.

17
Gambar 2.9 CM dan BOARD[13].

2.5.3. Bahasa Pemrograman Python


Python merupakan bahasa pemrograman tingkat tinggi yang sangat fleksibel.
Python sangat cocok digunakan untuk pembuatan program yang membutuhkan
waktu singkat, karena bahasa pemrograman Python dilengkapi dengan modul dan
paket yang mempermudah dalam pembuatan software. Python dikembangkan oleh
Guido Van Rossum pada akhir 1989 dan dipublikasikan pada tahun 1991[14].

Python dapat digunakan untuk berbagai keperluan pengembangan software dan


dapat berjalan di berbagai macam sistem operasi karena sifatnya yang
multiplatform. Saat ini kode Python dapat dijalankan pada sistem berbasis:
Linux/Unix, Windows, Mac OS X, OS/2, Amiga, Palm, Symbian (untuk produk-
produk Nokia).

Python menjadi bahasa resmi yang terintegrasi dalam Raspberry Pi. Kata “Pi” pada
Raspberry Pi merupakan slang yang merujuk pada “Python”. Oleh karenanya, tepat

18
dikatakan bahwa Python adalah bahasa natural Raspberry. Beberapa fitur yang
dimiliki Python adalah:[15]

a. Memiliki kepustakaan yang luas; dalam distribusi Python telah disediakan


modul-modul siap pakai untuk berbagai keperluan.
b. Memiliki tata bahasa yang jernih dan mudah dipelajari.
c. Memiliki aturan layout kode sumber yang memudahkan pengecekan,
pembacaan kembali dan penulisan ulang kode sumber berorientasi obyek.
d. Memiliki sistem pengelolaan memori otomatis (garbage collection, seperti
java)
e. Modular, mudah dikembangkan dengan menciptakan modul-modul baru;
modul-modul tersebut dapat dibangun dengan bahasa Python maupun
C/C++.
f. Memiliki fasilitas pengumpulan sampah otomatis, seperti halnya pada
bahasa pemrograman Java, Python memiliki fasilitas pengaturan
penggunaan ingatan komputer sehingga para pemrogram tidak perlu
melakukan pengaturan ingatan komputer secara langsung.

Gambar 2.10 menunjukan diagram blok pengaksesan GPIO pada Raspberry Pi


dengan bahasa pemrograman Python. Dimana pada gambar telihat bahwa untuk
mengakses GPIO dibutuhkan modul atau library yang menghubungkan antara
bahasa pemrograman dengan port GPIO, pada bahasa pemrograman python modul
yang digunakan adalah Rpi GPIO.

Python

GPIO Modul Untuk Python

GPIO

input output

Gambar 2.10 Pengaksesan GPIO dengan Python[14]

19
Pada Gambar 2.11 merupakan tampilan IDLE pada python. Untuk menulis script
program Python dapat menggunakan word processing seperti notepad pada
windows atau vim pada linux dengan ketentuan ekstensi file yang dibuat adalah
“.py”. Namun pada dasarnya Python telah dilengkapi dengan IDLE yang
digunakan untuk penulisan script program IDLE.

Gambar 2.11 Tampilan IDLE[15]

Pada Gambar 2.11 terlihat bahwa ada beberapa menu yang tersedia yaitu file, edit,
shell, debug option, windows dan help. Menu file berfungsi untuk pengelolaan
berkas, menu edit untuk pengeditan berkas yang dibuka dan menu debug untuk
melakukan debugging file yang sedang dikerjakan.

2.6.Aplikasi Mobile
Aplikasi Mobile adalah proses pengembangan aplikasi untuk perangkat genggam
seperti PDA, asisten digital perusahaan atau telepon genggam. Aplikasi ini sudah
ada pada telepon selama manufaktur, atau di-download oleh pelanggan dari toko
aplikasi dan dari distribusi perangkat lunak mobile platform yang lain.

Sistem aplikasi mobile merupakan aplikasi yang dapat digunakan walaupun


pengguna berpindah dengan mudah dari satu tempat ketempat lain tanpa terjadi
pemutusan atau terputusnya komunikasi.

20
Saat ini sudah banyak sistem operasi yang mendukung aplikasi mobile, seperti
Windows phone, dan Android. Android adalah sistem operasi untuk mobile
device yang awalnya dikembangkan oleh Android Inc. Perusahaan ini kemudian
dibeli oleh Google pada tahun 2005. Android dibuat berdasarkan kernel Linux
yang dimodifikasi[16].

Gambar 2.12 Logo Android[17]

Android menyediakan platform terbuka bagi para pengembang untuk


menciptakan aplikasi mereka sendiri untuk digunakan oleh bermacam piranti
bergerak. Android menyediakan android SDK yang dapat dengan mudah
dipadukan dengan Integrated Development Environment.

Platform untuk perangkat selular sudah cukup banyak, di antaranya yaitu Symbian,
iPhone, Windows Mobile, BlackBerry, Java Mobile Edition, Linux Mobile
(LiM0), dan banyak lagi. Namun ada beberapa hal yang menjadi kelebihan
Android. Walaupun beberapa fitur yang ada telah muncul sebelumnya pada
platform lain, Android yang pertama menggabungkan hal seperti berikut :

a. Open Source, bebas pengembangan tanpa dikenakan biaya terhadap sistem


karena berbasiskan Linux dan open source. Pembuat perangkat menyukai
hal ini karena dapat membangun platform sesuai keinginkan tanpa
biaya royalti. Sementara pengembang software menyukai karena Android
dapat digunakan di perangkat manapun dan tanpa terikat oleh segala
vendor.
b. Banyak dukungan service, kemudahan dalam menggunakan berbagai
macam layanan pada aplikasi seperti penggunaan layanan pencarian
lokasi, database SQL, browser, dan penggunaan peta. Semuanya sudah

21
tertanam pada Android sehingga memudahkan dalam mengembangan
aplikasi.
c. Dukungan grafis terbaik, dengan adanya dukungan 2D grafis dan animasi
yang diilhami oleh Flash menyatu dalam 3D menggunakan OpenGL
memungkinkan membuat aplikasi maupun game yang berbeda.

22
BAB III

PERANCANGAN SISTEM

3.1.Analisa Kebutuhan Sistem


Untuk memahami kebutuhan sistem secara keseluruhan akan diuraikan kebutuhan
sistem secara fungsional maupun kebutuhan non fungsional

3.2.1. Kebutuhan Fungsional Sistem


Kebutuhan fungsional adalah kebutuhan yang berisi proses-proses apa saja yang
nantinya dilakukan oleh sistem, yaitu :

1. Sistem mampu merekam suara detak jantung.


2. Sistem mampu mengirim dan menerima data dari raspberry pi ke
smartphone.
3. Sistem mampu memutar kembali suara detak jantung yang telah direkam.

3.2.2. Kebutuhan Non-Fungsional Sistem


Kebutuhan nonfungsional adalah kebutuhan yang menitikberatkan pada properti
perilaku yang dimiliki oleh sistem.

1. Sistem menggunakan smartphone yang memiliki OS Android.


2. Sistem berkomunikasi dengan mengunakan bluetooth.

3.2. Rancangan Umum Sistem


Berikut merupakan arsitektur rancangan sistem yang akan dibuat :

Gambar 3.1 Arsitektur Rancangan Sistem

23
Berdasarkan Gambar 3.1 di atas, Aplikasi pada smartphone dapat mengontrol
raspberry pi untuk memulai, berhenti, atau memutar ulang suara hasil rekaman
tersebut. Ketika proses rekaman telah dimulai, suara detak jantung akan tertangkap
oleh stetoskop dan diteruskan ke mikrofon, kemudian suara tersebut diproses oleh
raspberry pi untuk rekam dan kemudian di filter. Pada saat proses merekam suara,
pengguna dapat mendegarkan secara langsung suara yang akan direkam melalui
earphone.

3.3. Rancangan Proses


Perancangan sistem dilakukan dengan menspesifikasikan fungsionalitas sistem,
mulai sejak akuisisi data hingga output hasil didapatkan oleh pengguna. Secara
sistematis, alur fungsi sistem dapat dilihat pada flowchart berikut ini :

24
Gambar 3.2 Flowchart Alur Fungsi Sistem

Berdasarkan Gambar 3.2 di atas, pada saat aplikasi dijalankan pada smartphone,
aplikasi tersebut akan memeriksa koneksi smartphone dengan raspberry pi. Jika
koneksi gagal, maka aplikasi akan mengulang kembali memeriksa koneksi sampai
koneksi tersebut berhasil. Jika koneksi berhasil, akan muncul menu untuk
menambah rekaman dan melihat semua data suara yang telah direkam. Ketika
pengguna memilih untuk menambah rekaman suara, maka akan muncul tampilan
halaman rekaman, pada halaman ini pengguna bisa memulai merekam dengan cara
menekan tombol “Rekam” dan proses merekam suara akan berjalan. Ketika
pengguna ingin menyudahi rekaman suara, tekan tombol “Berhenti Merekam” dan
proses perekaman suara akan dihentikan, kemudian rekaman suara akan disimpan
di media penyimpanan pada raspberry pi.

25
Pada tampilan halaman menu, jika pengguna memilih untuk melihat semua data
rekaman, maka aplikasi akan mengambil semua data hasil rekaman dan
ditampilkan pada aplikasi smartphone berupa listview.

3.3.1. Perancangan Hardware


Modern Stetoskop ini menggunakan stetoskop yang sudah dimodifikasi dengan
mikrofon dan terhubung dengan raspberry pi. Bentuk perancangan hardware dari
sistem ini adalah sebagai berikut :

Modern Stetoskop Smartphone

Gambar 3.3 Perancangan Hardware

Berdasarkan Gambar perancangan hardware di atas, prinsip kerja dari sistem ini
adalah :

1. Stetoskop digunakan untuk menangkap suara dari detak jantung dari


pasien. Bagian yang diambil dari setoskop ini hanya rubber tube,
diaphragm, dan bell.
2. Mikrofon digunakan sebagai tranduser yang berfungsi untuk mendeteksi
sinyal suara dan menghasilkan sinyal elektrik berupa tegangan atau arus
yang nantinya dapat diolah oleh mikrokontroller.
3. Raspberry pi merupakan sebuah komputer mini yang digunakan sebagai
alat perekam suara detak jantung.
4. Earphone digunakan sebagai alat pendengar suara detak jantung yang akan
direkam. Earphone ini akan aktif ketika raspberry pi dihidupkan.

26
5. Smartphone digunakan untuk memberikan instruksi merekam, memutar
kembali dan menampilkan grafik dari sura detak jantung yang direkam ke
raspberry pi.

3.3.2. Perancangan Software


Pemrograman yang akan dilakukan dalam penelitian ini dibuat dengan bahasa
pemrograman python untuk memprogram Raspberry Pi, dan Java untuk
memprogram aplikasi smartphone.

3.4.2.1. Perancangan Embedded Software


Perancangan embedded software ini digunakan untuk menerima request dari
aplikasi smartphone, kemuadian menjalankan sesuai dengan request yang
diterima. Secara sistematis, cara kerja embedded software dapat dilihat pada
flowchart berikut :

Gambar 3.4 Flowchart Perancangan Embedded Software

27
Pada Gambar 3.4 di atas dapat dilihat bahwa sistem akan memeriksa request dari
aplikasi smartphone secara terus menerus selama sistem ini dijalankan. Terdapat
tiga request yang akan diproses oleh sistem yaitu: merekam, berhenti merekam,
dan tampilkan data. Ketika rekaman dihentikan, maka rekaman suara akan
disimpan dalam bentuk file .wav yang dapat diputar ulang dika diiginkan. Untuk
menampilkan data pada aplikasi smartphone, data yang dikirimkan berupa string
yang nantinya akan ditampilkan berupa listview pada smartphone.

3.4.2.2. Perancangan Software pada Aplikasi Smartphone


Pada perancangan software untuk smartphone ini digunakan untuk mengontrol
raspberry pi agar dapat merekam dan menyimpan rekaman tersebut pada media
penyipanan raspberry pi. Secara sistematis, cara kerja aplikasi smartphone dapat
dilihat pada flowchart berikut :

Gambar 3.5 Flowchart Perancangan Software pada Aplikasi Smartphone

28
Pada Gambar 3.5 diatas dapat dilihat bahwa saat aplikasi dijalankan, aplikasi
tersebut akan memeriksa apakah ada sambungan ke bluetooth raspberry pi atau
tidak. Ketika sambungan gagal, maka aplikasi akan mengulang memeriksa
sambungan bluetooth kembali. Ketika sambungan berhasil, akan tampil menu
dimana pengguna dapat mengontrol raspberry pi untuk mulai merekam, berhenti
merekam, dan melihat semua hasil rekaman yang tersimpan pada raspberry pi.
untuk dapat melakukan pengontrolan tersebut, aplikasi smartphone ini akan
mengirimkan request ke raspberry pi sesuai dengan menu yang dipilih oleh
pengguna.

3.3.3. Perancangan Interface Aplikasi Smartphone


Pada perancangan aplikasi ini menggunakan smartphone android sebagai
interface. Perancangan aplikasi ini dapat dilihat dari gambar berikut.

3.4.3.1. Interface Menu Utama

Gambar 3.6 Interface Menu Utama

Pada Gambar 3.6 di atas merupakan tampilan halaman utama dari interface yang
dirancang. Pada halaman utama ini terdapat dua buah menu yang mana masing-
masing menu memiliki fungsi yang berbeda. Menu tambah berfungsi untuk
menambah rekaman baru sedangkan menu daftar rekaman berfungsi untuk
menampilkan semua rekaman yang ada pada raspberry pi.

29
3.4.3.2. Interface Halaman Rerekam

(a) (b)
Gambar 3.7 Interface Halaman Rekaman

Pada Gambar 3.7 di atas dapat dilihat bahwa ketika pengguna memilih menu
tambah rekaman, maka akan dilanjutkan ke halaman rekaman seperti pada gambar.
Ketika pengguna ingin merekam, maka akan muncul halaman seperti pada Gambar
3.7 a. Setelah proses perekaman dimulai, maka akan muncul halaman seperti
Gambar 3.7 b untuk menghentikan proses rekaman.

3.4.3.3. Interface Halaman Daftar Rekaman

(a) (b)

Gambar 3.8 Interface Halaman Daftar Rekaman

30
Pada Gambar 3.8 di atas dapat dilihat bahwa ketika pengguna memilih menu daftar
rekaman, maka akan muncul halaman daftar semua rekaman yang ada pada
raspberry pi seperti pada Gambar 3.8 a. Ketika pengguna memilih salah satu
rekaman, maka akan muncul tampilan seperti Gambar 3.8 b.

3.4. Rancangan Pengujian


Pada sub-bab ini akan dibahas bagaimana rencana tindakan yang harus dilakukan
dan data yang harus diperoleh dari hardware dan software serta sistem secara
keseluruhan pada saat sistem selesai diimplementasikan.

3.4.1. Pengujian Hardware


Pada sistem Modern Stetoskop ini hardware yang akan digunakan adalah
stetoskop, mikrofon, earphone, dan sebuah smartphone android. Pada tabel di
bawah ini akan dijelaskan rencana pengujian dari setiap komponen hardware yang
digunakan.

Tabel 3.1 Pengujian Hardware


No Komponen Rencana Pengujian Tujuan

1 Stetoskop Menguji kemampuan Untuk mengetahui suara


stetoskop dalam memaca detak jantung pasien
suara detak jantung pasien
2 Mikrofon Menguji kemampuan Untuk mengetahui
mikrofon dalam menangkap kemampuan mikrofon
suara yang dihasilkan oleh menangkap suara dari
stetoskop. stetoskop.
3 Raspberry Pi  Menguji jangkauan dari  Untuk mengetahui
bluetooth ketika jarak yang dapat
pengiriman data. dijangkau untuk
pengiriman data
antara raspberry pi
dan smartphone.

31
3.4.2. Pengujian Software
Pada sistem Modern Stetoskop ini software yang akan digunakan adalah
pemrograman python sebagai bahasa pemrograman pada raspberry pi, kemudian
pemrograman java sebagai bahasa pemrograman pada interface aplikasi
smartphone. Pada tabel di bawah ini akan dijelaskan rencana pengujian dari setiap
komponen software yang digunakan.

Tabel 3.2 Pengunjian Software.


No Komponen Rencana Pengujian Tujuan

1 Python  Mencocokkan antara  Untuk mengetahui


request yang dikirim instruksi berjalan
degan instruksi yang sesuai dengan yang
dijalankan oleh dibutuhkan.
rapberry pi.  Untuk mengetahui
 Menguji kemampuan kemampuan raspberry
raspberry pi dalam pi dalam memfilter
memfilter noise. suara.
 Menguji kemampuan  Untuk megetahui
raspberry pi dalam kemampuan
merekam suara dari raspberrypi dalam
mikrofon. merekam suara.
2 Aplikasi  Menguji keberhasilan  Untuk mengetahui
Smartphone pengiriman dan keberhasilan
penerimaan data dari pengiriman data.
aplikasi smartphone
ke raspberry pi.
 Menguji kecokan data  Untuk mengetahui
grafik yang ada pada data yang dikirim dan
raspberry pi dengan diterima sesuai atau
yang dikirim ke tidak.
smartphone.

32
3.5. Analisa Kebutuhan Penelitian
Analisa kebutuhan sistem terbagi 2 bagian, yaitu kebutuhan software dan
kebutuhan hardware. Berikut merupakan kebutuhan hardware dan software pada
penelitian ini.

Tabel 3.3 Kebutuhan Penelitian.


Hardware Software
1. Stetoskop 1. Python
2. Raspberry Pi 2. Android Studio
3. Smartphone Android

33
BAB IV

IMPLEMENTASI DAN PENGUJIAN

4.1. Implementasi
Modern stetoskop ini diimplementasikan berdasarkan rancangan yang telah
dipaparkan pada bab perancangan sistem. Implementasi yang telah dilakukan pada
sistem terbagi menjadi tiga bagian yaitu implementasi perangkat keras,
implementasi perangkat lunak dan implementasi sistem secara keseluruhan.

4.1.1. Implementasi Hardware


Untuk membangun sistem modern stetoskop ini, hardware yang digunakan
berupa stetoskop, microphone, earphone, raspberry pi, smartphone. Sedangkan
untuk komunikasi data antara raspberry pi dengan smartphone menggunakan
bluetooth.

Gambar 4.1 Implementasi Hardware

Kererangan Gambar 4.1:


a. Stetoskop digunakan untuk menangkap suara dari detak jantung dari pasien.
Bagian yang diambil dari setoskop ini hanya rubber tube, diaphragm, dan bell.
b. Mikrofon digunakan sebagai tranduser yang berfungsi untuk mendeteksi sinyal
suara dan menghasilkan sinyal elektrik berupa tegangan atau arus yang

34
nantinya dapat diolah oleh mikrokontroller. Pada gambar tersebut, mikrofon
ditanam di dalam rubber tube stetoskop.
c. Raspberry pi merupakan sebuah komputer mini yang digunakan sebagai alat
perekam suara detak jantung.
d. Earphone digunakan sebagai alat pendengar suara detak jantung yang akan
direkam. Earphone ini akan aktif ketika raspberry pi dihidupkan.
e. Smartphone digunakan untuk memberikan instruksi merekam, memutar
kembali dan menampilkan grafik dari sura detak jantung yang direkam ke
raspberry pi.

4.1.2. Implementasi Software


Implementasi software mencakup 2 komponen perangkat lunak yaitu :

1. Aplikasi Smartphone, pembangunan aplikasi Smartphone yang berguna


sebagai user interface menggunakan software android studio. Pada sistem
modern stetoskop ini terdapat beberapa tampilan, yaitu tampilan halaman
utama, daftar bluetooth, rekaman, daftar rekaman, detail rekaman.
2. Python, merupakan sebuah bahasa pemrograman yang digunakan pada
raspberry pi untuk dapat merekam, menyimpan hasil rekaman dan memfilter
suara.

4.2.2.1. Implementasi Aplikasi Smartphone


Implementasi aplikasi smartphone dapat dilihat pada gambar berikut :

35
a

(a) (b)

Gambar 4.2 Implementasi Halaman Utama

Keterangan Gambar 4.2. (a):

Gambar 4.2. (a) merupakan pesan yang muncul untuk menghidupkan layanan
bluetooth pada smartphone. Ketika pengguna menekan tombol “YES” maka
secara otomatis layanan bluetooth akan menyala, jika pengguna menekan tombol
“NO” maka aplikasi tidak dapat digunakan dan mengharuskan penguna
menghidupkan layanan bluetooth secara manual.

Keterangan Gambar 4.2. (b):

Gambar 4.2. (b) merupakan halaman utama dimana terdapat tombol-tombol yang
berfungsi sebagai berikut:

a. Tombol yang berfungsi untuk memilih sambungan bluetooth yang telah


dikenalkan oleh smartphone ke perangkat bluetooth lainnya.
b. Tombol yang berfungsi untuk pindah ke halaman rekam suara detak jantung.
c. Tombol yang berfungsi untuk pindah ke halaman daftar rekaman.

36
Gambar 4. 3 Implementasi Halaman Daftar Bluetooth.

Keterangan Gambar 4.3:

Gambar 4.3 di atas merupakan halaman yang akan menampilkan semua daftar
bluetooth yang telah dikenalkan sebelumnya dengan perangkat bluetooth lainnya.
Untuk dapat terhubung dengan bluetooth pada raspberry pi, pengguna hanya perlu
menentuh nama bluetooth yang terlah diatur pada raspberry pi.

Gambar 4.4 Implementasi Halaman Rekaman.

37
Keterangan Gambar 4.4:

Gambar 4.4 di atas merupakan tampilan halaman rekaman. Ketika tombol a


ditekan, maka aplikasi tersebut akan mengirimkan perintah untuk memulai
rekakam ke raspberry pi. Untuk mengirimkan perintah berhenti merekam, tekan
tombol a sekali lagi.

a
b

Gambar 4.5 Implementasi Halaman Daftar Rekaman.

Keterangan Gambar 4.5:

Gambar 4.5 di atas merupakan tampilan halaman daftar rekaman detak jantung.
Pada halaman ini pengguna dapat melihat semua rekaman suara detak jantung yang
sudah di filter dan yang belum di filter. Untuk setiap data rekaman suara detak
jantung terdapat dua buah tombol yang berfungsi sebagai berikut:

a. Merupakan tombol yang berfungsi untuk pindah kehalaman detail rekaman


sesuai dengan rekaman yang dipilih oleh pengguna.
b. Merupakan tombol yang berfungsi untuk menghapus rekaman sesuai dengan
yang dipilih oleh pengguna.

38
(a) (b)
Gambar 4.6 Implementasi Halaman Detail Rekaman.

Keterangan Gambar 4.6:

Gambar 4.6 di atas merupakan halaman detail rekaman. Pada halaman ini terdapat
dua buah tab yaitu tab “GRAFIK” (Gambar 4.6 a) dan tab “PLAY AUDIO”
(Gambar 4.6 b). Tab “GRAFIK” berfungsi untuk menampilkan grafik dari
rekaman suara yang dipilih oleh pengguna pada halaman sebelumnya. Sedangkan
tab “PLAY AUDIO” berfungsi untuk memutar kembali suara rekaman yang
berada di rasberry pi dan dapat didengarkan melalui earphone yang terhubung ke
raspberry pi.

4.2.2.2. Implementasi Program Python Pada Raspberry Pi


Implementasi python pada raspberry pi dapat dilihat pada gambar berikut :

39
Gambar 4.7 Implementasi Program Pyton Pada Raspberry Pi.

Keterangan Gambar 4.7:

Gambar 4.7 merupakan program dengan menggunakan bahasa pemrograman


python dan dijalankan melalui terminal yang terdapat pada raspberry pi. Program
tersebut berfungsi untuk menangkap instruksi yang dikirimkan oleh smartphone
dengan media komunikasi bluetooth kemudian menjalankan setiap instruksinya.
Terdapa beberapa instruksi yang akan dijalankan oleh program yaitu:

a. Start_record, berfungsi untuk memulai merekam suara dari mikrofon.


b. Stop_record, berfungsi untuk menghentikan rekaman kemudian
menyimpannya dalam bentuk *.wav file kemudian di filter dan disimpan dalam
bentuk file audio baru dengan format *.wav.
c. List_record, berfungsi untuk mengirimkan semua daftar rekaman yang sudah
tersimpan di folder /rec pada raspberri pi ke smartphone.
d. Play_record, berfungsi untuk memutar file rekaman sesuai dengan yang dipilih
oleh pengguna di smartphone.
e. Stop_record, berfungsi untuk mengakiri pemutaran rekaman.

40
f. Grafik_[nama_file_rekaman], berfungsi untuk mengubah data audio menjadi
data integer kemudian mengirimkan data tersebut satu persatu ke smartphone.

4.2. Pengujian dan Analisa


Pengujian sistem dilakukan untuk mengetahui apakah komponen dari sistem yang
dirancang dapat bekerja dengan baik.

4.2.1. Pengujian dan Analisa Hardware


4.2.1.1. Pengujian Stetoskop
Pengujian dilakukan untuk melihat kemampuan stetoskop dalam mendeteksi suara
detak jantung pasien. Pengujian ini akan dilakukan dengan cara merekam suara
detak jantung 4 orang sebanyak 5 kali dengan durasi rekaman selama 3 detik.
Kemudian suara hasil rekaman dapat diproses pada raspberry pi untuk melihat
nilai dari amplitudo yang telah diubah dalam satuan decibel(dB) seperti pada
Gambar 4.8 berikut.

Gambar 4.8 Sampel Suara Rekaman Detak Jantung M. Arief

Pada Gambar 4.8 di atas dapat dilihat grafik dari salah satu sampel rekaman suara
berdasarkan nilai amplitudo (dB) dan frekwensi (Hz). Dengan demikian, akan

41
didapat rentang nilai amplitudo dari rekaman suara detak jantung seperti pada
Tabel 4.1 berikut.

Tabel 4.1 Pengujian Stetoskop


Pengujian Rentang Nilai
Pasien Nama file rekaman
Ke- Amplitudo (dB)
1 M. Arief Record_001.wav 19,34 – (-44,55)
Record_002.wav 18,40 – (-37,97)
Record_003.wav 20,09 – (-41,89)
Record_004.wav 19,03 – (-49,86)
Record_005.wav 19,57 – (-45,03)
2 Rizki Fajri Record_023.wav 19,34 – (-50,19)
Record_024.wav 19,00 – (-49,75)
Record_025.wav 19,00 – (-49,73)
Record_028.wav 19,61 – (-44,07)
Record_029.wav 19,16 – (-42,62)
3 Arrya Anandika Record_053.wav 20,64 – (-43,68)
Record_054.wav 19,12 – (-40,58)
Record_055.wav 19,91 – (-48,79)
Record_056.wav 20,47 – (-45,94)
Record_058.wav 20,20 – (-40,69)
4 Yunus Record_081.wav 20,48 – (-42,56)
Rahmadhani Record_082.wav 19,10 – (-42,81)
Record_083.wav 20,22 – (-42,23)
Record_085.wav 20,96 – (-28,92)
Record_086.wav 19,75 – (-54,52)

Pada Tabel 4.1 diatas, terdapat 4 kali pengujian dengan 4 orang pasien yang
berbeda-beda. Untuk satu orang pasien dilakukan perekaman suara detak jantung
sebanyak 5 kali dengan waktu rekaman selama 3 detik.

Pada pengujian ke-1, didapatkan nilai amplitudo paling tinggi 20,09 dB dan yang
paling rendah bernilai -49,86 dB. Untuk pengujian ke-2, didapatkan nilai
amplitudo paling tinggi 19,34 dB dan yang paling rendah bernilai -50,19 dB.

42
Untuk pengujian ke-3, didapatkan nilai amplitudo paling tinggi 20,64 dB dan yang
paling rendah bernilai -48,79 dB. Untuk pengujian ke-4, didapatkan nilai
amplitudo paling tinggi 20,96 dB dan yang paling rendah bernilai -54,52 dB.
Untuk pengujian secara keseluruhan didapatkan nilai amplitudo tertinggi 20,96
dB dan yang paling rendah -54,52 dB.

Berdasarkan data pengujian keempat pasien tersebut, dapat disimpulkan bahwa


nilai amplitudo dari suara detak jantung yang terdeteksi oleh stetoskop tidak jauh
berbeda yaitu rentang antara 20,96 dB – (-54,52) dB.

4.2.1.2. Pengujian Bluetooth


Pengujian dilakukan untuk melihat jarak minimum dan maksimum dari jangkauan
bluetooth rapsberry pi, sehingga semua data dapat terkirim dengan baik. Pengujian
dilakukan dengan cara mendeteksi bluetooth raspberry pi dengan bluetooth pada
smartphone. Berikut merupakan tabel pengujian bluetooth:

Tabel 4.2 Pengujian Bluetooth


Pengujian Jarak (m) Mendeteksi Buletooth
ke-
1 1 Terdeteksi
2 5 Terdeteksi
3 10 Terdeteksi
4 15 Terdeteksi
5 20 Terdeteksi
6 25 Terdeteksi
7 30 Terdeteksi
8 35 Terdeteksi
9 40 Terdeteksi
10 >40 Tidak Terdeteksi

Berdasarkan pengujian di atas, dapat disimpulkan bahwa bluetooth pada raspberry


pi dapat terdeteksi dan bekerja dengan baik pada jarak 0 sampai 40 meter. Request
yang dikirim oleh smartphone ke raspberry tidak dapat dikirim ketika jarak dari
alat tersebut besar dari 40 meter.

43
4.2.1.3. Pengujian Raspberry Pi
Pengujian ini dilakukan untuk mengetahui kemampuan raspberry pi dalam
merekam dan memfilter suara yang terdengar pada stetoskop. Pengujian ini
dilakukan dengan cara merekam suara detak jantung 4 orang pasien dengan variasi
rekaman 3 detik, 5 detik, 8 detik, dan 10 detik. Kemudian akan dilihat lamanya
durasi rekaman ketika pengguna menghentikan rekaman pada aplikasi
smartphone dan dicocokkan dengan durasi rekaman yang tersimpan pada
raspberry pi. Selanjutnya akan dilihat juga lamanya waktu untuk raspberry pi
dapat memfilter rekaman detak jantung seperti pada Tabel 4.5 berikut.

Tabel 4.3 Pengujian Raspberry Pi


Merekam Suara Detak Jantung Waktu yang
Durasi Durasi yang Dibutuhkan Untuk
Pengujian Rekaman Terekam Selisih Memfilter Rekaman
Nama Pasien
ke- pada pada Durasi Suara Detak
Smartphone Raspberry Rekaman Jantung
(detik) Pi (detik) (detik)
1 M. Arief 3 2,51 0,49 0,22
5 4,44 0,56 0,36
8 7,85 0,15 0,54
10 9,36 0,64 0,68
2 Rizki Fajri 3 2,95 0,05 0,22
5 4,44 0,56 0,37
8 7,36 0,64 0,56
10 9,36 0,64 0,74
3 Arrya Anandika 3 2,30 0,70 0,24
5 4,44 0,56 0,33
8 7,80 0,2 0,56
10 9,89 0,11 0,65
4 Yunus Rahmadhani 3 2,86 0,14 0,23
5 4,30 0,70 0,38
8 7,80 0,20 0,53
10 9,36 0,64 0,68
Rata-rata 0,44

44
Berdasarkan data pengujian pada Tabel 4.3 di atas, dapat di lihat bahwa durasi
rekaman yang ditampilkan pada aplikasi smartphone tidak sesuai dengan durasi
rekaman yang tersimpan di raspberry pi. Selisih durasi rekaman terbesar adalah
0,64 detik sedangkan selisih durasi rekaman terkecil adalah 0,05 detik. Dengan
demikian, didapatkan rata-rata selisih durasi rekaman adalah 0, 44 detik. Adanya
selisih dari durasi rekaman disebabkan karena lamanya request terkirim ke
raspberry pi.

Untuk pengujian memfilter suara rekaman pada data Tabel 4.3 di atas, dapat
dilihat bahwa untuk memfilter rekaman dengan durasi 2,30 detik – 2,95 detik
dibutuhkan waktu selama 0,22 detik – 0,24 detik. Untuk rekaman dengan durasi
4,30 detik – 4,44 detik dibutuhkan waktu selama 0,33 detik – 0,38 detik. Untuk
rekaman dengan durasi 7,36 detik – 7,85 detik dibutuhkan waktu selama 0,53 detik
– 0,56 detik. untuk rekaman dengan durasi 9,36 detik – 9,89 detik dibutuhkan
waktu selama 0,65 detik – 0,74 detik. Dapat disimpulkankan bahwa lamanya
waktu yang dibutuhkan untuk memfilter suara rekaman detak jantung tergantung
pada lamanya suara detak jantung yang direkam.

4.2.2. Pengujian dan Analisa Software


Pengujian dilakukan untuk memeriksa fungsi-fungsi dari setiap interface untuk
meminta dan mengirimkan data yang diinginkan oleh pengguna. Sehingga kita
dapat mengetahui bahwa aplikasi menjalankan fungsi sesuai dengan yang diminta
pengguna. Pengujian ini ditujukan untuk interface pada aplikasi smartphone dan
program python pada raspberry pi. Pengujian dikatakan berhasil apabila request
yang dikirim oleh aplikasi smartphone diterima dan dilaksanakan oleh program
python pada raspberry pi.

4.2.2.1. Pengujian Aplikasi Smartphone


Pengujian dilakukan untuk memeriksa fungsi-fungsi tombol pada interface
aplikasi smartphone. Sehingga kita dapat mengetahui bahwa aplikasi menjalankan
fungsi sesuai dengan yang diminta pengguna. Keberhasilan pengujian dapat dilihat
dari request yang diterima oleh raspberry pi melalui komunikasi bluetooth. Berikut
tabel hasil pengujian dari aplikasi smartphone:

45
Tabel 4.4 Pengujian Aplikasi Smartphone
Putar Hapus
Pengujian Sambungan Mulai Berhenti Tampilkan Tampilkan
Hasil Data
ke- Bluetooth Merekam Merekam Rekaman Grafik
Rekaman Rekaman
1 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
2 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
3 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
4 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
5 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
6 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
7 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
8 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
9 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
10 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
11 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
12 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil

Berdasarkan pengujian yang dilakukan di atas, telah dilakukan pengujian


sebanyak 12 kali pada masing-masing tombol, sehingga terdapat 84 kali
pengujian. Dapat disimpulkan bahwa aplikasi smartphone dapat berjalan dengan
baik. Persentase keberhasilan pengujian interface aplikasi smartphone dalam
mengirimkan request adalah sebagai berikut:

𝐽𝑢𝑚𝑙𝑎ℎ 𝑃𝑒𝑛𝑔𝑢𝑗𝑖𝑎𝑛 𝐵𝑒𝑟ℎ𝑎𝑠𝑖𝑙


Persentase Keberhasilan = 𝑥 100%
𝐵𝑎𝑛𝑦𝑎𝑘𝑛𝑦𝑎 𝑃𝑒𝑛𝑔𝑢𝑗𝑖𝑎𝑛

84
Persentase Keberhasilan = 84 𝑥 100%

Persentase Keberhasilan = 100%

4.2.2.2. Pengujian Program Python


Pengujian dilakukan untuk memeriksa fungsi-fungsi yang berjalan pada program
python sesuai dengan request penggunadari smartphone. Sehingga kita dapat
mengetahui bahwa program python menjalankan fungsi sesuai dengan yang
diminta pengguna. Keberhasilan pengujian dapat dilihat dari kecocokan antara

46
request pengguna dari smartphone dengan fungsi yang berjalan pada program
python pada raspberry pi. Berikut tabel hasil pengujian dari aplikasi python:

Tabel 4.5 Pengujian Program Python


Putar Hapus
Pengujian Sambungan Mulai Berhenti Tampilkan Tampilkan
Hasil Data
ke- Bluetooth Merekam Merekam Rekaman Grafik
Rekaman Rekaman
1 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
2 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
3 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
4 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
5 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
6 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
7 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
8 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
9 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
10 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
11 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil
12 Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil Berhasil

Berdasarkan pengujian yang dilakukan di atas, telah dilakukan pengujian


sebanyak 12 kali pada masing-masing request, sehingga terdapat 84 kali
pengujian. Dapat disimpulkan bahwa program python pada raspberry pi dapat
menjalankan fungsi-fungsinya dengan baik sesuai dengan request pengguna.
Persentase keberhasilan pengujian program python untuk menerima request dan
menjalankan fungsi sesuai dengan request tersebut adalah:

𝐽𝑢𝑚𝑙𝑎ℎ 𝑃𝑒𝑛𝑔𝑢𝑗𝑖𝑎𝑛 𝐵𝑒𝑟ℎ𝑎𝑠𝑖𝑙


Persentase Keberhasilan = 𝑥 100%
𝐵𝑎𝑛𝑦𝑎𝑘𝑛𝑦𝑎 𝑃𝑒𝑛𝑔𝑢𝑗𝑖𝑎𝑛

84
Persentase Keberhasilan = 84 𝑥 100%

Persentase Keberhasilan = 100%

47
4.2.2.3. Pengujian Pengiriman Data Grafik
Pada pengujian ini, terdapat 2 pengujian yaitu: penguian waktu pengiriman data
dan kecocokan data yang dikirim dari raspberry pi ke aplikasi smartphone.

1. Pengujian Waktu Pengiriman Data Grafik

Pengujian dilakukan untuk memeriksa lama waktu pengiriman data grafik melalui
komunikasi bluetooth. Pada pengujian ini terdapat 4 pasien sebagai objek dari
pengujian. Terdapat 4 variasi durasi rekaman suara detak jantung yang akan
diambil pada masing-masing pasien yaitu: 3 detik, 5 detik, 8 detik, dan 10 detik.
Dengan begitu, dapat dilihat lamanya waktu untuk megirimkan data grafik dari
raspberry pi ke smartphone pada tiap-tiap variasi waktu seperti pada Tabel 4.6
berikut.

Tabel 4.6 Pengujian Waktu Pengiriman Data Grafik

Pengujian Nama Pasien Nama File Durasi Lama


ke- Rekaman Rekaman Waktu
(detik) Pengiriman
(detik)
1 M. Arief Record_001.wav 2,51 334
Record_006.wav 4,44 599
Record_011.wav 7,85 1008
Record_017.wav 9,36 1199
2 Rizki Fajri Record_023.wav 2,95 382
Record_033.wav 4,44 666
Record_040.wav 7,36 946
Record_045.wav 9,36 1206
3 Arrya Anandika Record_053.wav 2,30 298
Record_062.wav 4,44 668
Record_066.wav 7,80 1000
Record_074.wav 9,89 1209
4 Yunus Record_081.wav 2,86 386
Rahmadhani Record_088.wav 4,30 626
Record_094.wav 7,80 1001
Record_100.wav 9,36 1201

48
Berdasarkan data pengujian pada Tabel 4.6 di atas, didapatkan lamanya waktu
pengiriman data dari raspberry pi ke aplikasi smartphone. Untuk data dengan
durasi rekaman 2,30 detik – 2,95 detik dibutuhkan waktu pengiriman 298 detik –
386 detik. Untuk data dengan durasi rekaman 4,30 detik – 4,44 detik dibutuhkan
waktu pengiriman 599 detik – 668 detik. Untuk data dengan durasi rekaman 7,36
detik – 7,85 detik dibutuhkan waktu pengiriman 946 detik – 1008 detik. Untuk data
dengan durasi rekaman 9,36 detik – 9,86 detik dibutuhkan waktu pengiriman 1199
detik – 1209 detik.

Dari data tersebut dapat disimpulkan bahwa pengiriman data grafik dari raspberry
pi ke aplikasi smartphone melalui media komunikasi bluetooth membutuhkan
waktu yang sangat lama. Semakin besar durasi rekaman maka waktu yang
dibutuhkan untuk mengirimkan data grafik juga semakin besar.

2. Pengujian Kecocokan Pengiriman Data

Pengujian dilakukan untuk memeriksa kecocokan data yang dikirim oleh raspberry
pi ke aplikasi smartphone. Pada pengujian ini dilakukan dengan cara mengirim
data grafik dari hasil rekaman suara ke aplikasi smartphone. Sebelum data
dikirimkan, data suara rekaman terlebih dahulu diubah kedalam bentuk data array
kemudian dikirimkan ke aplikasi smartphone satu persatu sampai selesai melalui
media komunikasi bluetooth. Pengujian kecocokan pengiriman data ini dapat
dilihat pada Tabel 4.7 berikut.

Tabel 4.7 Pengujian Kecocokan Pengiriman Data

Persentase
Jumlah Jumlah Jumlah
Durasi nilai error
Pengujian Nama File Data Data Data
Rekaman yang
ke- Rekaman Sebelum Setelah Gagal
(detik) Didapat
Dikirim Dikirim Dikirim
(%)
1 2,51 Record_001.wav 221184 204138 17046 7,71
2,95 Record_023.wav 260096 243033 17063 6,56
2,30 Record_053.wav 202752 187475 15277 7,53

49
2,86 Record_081.wav 251904 236664 15240 6,05
2 4,44 Record_006.wav 391168 345835 45333 11,59
4,44 Record_033.wav 391168 349560 41608 10,64
4,44 Record_062.wav 391168 346439 44729 11,43
4,30 Record_088.wav 378880 338202 40678 10,74
3 7,85 Record_011.wav 692224 339313 352911 50,98
7,36 Record_040.wav 649216 393333 255883 39,41
7,80 Record_066.wav 688128 403085 285043 41,42
7,80 Record_094.wav 688128 399213 288915 41,99
4 9,36 Record_017.wav 825344 470552 354792 42,99
9,36 Record_045.wav 825344 417938 407406 49,36
9,89 Record_074.wav 872448 421519 450929 51,69
9,36 Record_100.wav 825344 436287 389057 47,14
Rata-rata nilai error 27,33

Berdasarkan pengujian pada Tabel 4.7 di atas, didapatkan nilai error dari
pengiriman data dari raspberry pi ke smartphone. Untuk data dengan durasi
rekaman 2,30 detik – 2,95 detik didapatkan nilai error sebesar 6,05% - 7,71%.
Untuk data dengan durasi rekaman 4,30 detik – 4,44 detik didapatkan nilai error
sebesar 10,64% - 11,59%. Untuk data dengan durasi rekaman 7,36 detik – 7,85
detik didapatkan nilai error sebesar 39,41% - 50,98%. Untuk data dengan durasi
rekaman 9,36 detik – 9,86 detik didapatkan nilai error sebesar 42,99% - 51,69%.
Secara keseluruhan, rata-rata nilai error yang diperoleh adalah 27,33%.

Berdasarkan pengujian tersebut dapat disimpulkan bahwa nilai error yang


diperoleh sangat besar pada data pengujian ke 2 dan 3. Error tersebut disebabkan
karena data yang diolah oleh smartphone sangat besar, sehingga banyak data yang
tertimpa saat data diterima oleh smartphone.

4.2.2.4. Pengujian Filter


Pengujian dilakukan untuk menghilangkan suara noise yang dihasilkan oleh
mikrofon. Sehingga suara hasil rekaman detak jantung lebih jernih dan tidak ada
terdengar noise yang dihasilkan oleh mikrofon. Pengujian ini dilakukan dengan

50
cara mengambil sampel dari hasil rekaman selama satu detik. kemudian suara
rekaman tersebut dibagi menjadi dua channel yang terdiri dari channel left dan
channel right. Setelah itu, masing-masing channel akan difilter menggunakan
Band Pass Filter(BPF) degan nilai cut off low sebesar 800 Hz dan nilai cut off high
sebesar 50 Hz. Nilai cut off low digunakan untuk meredam frekwensi yang lebih
lebih besar dari 800 Hz. Sedangkan nilai cut off high digunakan untuk meredam
frekwensi yang lebih kecil dari 50 Hz. Berikut adalah data perbandingan grafik
suara rekaman sebelum dan setelah difilter.

Tabel 4.8 Perbandingan Grafik Rekaman Sebelum dan Setelah Difilter

Pengujian Nama
Grafik Sebelum difilter Grafik setelah difilter
Ke- Pasien

1 M. Arief

51
3

6 Rizki Fajri

52
7

10

53
11 Arrya
Anandika

12

13

14

54
15

16 Yunus
Rahmadhani

17

18

55
19

20

Berdasarkan Tabel 4.9 di atas, pada pengujian ke-3 terdapat gangguan yang
berasal dari suara gesekan dari stetoskop yang tidak dapat difilter. Kemudian pada
pengujian ke-7 dan pengujian ke-19 terdapat gangguan yang berasal dari suara
perut. Dengan begitu dapat disimpulkan bahwa suara yang dapat difilter adalah
suara yang berasal dari noise yang dihasilkan oleh mikrofon.

56
BAB V

PENUTUP

5.1.Kesimpulan
Berdasarkan perancangan, pengamatan dan pengujian yang telah dilakukan maka
dapat diambil kesimpulan sebagai berikut:

1. Alat yang dirancang mampu mendeteksi suara detak jantung dengan


menggunakan stetoskop yang telah dimodifikasi dengan amplitudo antara
20,96 dB – (-54,52) dB.
2. Alat yang dirancang mampu untuk merekam suara detak jantung yang
dideteksi oleh stetoskop, namun terdapat perbedaan durasi rekaman sebesar
0,44 detik antara ditampilkan pada aplikasi smartphone dengan yang tersimpan
pada raspberry pi. Hal ini disebabkan lamanya request terkirim ke raspberry
pi.
3. Alat yang dirancang mampu untuk menghilangkan noise yang dihasilkan oleh
mikrofon pada rekaman suara detak jantung. tetapi tidak dapat menghilangkan
suara yang terjadi akibat gesekan dari stetoskop.
4. Raspberry pi dapat terhubung dengan smartphone melalui komunikasi
bluetooth dengan jarak maksimal 40 meter untuk dapat terdeteksi dan bekerja
dengan baik.
5. Alat yang dirancang membutuhkan waktu yang sangat lama untuk dapat
megirimkan data grafik dari raspberry pi ke aplikasi smartphone. data yang
dikirim oleh raspberry pi tidak seluruhnya diterima oleh aplikasi smartphone.
nilai error yang diperoleh untuk pengiriman data ini sebesar 27,33%.

5.2.Saran
Mengingat masih terdapat beberapa kekurangan dalam penelitian ini, maka perlu
dilakukan perbaikan untuk memperbaiki kinerja alat, adapun beberapa saran yang
diperlukan antara lain:
1. Pada penelitian selanjutnya disarankan agar sistem menggunakan komunikasi
yang lebih cepat, sehingga data dapat terkirim dengan cepat.

57
2. Pada penelitian selanjutnya disarankan agar sistem dapat menghilangkan suara
dari hasil gesekan kulit dengan stetoskop.

58
DAFTAR PUSTAKA

[1] Wolfe.Rosalee,dkk. 2006. Improved tool for fingerspelling recognition. Visual


communication and technology education faculty publications. Spring.
[2] Ebling.S. 2015. Synthesizing the finger alphabet of swiss german sign
language and evaluating the comprehensibility of the resulting animation. 6th
Workshop On Speech And Language Processing For Assistive Technologies.
Dresden,Germany.
[3] Anonim. Tanpa tahun. Pengertian Auskultasi dalam Kesehatan. URL:
http://www.definisimenurutparaahli.com/pengertian-auskultasi-dalam-
kesehatan/. Diakses pada tanggal 05 Agustus 2017
[4] Budiasih, Endang, Achmad Rizal dan Saiful Sabril. 2011. Pengembangan
Stetoskop Elektronik dan Software Analisis Auskultasi. Fakultas Elektro &
Komunikasi, Institut Teknologi Telkom, Bandung.
[5] Anonim. 2015. Pengertian, Struktur (Anatomi) dan Fungsi Jantung. URL:
http://www.softilmu.com/2015/10/Pengertian-Bagian-Bagian-Struktur-
Fungsi-Jantung-Adalah.html. Diakses pada tanggal 23 April 2017
[6] Anonim. 2015. Pengertian Jantung Dan Fungsinya Pada Manusia. URL:
http://www.dosenpendidikan.com/pengertian-jantung-dan-fungsinya-pada-
manusia/. Diakses pada tanggal 23 April 2017
[7] Nuryanti, Venti. 2010. Rancang Bangun Alat Pendeteksi dan Penghitung
Detak Jantung Dengan Asas Doppler. Program Studi Elektro, Universitas
Indonesia, Depok.
[8] Iqfadillah. 2015. Pengertian dan Fungsi Stetoskop dan Sejarah Penemuan
Stetoskop. URL: http://www.idmedis.com/2015/12/pengertian-dan-fungsi-
stetoskop-dan.html. Diakses pada tanggal 23 April 2017.
[9] Ramadhan, Muchammad Zulfikar. 2012. Perancangan Sistem Instrumentasi
Untuk Identifikasi dan Analisis Suara Paru-Paru Menggunakan DSP
TMS320C6416T. Program Studi FISIKA, Universitas Indonesia, Depok.
[10] Prasetiyo, Erwan Eko. 2012. Media Pembelajaran Filter Sinyal Audio
Untuk Mata Pelajaran Teknik Audio. Fakultas Teknik, Universitas Negeri
Yogyakarta, Yogyakarta.

59
[11] Rakhman, E., Faisal Candrasyah dan Fajar D.Sutera. 2014. Raspberry
PiMikrokontroller Mungil yang Serba Bisa. ANDI. Yogyakarta.
[12] Anonim. “Tanpa Tahun”. Raspberry Pi 3 Model B. URL:
https://www.raspberrypi.org/products/raspberry-pi-3-model-b/. Diakses pada
tanggal 24 April 2017.
[13] Matt. 2012. Simple Guide to the RPi GPIO Header and Pins. URL:
http://www.raspberrypi-spy.co.uk/2012/06/simple-guide-to-the-rpi-gpio-
header-and-pins/. Diakses pada tanggal 25 April 2017.
[14] Richardson, M dan S.Wallace. 2013. Getting Started With Raspberry
Pi. O’Reilly Media, Inc.,USA.
[15] Innovative Electronics. 2014. 2 model baru untuk mini PC populer dari
Raspberry Pi Foundation. URL : http://blog.innovativeelectronics.com/,
Diakses pada tanggal 25 April 2017.
[16] Yuniar, Supardi. 2014. Semua Bisa Menjadi Programmer Android.
Elex Media: Bandung.
[17] Yohn. 2015. Apa Itu Android, Pengertian Android. URL:
http://www.indonesian.my.id/2015/01/apa-itu-android-pengertian-
android.html. Diakses pada tanggal 25 April 2017.

60
LAMPIRAN

1. Listing Program Android Studio


- DaftarRekamanActivity
package com.example.shinichi.modernstetoskopv2;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.net.NetworkInfo;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.UUID;

public class DaftarRekamanActivity extends AppCompatActivity {


static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-
fba39e49d4ee");
static String record_file = null;
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private ConnectedThread myConnectThread;
private StringBuilder recDataString = new StringBuilder();

Handler handler;
ListView list_rekaman;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daftar_rekaman);

handler = new Handler() ;

61
list_rekaman = (ListView)findViewById(R.id.list_rekaman);

handler = new Handler() {


public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) { //if message is
what we want
String readMessage = (String) msg.obj;
// msg.arg1 = bytes from connect thread
recDataString.append(readMessage); //keep
appending to string until ~

String[] data = readMessage.split(":");


// txt1.setText(readMessage);
// Toast.makeText(getApplicationContext(),
Integer.toString(data.length), Toast.LENGTH_SHORT).show();

final ArrayList<String> list = new ArrayList<String>();


for (int i = 0; i < data.length; ++i) {
list.add(data[i]);
}
ArrayAdapter adapter = new
ArrayAdapter(DaftarRekamanActivity.this,
android.R.layout.simple_list_item_1, list);
list_rekaman.setAdapter(adapter);
list_rekaman.setOnItemClickListener(list_rekaman_click);
}
}
};
}

private AdapterView.OnItemClickListener list_rekaman_click = new


AdapterView.OnItemClickListener(){
public void onItemClick (AdapterView av, View v, int arg2, long arg3){
String info = ((TextView) v).getText().toString();
record_file = info;
//Toast.makeText(getApplicationContext(), record_file,
Toast.LENGTH_SHORT).show();
//Intent i = new Intent(DaftarRekamanActivity.this,
DetailRecordActivity.class);
Intent i = new Intent(DaftarRekamanActivity.this,
GraphRecordActivity.class);
startActivity(i);
}
};

public void onResume() {


super.onResume();
btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

62
try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {
//Toast.makeText(getBaseContext(), "Socket error connect",
Toast.LENGTH_LONG).show();
try
{
btSocket.close();
} catch (IOException e2)
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}
myConnectThread = new ConnectedThread(btSocket);
myConnectThread.start();

myConnectThread.write("list_record");
}

public void onPause() {


super.onPause();
myConnectThread.write("bt-restart");
}

public void onStop(){


super.onStop();
myConnectThread.write("bt-destroy");
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);
}

private class ConnectedThread extends Thread {


private final InputStream mmInStream;
private final OutputStream mmOutStream;

63
//creation of the connect thread
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[256];
int bytes;

// Keep looping to listen for received messages


while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
//Toast.makeText(getBaseContext(), "Koneksi tidak tersedia",
Toast.LENGTH_LONG).show();
//finish();
}
}
}
}

64
- DetailRecordActivity
package com.example.shinichi.modernstetoskopv2;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.scichart.charting.model.AxisCollection;
import com.scichart.charting.model.ChartModifierCollection;
import com.scichart.charting.model.RenderableSeriesCollection;
import com.scichart.charting.model.dataSeries.XyDataSeries;
import com.scichart.charting.modifiers.ModifierGroup;
import com.scichart.charting.modifiers.PinchZoomModifier;
import com.scichart.charting.modifiers.ZoomExtentsModifier;
import com.scichart.charting.modifiers.ZoomPanModifier;
import com.scichart.charting.visuals.SciChartSurface;
import com.scichart.charting.visuals.annotations.HorizontalAnchorPoint;
import com.scichart.charting.visuals.annotations.TextAnnotation;
import com.scichart.charting.visuals.annotations.VerticalAnchorPoint;
import com.scichart.charting.visuals.axes.AxisAlignment;
import com.scichart.charting.visuals.axes.DateAxis;
import com.scichart.charting.visuals.axes.IAxis;
import com.scichart.charting.visuals.axes.NumericAxis;
import com.scichart.charting.visuals.pointmarkers.EllipsePointMarker;
import
com.scichart.charting.visuals.renderableSeries.FastLineRenderableSeries;
import com.scichart.charting.visuals.renderableSeries.IRenderableSeries;
import com.scichart.core.annotations.Orientation;
import com.scichart.core.model.DateValues;
import com.scichart.core.model.DoubleValues;
import com.scichart.drawing.utility.ColorUtil;
import com.scichart.extensions.builders.SciChartBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;

65
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.util.UUID;

public class DetailRecordActivity extends AppCompatActivity {

private String record_file = null;


static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-
fba39e49d4ee");
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private ConnectedThread myConnectThread;

private boolean scroll = true;

private StringBuilder recDataString = new StringBuilder();


Handler handler;
TextView text_detail;
Button btn_scroll;

// GraphView mGraph;
// private LineGraphSeries<DataPoint> series;
// private static final Random RANDOM = new Random();
private double lastX;
private double time = 0;
private double fs, rate;
private XyDataSeries<Double, Double> dataSeries;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_record);

text_detail = (TextView)findViewById(R.id.textView);
btn_scroll = (Button)findViewById(R.id.btn_scroll);
record_file = DaftarRekamanActivity.record_file;
lastX = 0;
handler = new Handler();

// Create a SciChartSurface
final SciChartSurface surface = new SciChartSurface(this);

// Get a layout declared in "activity_main.xml" by id


LinearLayout chartLayout = (LinearLayout)
findViewById(R.id.chart_layout);

66
// Add the SciChartSurface to the layout
chartLayout.addView(surface);

// Initialize the SciChartBuilder


SciChartBuilder.init(this);

// Obtain the SciChartBuilder instance


final SciChartBuilder sciChartBuilder = SciChartBuilder.instance();

// Create a numeric X axis


final IAxis xAxis = sciChartBuilder.newNumericAxis()
.withAxisTitle("Time")
.withVisibleRange(-5, 15)
.build();

// Create a numeric Y axis


final IAxis yAxis = sciChartBuilder.newNumericAxis()
.withAxisTitle("Amplitudo").withVisibleRange(0, 100).build();

// Create a TextAnnotation and specify the inscription and position for it


TextAnnotation textAnnotation = sciChartBuilder.newTextAnnotation()
.withX1(5.0)
.withY1(55.0)
.withText("")
.withHorizontalAnchorPoint(HorizontalAnchorPoint.Center)
.withVerticalAnchorPoint(VerticalAnchorPoint.Center)
.withFontStyle(20, ColorUtil.White)
.build();

// Create interactivity modifiers


ModifierGroup chartModifiers = sciChartBuilder.newModifierGroup()
.withPinchZoomModifier().withReceiveHandledEvents(true).build()
.withZoomPanModifier().withReceiveHandledEvents(true).build()
.build();

// Add the Y axis to the YAxes collection of the surface


Collections.addAll(surface.getYAxes(), yAxis);

// Add the X axis to the XAxes collection of the surface


Collections.addAll(surface.getXAxes(), xAxis);

// Add the annotation to the Annotations collection of the surface


Collections.addAll(surface.getAnnotations(), textAnnotation);

// Add the interactions to the ChartModifiers collection of the surface


Collections.addAll(surface.getChartModifiers(), chartModifiers);

final XyDataSeries lineData =


sciChartBuilder.newXyDataSeries(Double.class, Integer.class).build();

67
// Create and configure a line series
final IRenderableSeries lineSeries = sciChartBuilder.newLineSeries()
.withDataSeries(lineData)
.withStrokeStyle(ColorUtil.LightBlue, 2f, true)
.build();

// Create an Ellipse PointMarker for the Scatter Series


EllipsePointMarker pointMarker = sciChartBuilder
.newPointMarker(new EllipsePointMarker())
.withFill(ColorUtil.LightBlue)
.withStroke(ColorUtil.Green, 2f)
.withSize(10)
.build();

// Add a RenderableSeries onto the SciChartSurface


surface.getRenderableSeries().add(lineSeries);

// Create a LegendModifier and configure a chart legend


// ModifierGroup legendModifier = sciChartBuilder.newModifierGroup()
// .withLegendModifier()
// .withOrientation(Orientation.HORIZONTAL)
// .withPosition(Gravity.CENTER_HORIZONTAL |
Gravity.BOTTOM, 10)
// .build()
// .build();
//
// // Add the LegendModifier to the SciChartSurface
// surface.getChartModifiers().add(legendModifier);

// Create and configure a CursorModifier


ModifierGroup cursorModifier = sciChartBuilder.newModifierGroup()
.withCursorModifier().withShowTooltip(true).build()
.build();

// Add the CursorModifier to the SciChartSurface


surface.getChartModifiers().add(cursorModifier);

btn_scroll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(scroll){
scroll = false;
btn_scroll.setText("Start Scroll");
}else{
scroll = true;
btn_scroll.setText("Stop Scroll");
}

68
}
});

handler = new Handler() {


public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) { //if message is
what we want
String readMessage = (String) msg.obj;
String tmp[] = readMessage.split(":");
int y = Integer.valueOf(tmp[0]);
try {
if (lastX == 0){
fs = Integer.valueOf(tmp[0]);
rate = Integer.valueOf(tmp[1]);
time = rate/fs;
lastX++;
}else{
if (scroll){
surface.zoomExtents();
}
lineData.append(lastX/rate*time, y);
lastX++;
}
}catch (Exception e){

}
}else{
text_detail.setText("Tidak terima data");
}
}
};

btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {
//Toast.makeText(getBaseContext(), "Socket error connect",
Toast.LENGTH_LONG).show();

69
try
{
btSocket.close();
} catch (IOException e2)
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}
myConnectThread = new ConnectedThread(btSocket);
myConnectThread.start();
myConnectThread.write(record_file);
}

@Override
public void onResume() {
super.onResume();
//myConnectThread.write(record_file);
}

@Override
public void onBackPressed() {
super.onBackPressed();

//Toast.makeText(getApplicationContext(),"asdasd",Toast.LENGTH_SHORT).s
how();
try {
btSocket.close();
} catch (IOException e) {
}
}

@Override
public void onPause() {
super.onPause();
//myConnectThread.write("bt-restart");
}

@Override
public void onStop(){
super.onStop();
myConnectThread.write("bt-destroy");
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);
}

70
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread


public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[1024];
int bytes;

// Keep looping to listen for received messages


while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Toast.makeText(getBaseContext(), "Koneksi tidak tersedia",
Toast.LENGTH_LONG).show();

71
finish();
}
}
}
}

- GraphRecActivity
package com.example.shinichi.modernstetoskopv2;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.scichart.charting.model.RenderableSeriesCollection;
import com.scichart.charting.model.dataSeries.XyDataSeries;
import com.scichart.charting.modifiers.ModifierGroup;
import com.scichart.charting.visuals.SciChartSurface;
import com.scichart.charting.visuals.annotations.HorizontalAnchorPoint;
import com.scichart.charting.visuals.annotations.TextAnnotation;
import com.scichart.charting.visuals.annotations.VerticalAnchorPoint;
import com.scichart.charting.visuals.axes.IAxis;
import com.scichart.charting.visuals.pointmarkers.EllipsePointMarker;
import com.scichart.charting.visuals.renderableSeries.IRenderableSeries;
import com.scichart.core.framework.UpdateSuspender;
import com.scichart.core.utility.DoubleUtil;
import com.scichart.drawing.utility.ColorUtil;
import com.scichart.extensions.builders.SciChartBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.UUID;

public class GraphRecActivity extends Activity {

72
private String record_file = null;
static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-
fba39e49d4ee");
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private GraphRecActivity.ConnectedThread myConnectThread;
private StringBuilder recDataString = new StringBuilder();

private TextView textTimmer, textName;

private boolean scroll = true;

Handler handler;
SciChartSurface surface;

private double lastX;


private double time = 0;
private double fs, rate;
private XyDataSeries<Double, Double> dataSeries;

long MillisecondTime, StartTime, TimeBuff, UpdateTime = 0L ;


int Seconds, Minutes, MilliSeconds ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_graph_rec);

record_file = ListRecordActivity.record_file;
lastX = 0;
handler = new Handler();

surface = new SciChartSurface(getApplicationContext());

textTimmer = (TextView) findViewById(R.id.timer_grafik);


textName = (TextView) findViewById(R.id.nama_grafik);

textName.setText(record_file);

// Get a layout declared in "activity_main.xml" by id


LinearLayout chartLayout = (LinearLayout)
findViewById(R.id.chart_layout);

// Add the SciChartSurface to the layout


chartLayout.addView(surface);

// Initialize the SciChartBuilder

73
SciChartBuilder.init(this);

// Obtain the SciChartBuilder instance


final SciChartBuilder sciChartBuilder = SciChartBuilder.instance();

// Create a numeric X axis


final IAxis xAxis = sciChartBuilder.newNumericAxis()
.withAxisTitle("Frame")
.withVisibleRange(-15, 100)
.build();

// Create a numeric Y axis


final IAxis yAxis = sciChartBuilder.newNumericAxis()
.withAxisTitle("Amplitudo").withVisibleRange(0, 100).build();

// Create a TextAnnotation and specify the inscription and position for it


TextAnnotation textAnnotation = sciChartBuilder.newTextAnnotation()
.withX1(5.0)
.withY1(55.0)
.withText("")
.withHorizontalAnchorPoint(HorizontalAnchorPoint.Center)
.withVerticalAnchorPoint(VerticalAnchorPoint.Center)
.withFontStyle(20, ColorUtil.White)
.build();

// Create interactivity modifiers


ModifierGroup chartModifiers = sciChartBuilder.newModifierGroup()
.withPinchZoomModifier().withReceiveHandledEvents(true).build()
.withZoomPanModifier().withReceiveHandledEvents(true).build()
.build();

// Add the Y axis to the YAxes collection of the surface


Collections.addAll(surface.getYAxes(), yAxis);

// Add the X axis to the XAxes collection of the surface


Collections.addAll(surface.getXAxes(), xAxis);

// Add the annotation to the Annotations collection of the surface


Collections.addAll(surface.getAnnotations(), textAnnotation);

// Add the interactions to the ChartModifiers collection of the surface


Collections.addAll(surface.getChartModifiers(), chartModifiers);

final XyDataSeries lineData =


sciChartBuilder.newXyDataSeries(Double.class, Integer.class).build();

// Create and configure a line series


final IRenderableSeries lineSeries = sciChartBuilder.newLineSeries()
.withDataSeries(lineData)

74
.withStrokeStyle(ColorUtil.LightBlue, 2f, true)
.build();

// Create an Ellipse PointMarker for the Scatter Series


EllipsePointMarker pointMarker = sciChartBuilder
.newPointMarker(new EllipsePointMarker())
.withFill(ColorUtil.LightBlue)
.withStroke(ColorUtil.Green, 2f)
.withSize(10)
.build();

// Add a RenderableSeries onto the SciChartSurface


surface.getRenderableSeries().add(lineSeries);

// Create a LegendModifier and configure a chart legend


// ModifierGroup legendModifier = sciChartBuilder.newModifierGroup()
// .withLegendModifier()
// .withOrientation(Orientation.HORIZONTAL)
// .withPosition(Gravity.CENTER_HORIZONTAL |
Gravity.BOTTOM, 10)
// .build()
// .build();
//
// // Add the LegendModifier to the SciChartSurface
// surface.getChartModifiers().add(legendModifier);

// Create and configure a CursorModifier


ModifierGroup cursorModifier = sciChartBuilder.newModifierGroup()
.withCursorModifier().withShowTooltip(true).build()
.build();

// Add the CursorModifier to the SciChartSurface


surface.getChartModifiers().add(cursorModifier);

StartTime = SystemClock.uptimeMillis();
handler.postDelayed(timer_runable, 0);

handler = new Handler() {


public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) {
String readMessage = (String) msg.obj;

String tmp[] = readMessage.split(":");


try {
if (tmp[0].equals("44100")) {
fs = Integer.valueOf(tmp[0]);
rate = Integer.valueOf(tmp[1]);
time = rate / fs;

75
Log.e("GraphData0", tmp[0]);
}else if(tmp[0].equals("~")){
handler.removeCallbacks(timer_runable);
}else{
int y = Integer.valueOf(tmp[0]);
if (scroll){
surface.zoomExtents();
}
// lineData.append(lastX/rate*time, y);
lineData.append(lastX, y);

//Log.e("GraphData","["+String.valueOf(lastX)+"]["+String.valueOf(lastX/rate*
time)+"]["+String.valueOf(y)+"]");
lastX++;
}
}catch (Exception e){

}
}
};
}

@Override
public void onResume() {
super.onResume();
//surface = new SciChartSurface(this);

//surface.getRenderableSeries().clear();

btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {
try
{
btSocket.close();

76
} catch (IOException e2)
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}

myConnectThread = new GraphRecActivity.ConnectedThread(btSocket);


myConnectThread.start();
myConnectThread.write(record_file);
}

@Override
public void onBackPressed() {
super.onBackPressed();
try {
btSocket.close();
} catch (IOException e) {
}
}

public void closeConnection() {


try {
btSocket.close();
} catch (IOException e) {
}
}

@Override
public void onPause() {
super.onPause();

try {
btSocket.close();
} catch (IOException e) {
}
}

@Override
public void onStop(){
super.onStop();
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);
}

77
public Runnable timer_runable = new Runnable() {

public void run() {

MillisecondTime = SystemClock.uptimeMillis() - StartTime;

UpdateTime = TimeBuff + MillisecondTime;

Seconds = (int) (UpdateTime / 1000);

Minutes = Seconds / 60;

Seconds = Seconds % 60;

MilliSeconds = (int) (UpdateTime % 1000);

textTimmer.setText("" + String.format("%02d", Minutes) + ":" +


String.format("%02d", Seconds));

handler.postDelayed(this, 0);
}

};

private class ConnectedThread extends Thread {


private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread


public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[1024];
int bytes;

78
// Keep looping to listen for received messages
while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}

//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Toast.makeText(getBaseContext(), "Koneksi tidak tersedia",
Toast.LENGTH_LONG).show();
//finish();
}
}
}
}

- GraphRecordActivity
package com.example.shinichi.modernstetoskopv2;

import android.app.TabActivity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TabHost;
import android.widget.TextView;

@SuppressWarnings("deprecation")
public class GraphRecordActivity extends TabActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

79
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_graph_record);

TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);

TabHost.TabSpec tabGraph = tabHost.newTabSpec("0");


tabGraph.setIndicator("Grafik");
Intent intent1 = new Intent(this, GraphRecActivity.class);
//tabGraph.setContent(new Intent(this, GraphRecActivity.class));

tabGraph.setContent(intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
));
tabGraph.setContent(intent1);
tabHost.addTab(tabGraph);

TabHost.TabSpec tabPlay = tabHost.newTabSpec("1");


tabPlay.setIndicator("Play Audio");
Intent intent2 = new Intent(this, PlayRecordActivity.class);
//tabPlay.setContent(new Intent(this, PlayRecordActivity.class));

tabPlay.setContent(intent2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
tabPlay.setContent(intent2);
tabHost.addTab(tabPlay);
}
}

- ListRecordActivity
package com.example.shinichi.modernstetoskopv2;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Set;

public class ListBluetoothActivity extends AppCompatActivity {


BluetoothAdapter mBluetoothAdapter = null;
ListView lvBluetooth;

@Override

80
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_bluetooth);

lvBluetooth = (ListView)findViewById(R.id.lvBluetooth);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
Set<BluetoothDevice> pairedDevices =
mBluetoothAdapter.getBondedDevices();
ArrayList list = new ArrayList();

if (pairedDevices.size() > 0) {
for (BluetoothDevice device : pairedDevices) {
list.add(device.getName() + "\n" + device.getAddress());
}
}

ArrayAdapter adapter = new


ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
lvBluetooth.setAdapter(adapter);
lvBluetooth.setOnItemClickListener(lvBluetoothClick);
}

private AdapterView.OnItemClickListener lvBluetoothClick = new


AdapterView.OnItemClickListener(){
public void onItemClick (AdapterView av, View v, int arg2, long arg3){
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);

MainActivity.bt_address = address;
finish();
}
};
}

- ListRecordActivity
package com.example.shinichi.modernstetoskopv2;

import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;

81
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class ListRecordActivity extends AppCompatActivity {


static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-
fba39e49d4ee");
static String record_file = null;
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private ListRecordActivity.ConnectedThread myConnectThread;
private StringBuilder recDataString = new StringBuilder();

ListView lv_rec;
Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_record);

handler = new Handler() ;


lv_rec = (ListView) findViewById(R.id.list_rekaman);

handler = new Handler() {


public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) { //if message is
what we want
String readMessage = (String) msg.obj;

82
if (readMessage.equals("remove_success:")){
myConnectThread = new
ListRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();

myConnectThread.write("list_record");
}

recDataString.append(readMessage); //keep
appending to string until ~
//Toast.makeText(ListRecordActivity.this, recDataString,
Toast.LENGTH_LONG).show();

if(recDataString.indexOf("~")!=-1){
String tmp = recDataString.toString();
String[] data = tmp.split(":");

final ArrayList<String> list = new ArrayList<String>();


for (int i = 0; i < data.length-1; ++i) {
if(!data[i].equals("remove_success")){
list.add(data[i]);
}
}

lv_rec.setAdapter(new MyListAdapter(ListRecordActivity.this,
R.layout.list_view,list));
recDataString.setLength(0);
}
}
}
};
}

private class MyListAdapter extends ArrayAdapter<String> {


private int layout;

public MyListAdapter(@NonNull Context context, @LayoutRes int


resource, @NonNull List<String> objects) {
super(context, resource, objects);
layout = resource;
}

@NonNull
@Override
public View getView(final int position, @Nullable View convertView,
@NonNull ViewGroup parent) {
ViewHolder mainViewHolder = null;

if (convertView == null){

83
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(layout,parent,false);

ViewHolder viewholder = new ViewHolder();


viewholder.img_list = (ImageView)
convertView.findViewById(R.id.record_img);
viewholder.tx_list = (TextView)
convertView.findViewById(R.id.record_name);
viewholder.btn_list_hapus = (ImageView)
convertView.findViewById(R.id.record_btn_hapus);
viewholder.btn_list_lihat = (ImageView)
convertView.findViewById(R.id.record_btn_lihat);

viewholder.tx_list.setText(getItem(position));
viewholder.btn_list_lihat.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
record_file = getItem(position);
Toast.makeText(getContext(), record_file,
Toast.LENGTH_SHORT).show();

Intent i = new Intent(ListRecordActivity.this,


GraphRecordActivity.class);
startActivity(i);
}
});

viewholder.btn_list_hapus.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new
AlertDialog.Builder(ListRecordActivity.this);
myConnectThread = new
ListRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();

builder.setTitle("Peringatan!");
builder.setMessage("Data yang telah dihapus tidak dapat
dikembalikan lagi, apakah anda yakin ingin menghapus data?");

builder.setPositiveButton("YES", new
DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {


dialog.dismiss();
myConnectThread.write("Remove_"+getItem(position));
}

84
});

builder.setNegativeButton("NO", new
DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// I do not need any action here you might
dialog.dismiss();
}
});

AlertDialog alert = builder.create();


alert.show();
}
});

convertView.setTag(viewholder);
}else{
mainViewHolder = (ViewHolder) convertView.getTag();
mainViewHolder.tx_list.setText(getItem(position));

mainViewHolder.btn_list_lihat.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
record_file = getItem(position);
Toast.makeText(getContext(), record_file,
Toast.LENGTH_SHORT).show();

Intent i = new Intent(ListRecordActivity.this,


GraphRecordActivity.class);
startActivity(i);
}
});

mainViewHolder.btn_list_hapus.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new
AlertDialog.Builder(ListRecordActivity.this);
myConnectThread = new
ListRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();

builder.setTitle("Peringatan!");

85
builder.setMessage("Data yang telah dihapus tidak dapat
dikembalikan lagi, apakah anda yakin ingin menghapus data?");

builder.setPositiveButton("YES", new
DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {


dialog.dismiss();
myConnectThread.write("Remove_"+getItem(position));
}

});

builder.setNegativeButton("NO", new
DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
// I do not need any action here you might
dialog.dismiss();
}
});

AlertDialog alert = builder.create();


alert.show();
}
});
}

return convertView;
}
}

public void onResume() {


super.onResume();
btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {

86
//Toast.makeText(getBaseContext(), "Socket error connect",
Toast.LENGTH_LONG).show();
try
{
btSocket.close();
} catch (IOException e2)
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}
myConnectThread = new ListRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();

myConnectThread.write("list_record");
}

public void onPause() {


super.onPause();
myConnectThread.write("bt-restart");
}

public void onStop(){


super.onStop();
myConnectThread.write("bt-destroy");
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);
}

private class ConnectedThread extends Thread {


private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread


public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;

87
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[256];
int bytes;

// Keep looping to listen for received messages


while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
//Toast.makeText(getBaseContext(), "Koneksi tidak tersedia",
Toast.LENGTH_LONG).show();
//finish();
}
}
}

public class ViewHolder{


ImageView img_list;
TextView tx_list;
ImageView btn_list_lihat;
ImageView btn_list_hapus;
}
}

- MainActivity
package com.example.shinichi.modernstetoskopv2;

88
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


public static String bt_address = "";

BluetoothAdapter mBluetoothAdapter = null;


ImageButton btn_rekam, btn_list;
Button btn_set_bt;
ProgressDialog pdDialogl;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btn_set_bt = (Button)findViewById(R.id.btn_set_bt);
btn_rekam = (ImageButton)findViewById(R.id.btn_record);
btn_list = (ImageButton)findViewById(R.id.btn_list);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(getApplicationContext(), "Perangkat tidak didukung
Bluetooth",Toast.LENGTH_SHORT).show();
}

btn_set_bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, ListBluetoothActivity.class);
startActivity(i);
}
});

btn_rekam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (bt_address == "") {
Toast.makeText(getApplicationContext(), "Pilih perangkat
Bluetooth terlebih dahulu!", Toast.LENGTH_SHORT).show();

89
} else {
Intent i = new Intent(MainActivity.this, RekamActivity.class);
startActivity(i);
}
}
});

btn_list.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (bt_address == "") {
Toast.makeText(getApplicationContext(), "Pilih perangkat
Bluetooth terlebih dahulu!", Toast.LENGTH_SHORT).show();
} else {
//Intent i = new Intent(MainActivity.this,
DaftarRekamanActivity.class);
Intent i = new Intent(MainActivity.this, ListRecordActivity.class);
startActivity(i);
}
}
});
}

@Override
protected void onResume() {
super.onResume();

if (!mBluetoothAdapter.isEnabled()) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("Aktifkan Bluetooth");
builder.setMessage("Aplikasi memerlukan koneksi Bluetooth untuk
dapat digunakan, apakah anda ingin mengaktifkan Bluetooth?");

builder.setPositiveButton("YES", new DialogInterface.OnClickListener()


{

public void onClick(DialogInterface dialog, int which) {


mBluetoothAdapter.enable();
dialog.dismiss();
Toast.makeText(getApplicationContext(), "Bluetooth
diaktifkan",Toast.LENGTH_SHORT).show();
}

});

builder.setNegativeButton("NO", new DialogInterface.OnClickListener()


{

90
@Override
public void onClick(DialogInterface dialog, int which) {
// I do not need any action here you might
dialog.dismiss();
}
});

AlertDialog alert = builder.create();


alert.show();
}

if (bt_address != ""){
//btn_set_bt.setEnabled(false);
btn_set_bt.setText("Change Bluetooth");
}
}

private void showDialog(boolean show,String message){


if(pdDialogl == null){
pdDialogl = new ProgressDialog(this);
}
pdDialogl.setMessage(message);
pdDialogl.setCancelable(false);
if(show) pdDialogl.show();
else pdDialogl.dismiss();
}
}

- PlayRecordActivity
package com.example.shinichi.modernstetoskopv2;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

91
public class PlayRecordActivity extends Activity {
ImageButton btn_img;
private boolean recording = false;
private String record_file = null;

static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-


fba39e49d4ee");
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private PlayRecordActivity.ConnectedThread myConnectThread;

Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_record);

record_file = ListRecordActivity.record_file;
btn_img = (ImageButton)findViewById(R.id.btn_start_record1);
handler = new Handler();

btn_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(recording == false){
btn_img.setImageResource(R.drawable.stop_audio);
recording = true;

myConnectThread = new
PlayRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();
myConnectThread.write("Play_"+record_file);
}else{
btn_img.setImageResource(R.drawable.start_audio);
recording = false;

myConnectThread = new
PlayRecordActivity.ConnectedThread(btSocket);
myConnectThread.start();
myConnectThread.write("Stop_"+record_file);
}
}
});

handler = new Handler() {

92
public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) {
String readMessage = (String) msg.obj;

if (readMessage.equals("Playing")){
btn_img.setImageResource(R.drawable.stop_audio);
recording = true;
}else if(readMessage.equals("Stop")){
btn_img.setImageResource(R.drawable.start_audio);
recording = false;
}

}
}
};
}

@Override
public void onPause() {
super.onPause();

try {
btSocket.close();
} catch (IOException e) {
}
}

@Override
protected void onResume() {
super.onResume();

btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {
try
{
btSocket.close();
} catch (IOException e2)

93
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}

myConnectThread = new PlayRecordActivity.ConnectedThread(btSocket);


myConnectThread.start();
myConnectThread.write("x");
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);
}

private class ConnectedThread extends Thread {


private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread


public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[1024];
int bytes;

// Keep looping to listen for received messages


while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();

94
} catch (IOException e) {
break;
}
}
}

//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
Toast.makeText(getBaseContext(), "Koneksi tidak tersedia",
Toast.LENGTH_LONG).show();
//finish();
}
}
}
}

- RekamActivity
package com.example.shinichi.modernstetoskopv2;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;

public class RekamActivity extends AppCompatActivity {


ImageButton btn_record;
TextView text_timer;
Handler handler;

95
Boolean recording = false;
long MillisecondTime, StartTime, TimeBuff, UpdateTime = 0L ;
int Seconds, Minutes, MilliSeconds ;

static final UUID myUUID = UUID.fromString("94f39d29-7d6d-437d-973b-


fba39e49d4ee");
final int handlerState = 0;
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private String address = MainActivity.bt_address;
private ConnectedThread myConnectThread;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rekam);

btn_record = (ImageButton)findViewById(R.id.btn_start_record);
text_timer = (TextView)findViewById(R.id.text_timer);
handler = new Handler() ;

btn_record.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (recording == false){
myConnectThread.write("start");

btn_record.setImageResource(R.drawable.stop_record);
recording = true;

StartTime = SystemClock.uptimeMillis();
handler.postDelayed(timer_runable, 0);
}else{
myConnectThread.write("stop");

btn_record.setImageResource(R.drawable.start_record);
recording = false;

MillisecondTime = 0L ;
StartTime = 0L ;
TimeBuff = 0L ;
UpdateTime = 0L ;
Seconds = 0 ;
Minutes = 0 ;
MilliSeconds = 0 ;
handler.removeCallbacks(timer_runable);
}
}
});

96
}

public void onResume() {


super.onResume();
btAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothDevice device = btAdapter.getRemoteDevice(address);

try {
btSocket = createBluetoothSocket(device);
} catch (IOException e) {
Toast.makeText(getBaseContext(), "Socket creation failed",
Toast.LENGTH_LONG).show();
}

try
{
btSocket.connect();
} catch (IOException e) {
//Toast.makeText(getBaseContext(), "Socket error connect",
Toast.LENGTH_LONG).show();
try
{
btSocket.close();
} catch (IOException e2)
{
Toast.makeText(getBaseContext(), "Socket close failed",
Toast.LENGTH_LONG).show();
}
}
myConnectThread = new ConnectedThread(btSocket);
myConnectThread.start();

myConnectThread.write("x");
}

public void onPause() {


super.onPause();
myConnectThread.write("bt-restart");
}

public void onStop(){


super.onStop();
myConnectThread.write("bt-destroy");
}

private BluetoothSocket createBluetoothSocket(BluetoothDevice device)


throws IOException {

return device.createRfcommSocketToServiceRecord(myUUID);

97
}

public Runnable timer_runable = new Runnable() {

public void run() {

MillisecondTime = SystemClock.uptimeMillis() - StartTime;

UpdateTime = TimeBuff + MillisecondTime;

Seconds = (int) (UpdateTime / 1000);

Minutes = Seconds / 60;

Seconds = Seconds % 60;

MilliSeconds = (int) (UpdateTime % 1000);

text_timer.setText("" + String.format("%02d", Minutes) + ":"


+ String.format("%02d", Seconds));

handler.postDelayed(this, 0);
}

};

private class ConnectedThread extends Thread {


private final InputStream mmInStream;
private final OutputStream mmOutStream;

//creation of the connect thread


public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {


byte[] buffer = new byte[256];
int bytes;

98
// Keep looping to listen for received messages
while (true) {
try {
bytes = mmInStream.read(buffer); //read bytes from input
buffer
String readMessage = new String(buffer, 0, bytes);
// Send the obtained bytes to the UI Activity via handler
handler.obtainMessage(handlerState, bytes, -1,
readMessage).sendToTarget();
} catch (IOException e) {
break;
}
}
}
//write method
public void write(String input) {
byte[] msgBuffer = input.getBytes(); //converts entered String into
bytes
try {
mmOutStream.write(msgBuffer); //write bytes over BT
connection via outstream
} catch (IOException e) {
//if you cannot write, close the application
//Toast.makeText(getBaseContext(), "Koneksi tidak tersedia:
"+e.getMessage(), Toast.LENGTH_LONG).show();
//finish();
}
}
}
}

2. Listing Program Python


from bluetooth import *

#import pyaudio
from pyaudio import PyAudio, paContinue, paFloat32

import time
import wave
import thread
import subprocess
import signal
import os
import glob

import matplotlib.pyplot as plt


import numpy as np
import wave

99
tmp = "none"
CHUNK = 1024
WIDTH = 3
CHANNELS = 1
RATE = 44100
dir_prog="/home/pi/Desktop/v4"
dir_rec="/home/pi/Desktop/v4/rec"

frames = []
pid = None
start_output = True
p = PyAudio()

class AudioFile:
chunk = 1024

def __init__(self, file):


""" Init audio stream """
self.wf = wave.open(file, 'rb')
self.p = PyAudio()
self.stream = self.p.open(
format = self.p.get_format_from_width(self.wf.getsampwidth()),
channels = self.wf.getnchannels(),
rate = self.wf.getframerate(),
output = True
)

def play(self):
""" Play entire file """
data = self.wf.readframes(self.chunk)
while data != '':
self.stream.write(data)
data = self.wf.readframes(self.chunk)

def close(self):
""" Graceful shutdown """
self.stream.close()
self.p.terminate()

def callback(in_data, frame_count, time_info, status):


#if status:
#print status
return (in_data, paContinue)

def write_file(file_name, line, text):


try:
file = None;
try:

100
file = open(file_name, "rb").readlines()
except IOError:
os.chdir(dir_prog)
file = open(file_name, "rb").readlines()

file[line] = text
out = open(file_name, "wb")
out.write(file[0]+"\n")
out.write(file[1].strip())
out.close()
print "Success Write File"
print file
except IOError,e:
print "\nError ubah data "+str(e)

def run_cmd(cmd):
process = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=True)
return process

stream = p.open(format=p.get_format_from_width(WIDTH),
#stream = p.open(format=paFloat32,
channels=CHANNELS,
rate=RATE,
output=start_output,
input=True,
stream_callback=callback)

while True:

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

advertise_service( server_sock, "SampleServer",


service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ],
# protocols = [ OBEX_UUID ]
)
print "Waiting for connection on RFCOMM channel %d" % port

client_sock, client_info = server_sock.accept()


print "Accepted connection from ", client_info

101
try:
while True:
data = client_sock.recv(1024)
data_1 = data.split(".")
data_2 = data_1[0].split("_")
if len(data) == 0: break
print "\nreceived [%s]" % data
if data == "bt-destroy":
print "BT Destroy"
tmp = data
elif data == "bt-restart":
print "BT Restart"
break
elif data == "start":
print "--Start Recording"
tmp = data
write_file("public_var.dll",0,"none")
write_file("public_var.dll",0,"start")
#path_file_cmd = "python "+os.getcwd()+"/record.py"
path_file_cmd = "python "+os.getcwd()+"/filter.py"
print path_file_cmd
pid = run_cmd(path_file_cmd)
stream = None
print pid.pid
elif data == "stop":
print "--Stop Recording"
tmp = data
write_file("public_var.dll",0,"stop")
#os.kill(pid.pid, signal.SIGINT)
_pid = int(pid.pid)
run_cmd("sudo kill -9 "+str(_pid))
run_cmd("sudo kill -9 "+str(_pid+1))
elif data == "list_record":
print "--request list"
text = ""
try:
os.chdir(dir_rec)
except OSError:
print "In Directory"
tmp = glob.glob("*.wav")
tmp.sort()
for file in tmp:
text += file + ":"
client_sock.send(text)
client_sock.send("~")
print "Success sending responce"
elif data_2[0] == "Record" or data_2[0] == "FilterRecord":
file_dir = "rec/"+data

102
print file_dir
spf = wave.open(data,'rb')
signal = spf.readframes(-1)
signal = np.fromstring(signal, 'Int16')
fs = spf.getframerate()
print str(fs)+":"+str(len(signal))
Time=np.linspace(0, len(signal)/fs, num=len(signal))
print signal
client_sock.send(str(fs)+":"+str(len(signal)))
time.sleep(1)
for i in range(0, len(Time)):
send_data = "%d:"%(signal[i])
client_sock.send(send_data)
print "data send: "+send_data
#time.sleep(1)
print "Success sending responce"
client_sock.send("~:")
break
elif data_2[0] == "Play" and (data_2[1] == "Record" or data_2[1] ==
"FilterRecord"):
file_rec = data_2[1]+"_"+data_2[2]+".wav"
try:
stream.close()
except AttributeError:
print "error"
time.sleep(0.5)
client_sock.send("Playing")
try:
os.chdir(dir_rec)
except OSError:
print "In Directory"

a = AudioFile(file_rec)
a.play()
a.close()

client_sock.send("Stop")

stream = p.open(format=p.get_format_from_width(WIDTH),
channels=CHANNELS,
rate=RATE,
output=start_output,
input=True,
stream_callback=callback)

elif data_2[0] == "Stop" and (data_2[1] == "Record" or data_2[1] ==


"FilterRecord"):
stream = p.open(format=p.get_format_from_width(WIDTH),
channels=CHANNELS,

103
rate=RATE,
output=start_output,
input=True,
stream_callback=callback)
elif data_2[0] == "Remove":
try:
os.chdir(dir_rec)
except OSError:
print "In Directory"

subprocess.Popen("rm "+data_2[1]+"_"+data_2[2]+".wav",
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
client_sock.send("remove_success:")

except IOError,e:
print str(e)
pass

print "disconnected"
client_sock.close()

104

Anda mungkin juga menyukai