Tugas Akhir Yunus Ramadani
Tugas Akhir Yunus Ramadani
YUNUS RAHMADHANI
1311511046
Pembimbing:
Budi Rahmadya, M. Eng
YUNUS RAHMADHANI
1311511046
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.
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..
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)....
~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.
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…
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
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.
Penulis
xi
PENGEMBANGAN STETOSKOP SEBAGAI ALAT REKAM MEDIK
TERINTEGRASI DENGAN SMARTPHONE
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.
xii
DEVELOPMENT STETHOSCOPE AS INTEGRATED MEDICAL
RECORDER USING SMARTPHONE
ABSTRACK
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.
xiii
DAFTAR ISI
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
xvii
DAFTAR TABEL
xviii
BAB I
PENDAHULUAN
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. 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 :
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.
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.
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].
7
Gambar 2.1 Struktur Internal Jantung Manusia[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:
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]
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].
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
12
Gambar 2.4 Respon Frekuensi Low Pass Filter[10]
13
Gambar 2.6 Respon Frekuensi Band Pass Filter[10].
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].
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)
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].
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]
Python
GPIO
input output
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.
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.
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].
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 :
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
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.
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.
Berdasarkan Gambar perancangan hardware di atas, prinsip kerja dari sistem ini
adalah :
26
5. Smartphone digunakan untuk memberikan instruksi merekam, memutar
kembali dan menampilkan grafik dari sura detak jantung yang direkam ke
raspberry pi.
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.
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.
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.
(a) (b)
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.
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.
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.
33
BAB IV
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.
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.
35
a
(a) (b)
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.
Gambar 4.2. (b) merupakan halaman utama dimana terdapat tombol-tombol yang
berfungsi sebagai berikut:
36
Gambar 4. 3 Implementasi Halaman Daftar Bluetooth.
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.
37
Keterangan Gambar 4.4:
a
b
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:
38
(a) (b)
Gambar 4.6 Implementasi Halaman Detail Rekaman.
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.
39
Gambar 4.7 Implementasi Program Pyton Pada Raspberry Pi.
40
f. Grafik_[nama_file_rekaman], berfungsi untuk mengubah data audio menjadi
data integer kemudian mengirimkan data tersebut satu persatu ke smartphone.
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.
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.
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.
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.
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
84
Persentase Keberhasilan = 84 𝑥 100%
46
request pengguna dari smartphone dengan fungsi yang berjalan pada program
python pada raspberry pi. Berikut tabel hasil pengujian dari aplikasi python:
84
Persentase Keberhasilan = 84 𝑥 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.
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.
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.
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.
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%.
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.
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:
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
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
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;
Handler handler;
ListView list_rekaman;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daftar_rekaman);
61
list_rekaman = (ListView)findViewById(R.id.list_rekaman);
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");
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
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;
}
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;
// 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);
66
// Add the SciChartSurface to the layout
chartLayout.addView(surface);
67
// Create and configure a line series
final IRenderableSeries lineSeries = sciChartBuilder.newLineSeries()
.withDataSeries(lineData)
.withStrokeStyle(ColorUtil.LightBlue, 2f, true)
.build();
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
}
});
}
}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");
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
70
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
private final OutputStream mmOutStream;
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
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;
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();
Handler handler;
SciChartSurface surface;
@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();
textName.setText(record_file);
73
SciChartBuilder.init(this);
74
.withStrokeStyle(ColorUtil.LightBlue, 2f, true)
.build();
StartTime = SystemClock.uptimeMillis();
handler.postDelayed(timer_runable, 0);
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();
}
}
@Override
public void onBackPressed() {
super.onBackPressed();
try {
btSocket.close();
} catch (IOException e) {
}
}
@Override
public void onPause() {
super.onPause();
try {
btSocket.close();
} catch (IOException e) {
}
}
@Override
public void onStop(){
super.onStop();
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
77
public Runnable timer_runable = new Runnable() {
handler.postDelayed(this, 0);
}
};
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
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);
tabGraph.setContent(intent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
));
tabGraph.setContent(intent1);
tabHost.addTab(tabGraph);
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;
@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());
}
}
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;
ListView lv_rec;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_record);
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(":");
lv_rec.setAdapter(new MyListAdapter(ListRecordActivity.this,
R.layout.list_view,list));
recDataString.setLength(0);
}
}
}
};
}
@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.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();
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() {
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();
}
});
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();
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() {
});
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();
}
});
return convertView;
}
}
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");
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
87
mmOutStream = tmpOut;
}
- 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;
@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?");
});
90
@Override
public void onClick(DialogInterface dialog, int which) {
// I do not need any action here you might
dialog.dismiss();
}
});
if (bt_address != ""){
//btn_set_bt.setEnabled(false);
btn_set_bt.setText("Change Bluetooth");
}
}
- 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;
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);
}
}
});
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();
}
}
return device.createRfcommSocketToServiceRecord(myUUID);
}
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
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;
95
Boolean recording = false;
long MillisecondTime, StartTime, TimeBuff, UpdateTime = 0L ;
int Seconds, Minutes, MilliSeconds ;
@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
}
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");
}
return device.createRfcommSocketToServiceRecord(myUUID);
97
}
handler.postDelayed(this, 0);
}
};
try {
//Create I/O streams for connection
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
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();
}
}
}
}
#import pyaudio
from pyaudio import PyAudio, paContinue, paFloat32
import time
import wave
import thread
import subprocess
import signal
import os
import glob
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 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()
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"
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)
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