PENGUKURAN DISTRIBUSI TEMPERATUR PADA PELAT … · perhitungan komputasi. Metode numerik yang...
Transcript of PENGUKURAN DISTRIBUSI TEMPERATUR PADA PELAT … · perhitungan komputasi. Metode numerik yang...
1
PENGUKURAN DISTRIBUSI TEMPERATUR PADA PELAT
LOGAM MENGGUNAKAN METODE FINITE ELEMENT
AGUNG RIDWAN SN
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
2010
2
ABSTRACT
AGUNG RIDWAN SN. Measuring Thermal Distribution of Metal Plate Using Finite Element
Method. Supervised by Mahfudin Zuhri, M.Si dan Faozan Ahmad, M.Si.
To measure temperature in an object, we use temperature sensor. But what if the
temperature which we are going to measure has many of nodes? Putting all sensors on that nodes
is less efficient. Solution for this problem is reducing the quantity of sensors and put it on
boundary system and use that for computation purpose. This research was using finite element
method two-dimensional with triangular element. The output for this research is distribution of
heat transfer on metal surface.
This research measuring thermal conductivity metal plate in steady state problem in two-
dimensional conductivity direction.
The comparison between measurement with digital thermometer EXTECH and
computational finite element method on node coordinate (21, 5.5) is 98.18%, node (21, 1.1) is
96.67%, node 28, 5.5) is 97.55%, node (21, 33.9) is 97.96%.
Keywords : finite element method, digital thermometer EXTECH, metal plate, data-logger.
3
ABSTRAK
AGUNG RIDWAN SN. Pengukuran Distribusi Temperatur pada Pelat Logam Menggunakan
Metode Finite Element. Dibimbing oleh Mahfudin Zuhri, M.Si dan Faozan Ahmad, M.Si.
Pengukuran temperatur dapat dilakukan dengan menggunakan thermometer. Namun
bagaimana jika nilai temperatur yang ingin dicari lebih dari satu titik pengukuran. Apakah berarti
harus menggunakan banyak sensor dan memasangnya di tiap titik pengukuran? Tentu saja hal ini
menjadi tidak efisien. Solusi dari permasalahan tersebut adalah mengurangi penggunaan sensor
dan menempatkan sensor pada sistem boundary yang mana akan menjadi nilai referensi
perhitungan komputasi. Metode numerik yang dipakai pada penelitian ini adalah metode elemen
hingga (Finite Element Method). Metode ini dapat mengefisienkan penggunaan sensor karena
hanya dipasang pada wilayah boundary saja. Hasil keluarannya adalah distribusi penyebaran
temperatur pada titik-titik di dalam boundary system.
Penelitian ini melakukan pengukuran konduktivitas termal dalam keadaan steady state
pada pelat logam dengan arah bidang rambat konduksi dua dimensi.
Hasil pengukuran distribusi temperatur dengan membandingkan pengukuran pada digital
thermometer EXTECH dengan perhitungan metode elemen hingga mendapat nilai ketepatan di
titik (21, 5,5) sebesar 98.18 %, titik (21, 1,1) sebesar 96,67%, titik (28, 5,5) sebesar 97.55%, titik
(21, 33,9) sebesar 97,96%.
Kata kunci : metode finite element, digital thermometer EXTECH, pelat logam, data logger.
4
PENGUKURAN DISTRIBUSI TEMPERATUR PADA PELAT
LOGAM MENGGUNAKAN METODE FINITE ELEMENT
AGUNG RIDWAN SN
SKRIPSI
Sebagai salah satu syarat untuk memperoleh gelar
Sarjana Sains pada
Program Studi Fisika
DEPARTEMEN FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
INSTITUT PERTANIAN BOGOR
2010
5
RIWAYAT HIDUP
Penulis dilahirkan di Jakarta pada tanggal 1 Mei 1987/2 Ramadhan 1407 H
buah dari pasangan Bambang Anggoro dan Darminingsih. Penulis merupakan
anak kedua dari dua bersaudara. Memiliki satu kakak yang bernama Endang
Pusnita R.
Pendidikan penulis dimulai tahun 1992 di sebuah TK (Taman Kanak-kanak)
kecil yang bernama TK. Dahlia. Kemudian melanjutkan ke Sekolah Dasar Negeri
(SDN) 1 Cirendeu pada tahun 1993 dan lulus tahun 1999. Pada tahun yang sama
penulis melanjutkan studi ke Sekolah Lanjutan Pertama Negeri (SLTPN) 1
Ciputat (sekarang SMPN 2 Kota Tangerang Selatan) dan lulus tahun 2002. Di
jenjang ini penulis sempat masuk kelas unggulan dan mulai mengalami banyak
perubahan pola pikir. Lalu penulis melanjutkan studi ke SMAN 1 Ciputat
(sekarang SMAN 1 Kota Tangerang Selatan) dan lulus tahun 2005.
Pada tahun 2005, penulis diterima melanjutkan studi di Institut Pertanian
Bogor (IPB) melalui jalur Seleksi Penerimaan Mahasiswa Baru (SPMB) program
Mayor-Minor. Setahun kemudian penulis diterima masuk di Departemen Fisika,
Fakultas Matematika dan Ilmu Pengetahuan Alam, Institut Pertanian Bogor pada
tahun 2006. Selama perkuliahan, penulis tidak hanya belajar namun juga sempat
mengikuti aktivitas organisasi di luar seperti Majelis Ta’lim Al Furqon, dan
menjadi panitia pada beberapa kesempatan acara yang diadakan oleh himpunan
profesi (HIMAFI). Penulis juga sempat menjadi Asisten Praktikum Elektronika
Lanjut (Bapak Ardian Arief, M.Si), Asisten Praktikum Teknologi Nirkabel
(Bapak Mahfuddin Zuhri, M.Si), Asisten Praktikum Sistem Operasi dan Jaringan
Komputer (Bapak Faozan Ahmad, M.Si), dan Asisten Cisco Networking
Academy Program IPB.
6
LEMBAR PENGESAHAN
Judul : Pengukuran Distribusi Temperatur pada Pelat Logam
Menggunakan Metode Finite Element
Nama : Agung Ridwan SN
NRP : G4051818
Menyetujui :
Pembimbing I Pembimbing II
(Mahfuddin Zuhri, M.Si) (Faozan Ahmad, M.Si)
NIP:196911041997021001 NIP: 197909232007011001
Mengetahui :
Ketua Departemen
(Dr. Ir. Irzaman, M.Si.)
NIP: 196307081995121001
Disetujui tanggal:
8
KATA PENGANTAR Alhamdulillahirobbil’alamin, puji dan syukur penulis panjatkan hanya kepada Allah
Subhanahu wa Ta’ala. Sholawat serta salam semoga tercurah kepada Rasulullah Shallallahu
‘alaihi wa Sallam. Dengan rahmat-Nya penulis dapat menyelesaikan skripsi yang berjudul
“Pengukuran Distribusi Temperatur pada Pelat Logam Menggunakan Metode Finite Element”
sebagai salah satu syarat untuk memperoleh gelar Sarjana Sains (S.Si) Departemen Fisika Institut
Pertanian Bogor.
Dalam penyusunan penelitian ini penulis ingin berterima kasih kepada pihak-pihak yang
telah banyak membantu baik berupa dukungan materil maupun moril:
Bapak Mahfuddin Zuhri, M.Si dan Bapak Faozan Ahmad, M.Si selaku dosen
pembimbing atas ilmu, waktu, saran dan kritik yang sangat berharga.
Ibu dan Bapak serta kakak tercinta yang selalu siap membantu dalam doa, motivasi, dan
lainnya. Maaf, kalau masih merepotkan. ^^
Ibnu Sudar, Abu Sufyan, Ibnu Salam, Mas Abdur Rahmat yang selalu cerewet tentang
skripsi penulis, serta seluruh warga At Tauhid, Al Furqon, Al Ghuroba, dan seluruh
ikhwan Salafiyyin atas nasehat dan semangatnya.
Seluruh Teman-teman Fisika 42. Terima kasih atas kebersamaan yang telah diberikan.
Khususnya untuk mikonerz dan exper-erz.
Ka Subhi makasih atas sensor dan supportnya, Pa Mamat makasih atas kesempatannya,
Auriza makasih atas codingnya, Fisika 40,41,43 & ALL: thanks for everything.
Pa Firman, Pa Toni, Pa Jun, Bu Dini, seluruh dosen, staf, dan laboran Fisika IPB.
Rekan-rekan DKSI IPB yang telah kehilangan penulis karena penyelesaian skripsi ini.
Semua pihak yang telah ikut berperan dalam penyusunan proposal ini yang mungkin
belum disebut satu-persatu.
Penulis menyadari bahwa penyusunan skripsi ini masih jauh dari kesempurnaan. Oleh
karena itu penulis mengharapkan masukan baik kritikan, saran maupun koreksi yang sifatnya
membangun. Semoga karya ini dapat bermanfaat untuk umat.
Wassalaamu’alaykum Warahmatullah Wabarakatuh
Bogor, Oktober 2010
Agung Ridwan SN
9
DAFTAR ISI
Halaman
KATA PENGANTAR ..................................................................................................................... i
DAFTAR ISI ................................................................................................................................... ii
DAFTAR TABEL ........................................................................................................................... iii
DAFTAR GAMBAR ....................................................................................................................... iv
PENDAHULUAN ........................................................................................................................... 1
Latar Belakang ...................................................................................................................... 1
Tujuan ................................................................................................................................... 1
Hipotesa ................................................................................................................................ 1
TINJAUAN PUSTAKA .................................................................................................................. 1
Sensor Temperatur DS18b20 ................................................................................................. 1
Embedded Networked DSTINIm400 ..................................................................................... 2
Bahasa Pemrograman Java .................................................................................................... 2
Bahasa Pemrograman XML dan XSL .................................................................................... 3
Bahasa Pemrograman PHP dan AJAX................................................................................... 3
Metode Elemen Hingga ......................................................................................................... 3
Konduksi Thermal Dua Dimensi ........................................................................................... 4
Database MySQL .................................................................................................................. 5
SolidWorks 2009 SP 2.1 ....................................................................................................... 5
ALAT DAN METODE ................................................................................................................... 5
Waktu dan Tempat ................................................................................................................ 5
Alat dan Bahan ...................................................................................................................... 5
Metode Penelitian ................................................................................................................. 5
Persiapan Alat dan Bahan ............................................................................................... 5
Pembuatan Program ....................................................................................................... 6
Analisis Keluaran Data ................................................................................................... 6
HASIL DAN PEMBAHASAN ........................................................................................................ 6
Sensor Temperatur ................................................................................................................ 6
Pemanas ................................................................................................................................ 7
Data Logger Temperatur ....................................................................................................... 7
Metode Elemen Hingga ......................................................................................................... 7
KESIMPULAN DAN SARAN ........................................................................................................ 8
DAFTAR PUSTAKA ...................................................................................................................... 8
LAMPIRAN .................................................................................................................................... 9
10
DAFTAR TABEL
No. Halaman
LAMPIRAN
1. Perbandingan data eksperimen (Extech) dengan data literatur (FEM) ...................................... 7
2. Data temperatur pemanas terhadap waktu ............................................................................... 11
3. Terminologi matriks untuk metode elemen hingga .................................................................. 13
4. MAC Address (64-bit unique) sensor temperatur DS18b20 ..................................................... 13
5. Resolusi sensor temperatur ds18b20........................................................................................ 13
6. Karakteristik sensor DS18b20 ................................................................................................. 13
11
DAFTAR GAMBAR
No. Halaman
TEKS
1. Sensor suhu DS18B20 ............................................................................................................ 1
2. Blok diagram daya internal pada DS18B20 ............................................................................. 1
3. Blok diagram daya external pada DS18B20 ............................................................................ 1
4. Blok diagram DS18B20 .......................................................................................................... 1
5. Modul DSTINIm400 ............................................................................................................... 2
6. Diagram Modul DSTINIm400 ................................................................................................ 2
7. Heatsink Compounds .............................................................................................................. 5
8. Setup Pengukuran ................................................................................................................... 5
9. Diagram Alur Penelitian ......................................................................................................... 6
10. Format Data Keluaran DS18b20 ............................................................................................. 6
11. Hubungan temperatur dengan waktu ....................................................................................... 7
12. Diskritisasi Menggunakan Elemen Triangular ......................................................................... 7
13. Meshing menjadi beberapa elemen.......................................................................................... 7
14. Probe Nilai Temperature di Node Mesh Object ....................................................................... 7
LAMPIRAN
1. Sebuah pelat dengan kondisi batas temperatur yang berbeda ................................................... 14
2. Diskritisasi menggunakan elemen triangular ........................................................................... 14
3. Desain antarmuka pengambilan data menggunakan PHP & AJAX .......................................... 15
12
LAMPIRAN
No. Halaman
LAMPIRAN
1. Rumus Ketepatan .................................................................................................................... 14
2. Contoh perhitungan menggunakan metode elemen hingga ...................................................... 14
3. Skema Mikrokontroller DSTINIm400 ..................................................................................... 16
4. Program utama (tws.java) ....................................................................................................... 17
5. Contoh konfigurasi pada (prefs.ini) ......................................................................................... 30
6. Program XML (weather.xml) .................................................................................................. 30
7. Program PHP (index.php) untuk mengambil data dari mikrokontroller ke PC Server .............. 32
8. Program PHP (table.php) untuk menampilkan tabel temperatur............................................... 33
9. Program PHP (dbkoneksi.php) untuk menghubungkan ke Database MySQL .......................... 34
10. Program PHP (logsaver.php) untuk menyimpan data temperatur ............................................. 34
11. Stylesheet CSS (style.css) ....................................................................................................... 36
12. SQL Struktur data tws table log .............................................................................................. 37
13
PENDAHULUAN
Latar Belakang
Pengukuran temperatur dapat dilakukan
dengan menggunakan thermometer. Namun
bagaimana jika nilai temperatur yang ingin
dicari lebih dari satu titik pengukuran.
Apakah berarti harus menggunakan banyak
sensor dan memasangnya di tiap titik
pengukuran? Tentu saja hal ini menjadi
tidak efisien.
Solusi dari permasalahan tersebut
adalah mengurangi penggunaan sensor dan
menempatkan sensor pada titik-titik tertentu
kemudian dengan menggunakan metode
numerik akan dilakukan penghitungan
terhadap titik-titik tertentu yang ingin
diketahui dengan referensi nilai temperatur
sensor. Metode numerik yang dipakai pada
penelitian ini adalah metode elemen hingga
(Finite Element Method). Metode ini dapat
mengefisienkan penggunaan sensor karena
hanya dipasang pada wilayah boundary saja.
Hasil keluarannya adalah distribusi
penyebaran temperatur pada titik-titik di
dalam boundary system.
Penelitian ini melakukan pengukuran
konduktivitas termal dalam keadaan steady
state pada pelat alumunium dengan arah
bidang rambat konduksi dua dimensi.
Tujuan
Penelitian ini bertujuan untuk
mengetahui suhu di beberapa titik
permukaan pelat dengan menggunakan
metode elemen hingga.
Hipotesis Penyebaran distribusi temperatur dalam
keadaan steady state di tiap titik pada difusi
konduksi termal akan berbeda tapi dengan
nilai heat transfer (q) yang konstan.
TINJAUAN PUSTAKA
Sensor Temperatur DS18b20
Sensor DS18b20 merupakan jenis
sensor onewire yang dikeluarkan oleh
Dallas Semiconductor. DS18b20 merupakan
sensor suhu yang telah memiliki keluaran
digital sehingga tidak diperlukan rangkaian
ADC (Analog Digital Converter) dan
proporsional dengan suhu pada orde derajat
Celcius. Bentuk fisik dari DS18b20 dapat
terlihat pada Gambar 1, device ini
mempunyai tiga kaki yang terdiri dari GND
untuk ground, DQ untuk data masukan atau
data keluaran, dan VDD untuk daya device.
Salah satu keunggulan lain yaitu device ini
tidak memerlukan daya dari luar, daya dapat
diambil langsung oleh device ini dari kaki
DQ atau kaki untuk data, istilah lainnya
yaitu parasite power. Bentuk contoh
rangkaiannya dapat dilihat pada Gambar 2.
Jika DS18b20 yang digunakan sedikit maka
dapat menggunakan pendayaan dari luar,
melalui kaki VDD, rangkaiannya dapat dilihat
pada Gambar 3. Namun jika device yang
dipasangkan berjumlah banyak baiknya
menggunakan parasite power. Daya yang
dibutuhkan sensor ini berkisar antara 3,0 V
sampai 5,5 V.
Gambar 1. Sensor suhu DS18B20
Gambar 2. Blok diagram daya internal
pada DS18B20
Gambar 3. Blok diagram daya external
pada DS18B20
Gambar 4. Blok diagram DS18B20
Gambar 4 memperlihatkan struktur
DS18b20. Sebanyak 64-bit ROM pada
device menyimpan kode serial unik yang
digunakan sebagai pembeda device satu
dengan yang lain sehingga mikrokontroler
dapat mengenalinya. Kode unik itu disebut
14
dengan MAC Address. Memori scratchpad
mengandung register 2-bit yang digunakan
untuk menyimpan keluaran digital dari
sensor temperatur. Sebagai tambahan,
scratchpad menyediakan akses ke 1-byte
Upper dan Lower alarm register trigger (TH
dan TL). Register TH dan TL adalah non-
volatile (EEPROM), sehingga alat ini dapat
mempertahankan data saat tidak
dihubungkan dengan catu daya.
DS18b20 menggunakan 1-wire bus
protokol eksklusif yang menerapkan bus
komunikasi menggunakan satu sinyal
kendali. Garis kendali memerlukan strong
pull-up resistor karena semua device
dihubungkan melalui 3-state atau port open
drain (pin DQ). Dalam sistem bus ini,
mikrokontroler mengidentifikasi dan
melakukan pengalamatan device pada bus
menggunakan kode 64-bit yang unik. [1]
Embedded Networked DSTINIm400
DSTINIm400 (Dallas Semiconductor
Tiny Internet Interface module) merupakan
sebuah modul yang dapat digunakan untuk
keperluan embedded networked system.
Modul ini sangat cocok digunakan dalam
perancangan embedded server. Hal ini
dikarenakan modul ini dapat bekerja seperti
komputer atau disebut juga Single Board
Computer. Modul ini bekerja dengan
menggunakan sistem operasi seperti halnya
sebuah komputer. Sistem operasinya
dinamakan dengan TinyOS (Tiny Operating
System). Dalam sistem operasi DSTINIm400
telah terdapat JRE (Java Runtime
Evironment) sehingga pengembangan
aplikasi dapat dilakukan dalam bahasa
tingkat tinggi (High-Level Language) yaitu
dengan menggunakan bahasa pemrograman
Java.
Pada dasarnya komponen inti dari
modul DSTINIm400 adalah sebuah
mikrokontroler jaringan (network
microcontroller) tipe DS80C400, dimana
mikrokontroller ini merupakan
mikrokontroler yang telah menyertakan
10/100 Ethernet, TCP IPv4/6 network stack
dan firmware yang telah di-burning ke
dalam ROM-nya. Selain TCP IP, DS80C400
ini juga mendukung komunikasi via protokol
UDP (User Datagram Protocol), DHCP
(Dynamic Host Configuration Protocol),
ICMP, dan IGMP. Oleh karena itu, modul
DSTINIm400 ini sangat reliable untuk
komunikasi jaringan lokal maupun internet.
Selain mikrokontroler DS80C400
sebagai komponen utama, DSTINIm400
juga memiliki memori flash dan RAM
sebesar 1MB, hal ini yang membuat
DSTINIm400 dapat beroperasi dengan
menggunakan sistem operasi. Untuk
keterangan lebih lanjut mengenai modul
DSTINIm400 ini, dapat mengacu pada
datasheet yang terlampir. Bentuk fisik dari
modul DSTINIm400 dapat dilihat pada
Gambar 5. Diagram modul DSTINIm400
dapat dilihat pada Gambar 6. [2]
Gambar 5. Modul DSTINIm400
Gambar 6. Diagram Modul DSTINIm400
Bahasa Pemrograman Java
Java merupakan bahasa pemograman
berorientasi objek yang dikembangkan oleh
perusahaan Sun Microsytems, yang terkenal
dengan Workstation High-end-nya. Java
merupakan pengembangan dari bahasa
pemograman C++ yang dirancang memiliki
ukuran yang lebih kecil, source dan binary
level-nya sederhana, dapat digunakan untuk
platform dan sistem operasi apapun. Dengan
jargon ”write once, run everywhere”
menunjukkan bahwa program java dapat
dijalankan pada mesin apa saja dengan
syarat mempunyai fasilitas JVM (Java
Virtual Machine). [3]
Untuk memudahkan kompilasi listing
program, menjalankan program, membuat
file aplikasi java, dan mengubah ekstensi
.class menjadi .tini, dalam penelitian ini
menggunakan IDE (Integrated Development
Environment) Borland JBuilder 9 Enterprise.
Keunggulan dari software ini yaitu :
Terdapat error correction dan auto
suggestion terhadap kesalahan
listing program yang dibuat.
15
Tampilan GUI (Graphical User
Interface)
Mudah digunakan
Dapat menentukan path dengan
mudah
Dengan menambah library
TINIConverter dapat mengubah file
.class menjadi .tini
Dapat menempatkan secara langung
file .tini ke dalam mikrokontroller
TINI. [4]
Bahasa Pemrograman XML dan XSL
XML (Extensible Markup Language)
adalah bahasa markup, markup digunakan
untuk menyampaikan informasi tentang
beberapa teks atau data lain. XML berbeda
dari bahasa markup seperti HTML
(Hypertext Markup Language) karena
XML dapat memiliki jumlah elemen jenis
nama yang sering disebut informal tag
name, Sehingga memberikan kemampuan
yang lebih fleksibel kepada para
programmer web.
XML dikembangan oleh grup kerja
xml (awalnya SGML Editorial Review
Board) dibawah badan W3C (World Wide
Web Consortium) pada tahun 1996.
XML adalah class dari object data yang
disebut XML document. XML dokumen
dapat digunakan untuk menyimpan data
yang Anda simpan sebagai huruf, laporan,
manual dan sebagainya atau data yang
mungkin anda hubungkan dengan
database. [5]
XSL dirancang untuk digunakan
dengan XML dokumen untuk
mentransformasikan data dalam bentuk
yang sesuai untuk presentasi dalam
konteks tertentu atau menjadi alternatif
struktur XML. XSL cocok untuk
membuat dokumen HTML dari server-side
XML dengan HTML yang dihasilkan
diproses oleh pengguna Web browser
dengan cara biasa. XSL memiliki output
untuk mengaktifkan modus HTML output
yang akan ditentukan. Selain itu, XSL
dapat digunakan untuk memproduksi
HTML browser untuk desktop, dan WML
(Wireless Markup Language) untuk mobile
browser yang sama dari XML penyimpan
data. [6]
Bahasa Pemrograman PHP dan AJAX
PHP adalah bahasa server-side yang
termasuk bahasa pemrograman kode sumber
terbuka (opensource). Maksud server-side
berarti kode sumber berada disisi server.
Sedangkan AJAX (Asynchronuous
Javascript and XML) adalah teknik untuk
me-request dan respond halaman web yang
bekerja terus-menerus secara background.
Pada penelitian ini menggunakan framework
jQuery versi 1.3.2.
Keunggulan PHP yaitu:
- Kode sumber terbuka. - Mendukung penulisan dari bahasa
prosedural hingga Object Oriented Programming (OOP).
- Ringan digunakan. - Tidak membutuhkan compiler hanya
butuh web server saja. - Tidak harus mendefinisikan variabel
di awal program. Variabel dapat digunakan kembali.
- Skalabilitas sehingga dipakai oleh perusahaan besar seperti facebook.
Keunggulan AJAX yaitu:
- Auto reload request suatu halaman sehingga menjadi halaman yang dinamis.
- Bekerja secara background dengan menggunakan sumber daya client.
- Cepat, karena setiap saat ada perubahan akan segera di-request.
- Dapat membuat website semakin responsif dan dinamis. [7]
Data dari XML ‘dijemput’ oleh script
php yang secara asinkron dipanggil terus-
menerus oleh AJAX tiap dua detik.
Metode Elemen Hingga
Metode Elemen Hingga (FEM) adalah
sebuah teknik numerik yang digunakan
untuk memperkirakan suatu problem fisis
dari persamaan diferensial parsial pada
persoalan yang menyangkut aliran fluida,
analisa struktur, dan lainnya dengan
mendiskritisasikan suatu objek menjadi
bagian kecil (elemen hingga). Metode
pendekatan yang sering digunakan saat
merumuskan problem fisis ke dalam
diskritisasi metode elemen hingga, yaitu
metode Galerkin dan metode Variasi [8][9].
Pada penelitian ini menggunakan metode
Galerkin yang didasarkan pada minimasi
residu yang tertinggal setelah suatu solusi
pendekatan disubtitusikan ke dalam
persamaan diferensial dari suatu problem
fisis.
Ide utama dari metode elemen hingga
adalah untuk memecahkan elemen yang
sangat kompleks dengan batasan yang tidak
ditentukan menjadi suatu elemen dengan
batasan yang kecil. Masing-masing elemen
16
diperhitungkan sebagai bagian dalam
permasalahan utama, dimana terdapat
hubungan antarelemen yang saling
berkaitan melalui informasi global tentang
deformasi, yang biasanya berhubungan
dengan karakteristik elemen. Keakuratan
metode elemen hingga dapat ditingkatkan
dengan cara menyempurnakan mesh pada
model dengan menambahkan elemen dan
nodes. Metode ini disebut dengan hp-FEM.
Keunggulan dari metode elemen hingga
adalah dapat menyelesaikan persoalan
sistem yang kompleks dimana tidak dapat
diselesaikan dengan perhitungan analitis,
dapat menghitung dari persamaan linear
hingga persamaan nonlinear, penghitungan
secara komputasi ini menjadi sangat efisien,
dan untuk beberapa permasalahan metode
ini mungkin adalah satu-satunya cara.
Komputer digunakan untuk melakukan
jutaan penghitungan yang diperlukan untuk
mensimulasikan elemen-elemen penyusun
suatu model yang kompleks yang digunakan
dalam pemodelan atau simulasi ini. Software
yang digunakan adalah SolidWorks 2009
SP 2.1 versi standard.
Konduksi Thermal Dua Dimensi
Pada penelitian ini menggunakan
distribusi konduksi thermal pada pelat logam
dalam bidang dua dimensi arah rambatnya.
Konduksi thermal dua dimensi
dituliskan dengan: [10]
𝒒𝑥 = −𝑘𝑥𝑥𝜕𝑇
𝜕𝑥 (1)
𝒒𝑦 = −𝑘𝑦𝑦𝜕𝑇
𝜕𝑦 (2)
dimana :
q : konduksi thermal [J]
kxx = kyy : konduktivitas thermal [J/oCms]
T : Temperatur [oC]
Jika dituliskan dengan matrix menjadi:
𝑞 = 𝑞𝑥𝑞𝑦 = −
𝑘𝑥𝑥 00 𝑘𝑦𝑦
𝜕𝑇
𝜕𝑥𝜕𝑇
𝜕𝑦
= −𝑫∇𝑇 (3)
Kemudian sesuai dengan teorema divergensi
gauss, maka didapat strong formulation
konduksi panas dua dimensi:
𝑑𝑖𝑣 𝑡𝑫∇𝑇 + 𝑡𝑄 =𝜕
𝜕𝑥 𝑡𝑘𝑥𝑥
𝜕𝑇
𝜕𝑥
+𝜕
𝜕𝑥 𝑡𝑘𝑦𝑦
𝜕𝑇
𝜕𝑦
+𝑡𝑄 = 0 (4)
Kalikan dengan fungsi bobot (weight
function) lalu integralkan terhadap domain
lalu menghasilkan:
(∇𝑣)𝑇
𝐴
𝑡𝑫∇𝑇𝑑𝐴 = − 𝑣𝑡𝑞 ℒ𝑞
𝑑ℒ
− 𝑣𝒕𝑞𝑛ℒ𝑇𝑑ℒ
+ 𝑣𝑡𝑄𝑑𝐴𝐴
(5)
dengan
𝑇 = 𝑇 pada ℒ𝑇
𝑞𝑛 = 𝑞 pada ℒ𝑞
Kemudian diskritisasikan domain
menjadi elemen berhingga. Dengan
menggunakan metode Galerkin maka
variabel utama (yaitu temperatur) dan fungsi
bobot menggunakan interpolasi yang sama.
𝑇 𝑥,𝑦 = 𝑁1 𝑥,𝑦 𝑇1 + 𝑁2 𝑥,𝑦 𝑇2
+𝑁3 𝑥, 𝑦 𝑇3 + 𝑁4 𝑥, 𝑦 𝑇4
= 𝑁1 𝑥, 𝑦 𝑁2 𝑥, 𝑦 𝑁3 𝑥, 𝑦 𝑁4 𝑥, 𝑦
𝑇1
𝑇2
𝑇3
𝑇4
= 𝑵 𝑥, 𝑦 𝒂 (6)
Karena v dan a adalah konstan, dan setelah
dilakukan subtitusi maka menghasilkan:
𝑩𝑇𝐴
𝑡𝑫𝐁𝑑𝐴𝒂 = − 𝑵𝑇𝑡𝑞 ℒ𝑞
𝑑ℒ
− 𝑵𝑻𝒕𝑞𝑛ℒ𝑇𝑑ℒ
+ 𝑵𝑇𝑡𝑄𝑑𝐴𝐴
(7)
Dimana:
𝑩 = ∇𝑵 (8)
Diketahui:
𝑲 = 𝑩𝑇𝐴
𝑡𝑫𝐁𝑑𝐴𝒂 (9)
sebagai stiffness matrix (matriks kekakuan)
𝒇𝑏 = − 𝑵𝑇𝑡𝑞 ℒ𝑞
𝑑ℒ − 𝑵𝑻𝒕𝑞𝑛ℒ𝑇𝑑ℒ (10)
sebagai boundary load vector
𝒇ℓ = 𝑵𝑇𝑡𝑄𝑑𝐴𝐴
(11)
sebagai internal load vector
𝑲𝒂 = 𝒇𝑏 + 𝒇ℓ (12)
atau
𝑲𝒂 = 𝒇 (13)
dengan
𝒇 = 𝒇𝑏 + 𝒇ℓ (14)
Keterangan:
K adalah matrix 4x4
𝒂 =
𝑇1
𝑇2
𝑇3
𝑇4
, 𝑵 = 𝑁1 𝑁2 𝑁3 𝑁4
𝒇 =
𝑞1
𝑞2𝑞3
𝑞4
, 𝑩 =
𝜕𝑁1
𝜕𝑥
𝜕𝑁2
𝜕𝑥
𝜕𝑁3
𝜕𝑥
𝜕𝑁4
𝜕𝑥
𝜕𝑁1
𝜕𝑦
𝜕𝑁2
𝜕𝑦
𝜕𝑁3
𝜕𝑦
𝜕𝑁4
𝜕𝑦
Contoh perhitungan menggunakan metode
elemen hingga terlampir.(Lampiran 2)
17
Database MySQL
MySQL adalah Relational Database
Management System (RDBMS) yang
didistribusikan secara gratis dibawah lisensi
GPL (General Public License). Dimana
setiap orang bebas untuk menggunakan
MySQL, namun tidak boleh dijadikan
produk turunan yang bersifat closed source
atau komersial. MySQL sebenarnya
merupakan turunan salah satu konsep utama
dalam database sejak lama, yaitu SQL
(Structured Query Language). SQL adalah
sebuah konsep pengoperasian database,
terutama untuk pemilihan atau seleksi dan
pemasukan data, yang memungkinkan
pengoperasian data dikerjakan dengan
mudah secara otomatis. Keandalan suatu
sistem database (DBMS) dapat diketahui
dari cara kerja optimizer-nya dalam
melakukan proses perintah-perintah SQL,
yang dibuat oleh user maupun program-
program aplikasinya. Sebagai database
server, MySQL dapat dikatakan lebih
unggul dibandingkan database server
lainnya dalam query data. Hal ini terbukti
untuk query yang dilakukan oleh single user,
kecepatan query MySQL bisa sepuluh kali
lebih cepat dari PostgreSQL dan lima kali
lebih cepat dibandingkan Interbase. Selain
itu MySQL juga memiliki beberapa
keistimewaan, antara lain : portability, open
source, multiuser, performance tuning,
column types, command dan functions,
security, scalability dan limits, connectivity,
localisation, interface, clients dan tools, dan
struktur table. [12]
SolidWorks 2009 SP 2.1
Pada penelitian ini menggunakan
software SolidWorks versi 2009 Service
Pack 2.1 dengan lisensi a.n. Institut
Pertanian Bogor. Program ini mirip seperti
program CAD, namun tidak hanya untuk
menggambar saja tetapi juga dapat
digunakan untuk analisis suatu problem
fisis. Dalam memecahkan suatu problem
SolidWorks menggunakan metode elemen
hingga tipe hp-FEM, sehingga waktu
penghitungannya lebih cepat dengan tingkat
keakuratan yang cukup presisi. Namun
sayang dalam melakukan komputasi,
SolidWorks sangat menghabiskan sumber
daya CPU komputer. [13]
ALAT DAN METODE
Waktu dan Tempat
Penelitian ini dilakukan di
Laboratorium Mikrokontroler dan Bengkel
Mekanik Departemen Fisika Fakultas
Matematika dan Ilmu Pengetahuan Alam
Institut Pertanian Bogor mulai dari bulan
Mei 2009 sampai bulan Oktober 2010.
Alat dan Bahan
Alat yang digunakan pada penelitian ini
meliputi PC (Personal Computer),
termometer digital EXTECH 421305, digital
multimeter, adapter power supply, signal
generator, microcontroller DSTINIm400,
protoboard, solder, penyedot timah,
stopwatch, tulang ikan, kabel tipe RJ11,
kabel UTP (Unshielded Twisted-Pair) tipe
crossover, dan konektor RJ45.
Bahan-bahan yang digunakan pada
penelitian ini meliputi sensor temperatur
onewire DS18B20, komponen elektronika,
PCB (Printed Board Circuit) kosong,
heater, heatsink high thermal conductivity,
timah, dan logam aluminium.
Gambar 7. Heatsink Compounds
Gambar 8. Setup Pengukuran
Metode Penelitian
1. Persiapan Alat dan Bahan
Mengkalibrasi nilai temperatur heater
sebesar 100oC, dan kalibrasi antara sensor
dengan thermometer EXTECH 421305.
Kemudian ujung pelat logam dipotong dan
dihaluskan sehingga dapat menempel
dengan heater.
Su
mb
er
Kalo
r
Sensor Temperatur
Es
Balo
k
Es Balok
Pelat Logam
18
2. Pembuatan Program
Pembuatan program dilakukan secara
bertahap, yakni pembuatan program java
kemudian di-compile menghasilkan .class.
Dari .class dikonversi menjadi .tini.
Kemudian selanjutnya, menyiapkan
database MySQL dan membuat program
PHP yang akan menangkap nilai temperatur
di dalam XML untuk langsung disimpan ke
dalam database. Kemudian menyiapkan
simulasi model objek komputasi sesuai
dengan eksperimen.
3. Analisis keluaran data
Menginput data yang telah tersimpan di
database ke dalam simulasi program di
SolidWorks. Kemudian menganalisis hasil
eksperimen dengan hasil perhitungan
numerik metode elemen hingga.
Adapun diagram alur penelitian ini
digambarkan dengan:
Gambar 9. Diagram Alur Penelitian
HASIL DAN PEMBAHASAN
Sensor Temperatur
Device sensor yang dipakai adalah
DS18b20. Didalamnya terdapat sensor
temperatur semikonduktor dimana terdapat
2-byte register memori scratchpad yang
dapat menyimpan data temperatur. Keluaran
dari sensor ini sudah berupa data digital
sehingga tidak diperlukan lagi konverter
ADC. Format pengalokasian memori
DS18b20 digambarkan sebagai berikut:
Gambar 10. Format Data Keluaran
DS18b20
Untuk menentukan kevalidan data
temperatur maka keluaran sensor temperatur
dibandingkan menggunakan alat Extech
Digital Temperature seri 421305. Jika
ternyata belum mendapat nilai yang tepat
dan itu bukan kesalahan program, maka
akan dicek ulang disisi device (sensor, kabel,
tegangan, dan lainnya). Namun jika
penyebabnya adalah kesalahan program
maka akan diprogram ulang dan dilakukan
pengujian sensor lagi.
Range temperatur yang dapat diterima
oleh sensor DS18b20 berkisar antara -55 oC
s.d. 125 oC. Dengan keakuratan sensor yang
baik pada kisaran -10 oC s.d. 85
oC, dengan
toleransi + 0,5 oC. Oleh karena itu, jika
sensor mendapat temperatur lebih dari
125oC maka sensor akan rusak dan jika
sensor men-sensing nilai temperatur lebih
dari 85oC maka keakuratannya akan semakin
buruk. Inilah salah satu sebab mengapa ada
sensor yang tidak terbaca saat pengujian
pembacaan data sensor, yakni disebabkan
oleh solder yang bertemperatur tinggi
(180oC) dan menginduksi ke sensor.
Jika di-debug running program
pengambilan data sensor maka akan terlihat
di database selang waktu berkisar 6-10 detik
tiap interval pengambilan datanya. Hal ini
disebabkan program perlu membaca file
konfigurasi (prefs.ini terlampir) dan
meng-update setiap data yang baru ke dalam
log file (ddmmyy.log) dan file XML
(weather.xml terlampir) [14]. Pada saat
mikrokontroller mengupdate data baru ke
weather.xml kemudian PC Server akan
mengambil data tersebut dan menyimpannya
ke dalam database MySQL. Namun pada
penelitian sebelumnya [4] mengatakan
bahwa sensor DS18b20 memiliki rata-rata
selang interval selama 4 detik dengan
tingkat akurasi diatas 86.5%.
Sensor ds18b20 memiliki 4 bit resolusi,
yaitu 9, 10, 11, dan 12 (Tabel 5). Pada
Analisis Data
(Metode Elemen Hingga)
Data
Temperatur
Valid?
Persiapan Alat dan Bahan
Pembuatan dan
Pengujian Program
Ya
Tidak
Kesalahan
Program?
Ya
Tidak
Laporan Hasil Analisis
19
penelitian ini menggunakan resolusi 9 bit
dengan besar resolusi 0.5 oC dimana hal ini
didefinisikan pada baris program berikut: device.setTemperatureResolution(d
evice.RESOLUTION_9_BIT, state);
Pemanas Pemanas (heater) yang digunakan
adalah seterika listrik dengan spesifikasi
besar tegangan = 220 V, daya = 300-350 W,
Temperatur maksimal = 210 oC. Pemanas ini
diusahakan agar bekerja pada kisaran nilai
temperatur + 100 oC.
Antara pelat logam dengan pemanas
dioleskan heatsink thermal conductivity
dengan spesifikasi besar thermal
conductivity > 1,22 W/m.k dan thermal
resistance < 0.201 oC-in
2/w. Fungsi
pengolesan ini bertujuan untuk membantu
penghantaran aliran konduksi kalor dari
pemanas ke pelat logam dan menghindari
adanya celah diantara keduanya. Grafik
hubungan antara temperatur dengan waktu
digambarkan sebagai berikut:
Gambar 11. Hubungan temperatur
dengan waktu
Data Logger Temperatur
Saat ds18b20 men-sensing temperatur,
data diterima oleh modul mikrokontroller
DSTINIm400 dan hasilnya ditampilkan
dalam bentuk XML dengan user interface
(UI) web-based. Dengan menggunakan
regular-expression (regex) pada
pemrograman PHP, tag XML yang berisi
data temperatur diambil nilainya dan
disimpan ke dalam database MySQL
(Lampiran 15) di komputer yang bertindak
sebagai server.
Saat melakukan fetching data, agar data
dapat terambil secara terus-menerus maka
pada penelitian ini digunakan teknik
pemrograman AJAX. Dalam selang waktu 4
sampai dengan 6 detik akan didapat data
temperatur. Selang waktu ini bukan delay
dari AJAX tetapi delay saat pemrosesan
pengambilan data dari sensor ke
mikrokontroller.
Metode Elemen Hingga
Penelitian ini menggunakan elemen
berbentuk triangular. Pada software
SolidWorks dapat diatur banyak elemen
yang digunakan, semakin banyak elemen
yang digunakan maka akan semakin
membutuhkan waktu yang cukup lama untuk
melakukan komputasi.
Gambar 12. Elemen triangular pertama,
kedua, dan ke-n
Penelitian ini membandingkan nilai
temperatur yang ada di node-node elemen
hingga dengan nilai temperatur secara
eksperimen di titik koordinat yang sama.
Diambil empat titik node, yaitu pada node
13 (28, 5,5), node 16 (21, 5,5), node 19 (21,
165), dan node 20 (21, 1,1) (Gambar 14)
dengan melakukan lima kali perulangan.
(Tabel 1).
Tabel 1. Perbandingan data eksperimen (Extech) dengan data perhitungan (FEM)
Koordinat (cm) SolidWorks
Temp Extech (Celcius) Temp
Rata-rata x y ulangan 1 ulangan 2 ulangan 3 ulangan 4 ulangan 5
21 5,5 22,00 23,00 22,70 22,00 22,30 22,00 22,40
21 11 33,06 33,00 31,50 31,50 31,80 32,00 31,96
28 5,5 22,00 22,50 22,90 22,20 22,10 23,00 22,54
21 16,5 33,91 33,70 33,30 32,90 33,00 33,20 33,22
0,00
20,00
40,00
60,00
80,00
100,00
120,00
1
16
31
46
61
76
91
10
6
12
1
13
6
15
1
16
6
18
1
19
6
21
1
22
6
Tem
pera
tur (
Celc
ius)
Waktu (detik)
3(28,16.5
)
1(28,5.5)
2(21,11.5
)
3(28,16.5)
4(28,16.5)
2(21,11.5)
20
Gambar 13. Meshing menjadi
beberapa elemen
Gambar 14. Probe nilai temperatur di
node mesh object
Saat nilai temperatur referensi telah
didapat dan telah dibuat desain simulasi,
memasukkan variabel input, dan atribut-
atributnya pada software SolidWorks maka
input boundary akan dievaluasi terhadap
persamaan 10 dan persamaan 11. Setelah itu
akan didapat nilai matriks f. Kemudian
dihitung nilai matriks kekakuan (K) terhadap
persamaan 9. Sesuai persamaan 13 akan
didapat nilai temperatur pada matriks d.
Perhitungan ini berlaku di tiap elemen yang
kemudian dinamakan dengan perhitungan
matriks secara lokal. Setelah itu, di-assembly
(hasil masing-masing elemen) menjadi nilai
global. Karena tiap titik node telah terhitung
nilai temperaturnya, maka akan terlihat
distribusi penyebaran temperaturnya. Jumlah
mesh elemen penelitian ini sedikit sehingga
terlihat penyebaran distribusi yang ‘kasar’.
KESIMPULAN DAN SARAN
Kesimpulan Berdasarkan hasil dan pembahasan
diatas maka dapat disimpulkan sebagai
berikut:
Dengan referensi nilai temperatur sensor disuatu titik, dapat diketahui penyebaran distribusi temperatur disuatu objek menggunakan metode elemen hingga. (Table 1)
Semakin banyak elemen maka akan semakin mendekati solusi eksak.
Metode elemen hingga dapat mengefisiensikan penggunaan sensor dengan mengambil nilai boundary.
Ketepatan pengukuran rata-rata sebesar 97.6%.
Saran Saran yang dapat diberikan dari
penelitian ini adalah:
Jika menggunakan banyak sensor, lebih baik mengambil daya dari kaki DQ yang berfungsi sebagai parasite power.
Menggunakan solder yang berkualitas dan hendaknya mengukur temperatur solder terlebih dahulu agar tidak merusak sensor.
Dengan User Interface Web, maka percobaan ini dapat dijadikan sebagai remote laboratory dengan menambahkan IP public sehingga dapat diakses melalui media internet.
DAFTAR PUSTAKA
[1] Anonim. DS18S20b High-Precision
1-Wire Digital Thermometer.
www.maxim-ic.com. 10 Januari
2007.
[2] Loomis, Don. 2001. The TINI™
Specification and Developer’s Guide.
Addison-Wesley: Boston.
[3] Deitel, Harvey M., Deitel, Paul J.
2004. Java How to Program Sixth
Edition. Prentice Hall: New Jersey.
[4] Priatna, Subhi. 2009. Rancang
Bangun Prototipe Sistem Kontrol
Temperatur Greenhouse melalui
Jaringan Wireless Berbasis
Mikrokontroller DSTINI. Skripsi.
Institut Pertanian Bogor.
[5] Anonim.
http://www.w3.org/TR/REC-xml/ .
25 November 2008.
[6] Arsenal, Bobi. 2007. Monitoring
Temperatur Melalui Jaringan
Menggunakan DSTINI400. Tugas
Akhir. Institut Pertanian Bogor.
[7] Darie, Cristian., Bogdan, Brinzarea.,
Cherecheş-Toşa, Filip., Bucica,
Mihai. 2006. AJAX and PHP,
Building Responsive Web
Applications. Packt Publishing:
Birmingham.
21
[8] Nikishkov, G.P. 2004. Introduction to
The Finite Element Method. Lecture
Note. University of Aizau, Japan.
(19 Januari).
[9] Desai, Candrakant S. 1988. Dasar-
Dasar Metode Elemen-Hingga.
Jakarta: Penerbit Erlangga.
[10] Fish, Jacob., Belytschko, Ted. 2007.
A First Course of A Finite Element.
JohnWiley&Sons: England.
[11] Lewis, Roland W., Nithiarasu,
Perumal., Seetharamu, Kankanhalli
N., Fundamentals of the Finite
Element Method of Heat and Fluid
Flow. 2004. England: John Wiley &
Sons.
[12] Anonim.
http://id.wikipedia.org/wiki/MySQL.
7 Mei 2009.
[13] Adams, Vince. Do FEA Tools Give
Same Answer? A Comparison of
Finite Element Analysis Software.
IMPACT Engineering Solutions, Inc.
[14] Bitson, Tim. 2006. Weather Toys,
Building and Hacking Your Own 1-
Wire Weather Station. Wiley
Publishing: Indianapolis.
23
LAMPIRAN
24
Tabel Lampiran 2. Data temperatur pemanas terhadap waktu
Waktu (s) Temp (Celcius)
41,00 43,30
42,00 43,70
43,00 43,70
44,00 44,70
45,00 43,80
46,00 46,00
47,00 45,10
48,00 46,40
49,00 45,90
50,00 46,80
51,00 48,30
52,00 49,20
53,00 49,60
54,00 48,80
55,00 50,10
56,00 50,30
57,00 49,70
58,00 52,10
59,00 51,70
60,00 51,70
61,00 51,20
62,00 53,00
63,00 54,00
64,00 55,20
65,00 54,40
66,00 56,10
67,00 54,70
68,00 55,30
69,00 57,70
70,00 57,70
71,00 58,10
72,00 59,80
73,00 57,40
74,00 61,30
75,00 61,70
76,00 62,30
77,00 62,60
78,00 62,80
79,00 63,40
80,00 63,60
Waktu (s) Temp (Celcius)
81,00 64,50
82,00 65,20
83,00 65,40
84,00 66,70
85,00 67,00
86,00 67,50
87,00 67,70
88,00 68,80
89,00 69,40
90,00 70,30
91,00 71,00
92,00 71,50
93,00 72,30
94,00 73,30
95,00 72,30
96,00 73,90
97,00 74,50
98,00 74,50
99,00 75,30
100,00 76,20
101,00 75,60
102,00 75,60
103,00 77,50
104,00 78,20
105,00 78,40
106,00 79,30
107,00 79,60
108,00 79,60
109,00 80,10
110,00 80,50
111,00 81,20
112,00 81,50
113,00 81,70
114,00 82,90
115,00 83,20
116,00 83,40
117,00 84,50
118,00 84,50
119,00 84,50
120,00 85,70
Waktu (s) Temp (Celcius)
1,00 28,40
2,00 28,50
3,00 28,70
4,00 29,20
5,00 29,20
6,00 29,40
7,00 29,60
8,00 30,40
9,00 30,50
10,00 30,70
11,00 30,90
12,00 30,12
13,00 30,14
14,00 30,14
15,00 30,20
16,00 30,21
17,00 30,25
18,00 30,27
19,00 30,30
20,00 30,32
21,00 30,34
22,00 30,36
23,00 30,37
24,00 30,40
25,00 30,50
26,00 30,51
27,00 35,20
28,00 35,40
29,00 35,60
30,00 35,90
31,00 35,10
32,00 35,74
33,00 37,10
34,00 37,40
35,00 38,20
36,00 38,40
37,00 39,00
38,00 39,70
39,00 40,80
40,00 42,50
25
Waktu (s) Temp (Celcius)
121,00 86,20
122,00 86,40
123,00 86,60
124,00 87,10
125,00 87,30
126,00 87,50
127,00 87,90
128,00 88,00
129,00 88,10
130,00 88,70
131,00 88,70
132,00 89,10
133,00 89,50
134,00 89,10
135,00 90,10
136,00 89,90
137,00 90,00
138,00 90,60
139,00 89,40
140,00 89,80
141,00 90,90
142,00 91,10
143,00 91,10
144,00 91,00
145,00 90,80
146,00 90,40
147,00 91,00
148,00 91,10
149,00 91,60
150,00 91,50
151,00 91,50
152,00 91,90
153,00 91,80
154,00 92,20
155,00 92,30
156,00 92,10
157,00 92,80
158,00 92,90
159,00 93,00
160,00 93,20
Waktu (s) Temp (Celcius)
161,00 93,40
162,00 93,40
163,00 93,50
164,00 93,80
165,00 93,90
166,00 94,20
167,00 94,30
168,00 94,40
169,00 94,50
170,00 94,50
171,00 94,50
172,00 94,80
173,00 94,60
174,00 94,90
175,00 94,90
176,00 95,00
177,00 95,20
178,00 95,20
179,00 95,30
180,00 95,50
181,00 95,30
182,00 95,30
183,00 95,40
184,00 95,50
185,00 95,70
186,00 95,80
187,00 95,90
188,00 95,80
189,00 96,20
190,00 96,30
191,00 96,30
192,00 96,70
193,00 96,70
194,00 96,90
195,00 97,60
196,00 98,20
197,00 98,10
198,00 98,50
199,00 98,60
200,00 98,60
Waktu (s) Temp (Celcius)
201,00 98,80
202,00 99,30
203,00 99,00
204,00 99,50
205,00 99,50
206,00 99,80
207,00 99,40
208,00 99,80
209,00 100,20
210,00 99,90
211,00 100,10
212,00 100,40
213,00 100,30
214,00 100,40
215,00 100,70
216,00 100,80
217,00 100,50
218,00 100,70
219,00 100,70
220,00 100,70
221,00 99,30
222,00 98,70
223,00 99,40
224,00 99,10
225,00 99,70
226,00 100,10
227,00 99,90
228,00 99,80
229,00 100,20
230,00 100,30
231,00 100,30
232,00 100,30
233,00 100,70
234,00 100,50
235,00 100,60
236,00 100,90
237,00 100,00
238,00 99,80
239,00 99,60
240,00 99,80
26
Tabel Lampiran 3. Terminologi matriks untuk metode elemen hingga [10]
Matriks Elastisitas Difusi Konduksi Panas
K Stiffness Difusivitas Konduktansi
F Gaya Fluks Fluks
D Perpindahan Konsentrasi Temperatur
Tabel Lampiran 4. MAC Address (64-bit unique) sensor temperatur DS18b20
Device Name MAC Address
Sensor 1 9D000001986C7C28
Sensor 2 F400000109860728
Sensor 3 500000010A003E28
Sensor 4 730000019871E628
Sensor 5 9700000198546920
Tabel Lampiran 5. Resolusi sensor temperatur ds18b20
R1 R2 RESOLUSI
(BIT)
MAX WAKTU
KONVERSI
BESAR
RESOLUSI (oC)
0 0 9 93.75ms (tconv/8) 0.5
0 1 10 187.5ms (tconv/4) 0.25
1 0 11 375ms (tconv/2) 0.125
1 1 12 750ms (tconv) 0.0625
Tabel Lampiran 6. Karakteristik sensor DS18b20
27
Lampiran 1. Rumus Ketepatan
𝐾𝑒𝑡𝑒𝑝𝑎𝑡𝑎𝑛 = 1 −|𝑙𝑖𝑡𝑒𝑟𝑎𝑡𝑢𝑟 −𝑝𝑒𝑟𝑐𝑜𝑏𝑎𝑎𝑛 |
𝑙𝑖𝑡𝑒𝑟𝑎𝑡𝑢𝑟 × 100% (15)
Lampiran 2. Contoh perhitungan menggunakan metode elemen hingga.[11]
Sebuah pelat mendapat keadaan isotermal sebesar 100oC di semua sisinya kecuali di sisi atas
yang sebesar 500oC. Jika konduktivitas termal konstan dengan nilai sebesar 10 W/m
oC, bagaimana
distribusi temperaturnya dengan menggunakan metode elemen hingga elemen triangular.
Pelat tersebut dibagi menjadi 8 bagian yang sama ukurannya dengan bentuk elemen triangular,
seperti yang terlihat pada Gambar 15. Berikut ini merupakan matriks K untuk elemen 1, 3, 5,dan 7:
b1 = y2 – y4 = -0.50; c1 = x4 – x2 = -0.50
b2 = y4 – y1 = 0.50; c2 = x1 – x4 = 0.00
b4 = y1 – y2 = 0.00; c4 = x2 – x1 = 0.50
Gambar 15. Sebuah pelat dengan kondisi batas temperatur yang berbeda
Gambar 16. Diskritisasi menggunakan elemen triangular
Matriks elemen K untuk elemen 1, 3, 5, dan 7 dapat dituliskan sebagai
𝐾 1 = 𝐾 3 = 𝐾 5 = 𝐾 7 =𝑡𝑘
4𝐴
𝑏12 + 𝑐1
2 𝑏1𝑏2 + 𝑐1𝑐2 𝑏1𝑏4 + 𝑐1𝑐4
𝑏1𝑏2 + 𝑐1𝑐2 𝑏22 + 𝑐2
2 𝑏2𝑏4 + 𝑐2𝑐4
𝑏1𝑏4 + 𝑐1𝑐4 𝑏2𝑏4 + 𝑐2𝑐4 𝑏42 + 𝑐4
2
(16)
dimana luas area elemen dapat dituliskan sebagai
2𝐴 = det 1.0 0.0 0.01.0 0.5 0.01.0 0.0 0.5
= 0.25 𝑚2 (17)
dengan mensubtitusikan luas area ke persamaan 16 didapat
𝐾 1 = 𝐾 3 = 𝐾 5 = 𝐾 7 =𝑡𝑘
2
2.0 −1.0 −1.0−1.0 1.0 0.0−1.0 0.0 1.0
(18)
begitu juga dengan elemen yang lainnya dapat dihitung pula:
28
𝐾 2 = 𝐾 4 = 𝐾 6 = 𝐾 8 =𝑡𝑘
2
1.0 −1.0 0.0−1.0 2.0 −1.00.0 −1.0 1.0
(19)
setelah di-assemble keseluruhan matriks tiap elemen menjadi
dapat dilihat bahwa nilai yang tidak diketahui hanyalah T5 saja yang mana selanjutnya dapat
dihitung dari node ke-5
8𝑇5 = 2𝑇2 + 2𝑇4 + 2𝑇6 + 2𝑇8 (21)
Lalu dengan mensubtitusikan T2 = T4 = T6 = 100oC dan T8 = 500
oC, didapat nilai T5 = 200
oC.
Solusi analisis untuk problem seperti ini dapat dihitung dengan: (Holman 1989)
𝑇 𝑥,𝑦 = 𝑇𝑡𝑜𝑝 − 𝑇𝑠𝑖𝑑𝑒 2
𝜋
−1 𝑛+1+1
𝑛sin
𝑛𝜋𝑥
𝑤 𝑠𝑖𝑛ℎ
𝑛𝜋𝑦
𝑤
𝑠𝑖𝑛ℎ 𝑛𝜋𝐻
𝑤
∞𝑛=1 + 𝑇𝑠𝑖𝑑𝑒 (22)
dan akan didapat hasil yang sama seperti dalam perhitungan menggunakan metode elemen hingga.
Lampiran Gambar 17. Desain antarmuka pengambilan data menggunakan PHP & AJAX
29
Lampiran 3. Skema Mikrokontroller DSTINIm400
30
Lampiran 4. Program utama (tws.java)
/******************************************************************************
Project Name: TiniWeatherServer
File name: tws.java (main)
Version: 5.0.1
Last Updated: 11/16/07
(C) 2007 T. Bitson, All Rights Reserved
Edited by Subhi Priatna
Things to add:
email on device error out
move chart logger into OWDevice
*****************************************************************************/
import java.net.*;
import java.io.*;
import java.util.*;
import com.dalsemi.system.*;
public class TWS
{
public static final String VERSION = "TWS 5.0.1"; public static final boolean IS_TINI = System.getProperty("os.arch").equals("TINI");
protected static boolean debugFlag = false;
protected static String system = "";
protected static Object lock;
protected static DataLogger todaysLog, yesterdaysLog = null;
private static long startTime;
private static boolean firstTime = true;
private static final char BACKSPACE = 0x08;
private static final String DEG_SYMBOL = BACKSPACE + "I";
private Prefs pr;
private WeatherStation ws;
private Wunderground wu;
private TimeSetter ts;
private WebPage webPage;
private WebWorker webWorker;
public TWS()
{
// create the lock object
lock = new Object();
// create a webWorker
webWorker = new WebWorker(lock);
// instantiate a new weather station
ws = new WeatherStation();
// create a weather underground object
wu = new Wunderground();
// create the web page
webPage = new WebPage();
// create a new time setter class, we'll run it later
ts = new TimeSetter();
// get the start time of this session
Date d = new Date();
startTime = d.getTime();
}
31
// main program loop: Start the various servers, get the weather and update the
web page
public void mainLoop()
{
boolean go = true;
boolean resetFlag = true;
Charter chart = null;
BitPort bp = null;
Date date = new Date();
int minute, hour ,second ;
int lastSecond = -99;
int lastMinute = -99;
int lastHour = -99;
InputStreamReader in = new InputStreamReader(System.in);
// get bit port to Tini's activity LED
if (IS_TINI)
{
if (TINIOS.getCPU() == TINIOS.DS80C400)
bp = new BitPort(BitPort.Port3Bit5);
else
bp = new BitPort(BitPort.Port5Bit2);
}
try
{
// create the web server thread and start it
Thread webServer = new Thread(webWorker);
webServer.setName("Web Server");
webServer.start();
// build a log file name & create a log file object
todaysLog = new DataLogger();
// build a chart data file
chart = new Charter();
// if (Prefs.isChartingEnabled())
// {
// chart.reset();
// }
// enable the Watchdog Timer with a 120 second timeout
if (Prefs.isWatchdogEnabled())
TINIOS.setWatchdogTimeout(120000);
// main program loop - loop forever, getting weather data
while(go)
{
// sleep for 1 second
Thread.sleep(1000);
// toggle activity led to show we're alive
if (IS_TINI)
{
if (bp.read() == 1)
bp.clear();
else
bp.set();
}
// feed the 'dog
if (Prefs.isWatchdogEnabled())
TINIOS.feedWatchdog();
// check current time
date.setTime(System.currentTimeMillis());
second = date.getSeconds();
minute = date.getMinutes();
hour = date.getHours();
// only loop once a 20 second
if ((second % 10) == 0)
{
32
//reset setiap 6 jam
if (hour == 18 && minute == 00) //RESET 6 JAM ATAU JAM6?
{
// re-read prefs file
Prefs.read();
if (debugFlag)
System.out.println("Reseting Logs");
// if data logging is on, start a new log file
if (Prefs.isDataLoggingEnabled())
{
// first, get rid of yesterday's log file
if (yesterdaysLog != null)
yesterdaysLog.deleteLog();
// then store today's log as the 'new' yesterday's log
yesterdaysLog = todaysLog;
// finally, start a new log file for today
todaysLog = new DataLogger();
}
// if charting is enabled, restart chart data files
if (Prefs.isChartingEnabled())
chart.reset();
// reset the highs & lows
ws.resetAllStats();
}
if (hour == 12 && minute == 00)
{
// re-read prefs file
Prefs.read();
if (debugFlag)
System.out.println("Reseting Logs");
// if data logging is on, start a new log file
if (Prefs.isDataLoggingEnabled())
{
// first, get rid of yesterday's log file
if (yesterdaysLog != null)
yesterdaysLog.deleteLog();
// then store today's log as the 'new' yesterday's log
yesterdaysLog = todaysLog;
// finally, start a new log file for today
todaysLog = new DataLogger();
}
// if charting is enabled, restart chart data files
if (Prefs.isChartingEnabled())
chart.reset();
// reset the highs & lows
ws.resetAllStats();
}
if (hour == 06 && minute == 00)
{
// re-read prefs file
Prefs.read();
if (debugFlag)
System.out.println("Reseting Logs");
// if data logging is on, start a new log file
if (Prefs.isDataLoggingEnabled())
{
// first, get rid of yesterday's log file
if (yesterdaysLog != null)
33
yesterdaysLog.deleteLog();
// then store today's log as the 'new' yesterday's log
yesterdaysLog = todaysLog;
// finally, start a new log file for today
todaysLog = new DataLogger();
}
// if charting is enabled, restart chart data files
if (Prefs.isChartingEnabled())
chart.reset();
// reset the highs & lows
ws.resetAllStats();
}
// check if its midnite, if so re-read prefs & restart logs
if (hour == 00 && minute == 00)
{
// re-read prefs file
Prefs.read();
if (debugFlag)
System.out.println("Reseting Logs");
// if data logging is on, start a new log file
if (Prefs.isDataLoggingEnabled())
{
// first, get rid of yesterday's log file
if (yesterdaysLog != null)
yesterdaysLog.deleteLog();
// then store today's log as the 'new' yesterday's log
yesterdaysLog = todaysLog;
// finally, start a new log file for today
todaysLog = new DataLogger();
}
// if charting is enabled, restart chart data files
if (Prefs.isChartingEnabled())
chart.reset();
// reset the highs & lows
ws.resetAllStats();
}
// now go get the current weather data
if (debugFlag)
System.out.println("Getting weather at " + date.toString());
// ***** here's the call that actually gets the weather data *****
ws.getWeather();
// if data logging is enabled, log measured data
if (Prefs.isDataLoggingEnabled())
todaysLog.logData(date, ws);
// if charting is enabled, update chart files
if (Prefs.isChartingEnabled())
chart.log(date, ws);
// if time = 10 minute, crunch weather data & update web page
if ((minute % 1) == 0) //ARTINYA TRUE
{
// calc index to 24 hour data
int index = (hour * 6) + (minute / 10);
if (debugFlag)
System.out.println("24 Hour Index = " + index);
// calc averages, trend data, 24-hour diff, etc.
ws.crunchData(index);
34
// now update the weather web page
webPage.updateWeatherPage(date, ws);
// update the history data
ws.updateHistories();
// update Wunderground
if (Prefs.isWUPostingEnabled())
wu.send(date, ws);
// reset weather measurement averages
ws.resetAllAverages();
}
// if its 1am, mail the error log
if (hour == 01 && minute == 00)
{
// if error log mail is enabled and log has data, mail it
if (Prefs.isErrorLoggingEnabled() && Logger.checkFileSize() > 0)
{
// mail the error log
Mailer.mailLog("TWS Log", Prefs.getErrorLogFileName());
// now delete it
Logger.deleteLog();
}
}
// if its 2am, mail yesterday's weather log
if (hour == 02 && minute == 00)
{
// if logging is enabled, mail log
if (Prefs.isLogMailingEnabled() && yesterdaysLog != null)
Mailer.mailLog(yesterdaysLog.getFilename(),
yesterdaysLog.getFilePathname());
}
// if its 3:30 am, set the clock
if (hour == 03 && minute == 30)
{
// update the real-time clock
if (Prefs.isAutoTimeSetEnabled())
new Thread(ts).start();
}
// update the time
lastSecond = second;
lastMinute = minute;
lastHour = hour;
// clean up the mess we left behind
java.lang.System.gc();
}
// check keyboard if not running on Tini
if (!IS_TINI)
{
if (in.ready())
if (in.read() == 'q')
go = false;
}
}
}
catch(Throwable t)
{
Logger.log("mainLoop(): " + t);
t.printStackTrace();
}
finally
{
ws.close();
}
35
}
public static boolean setTimeZone()
{
try
{
if (debugFlag)
System.out.println("Setting Tini's Timezone...");
// get the OS timezone
String tz = com.dalsemi.system.TINIOS.getTimeZone().trim();
if (debugFlag)
System.out.println("Timezone = " + tz);
// get if time zone is default
if (!tz.equals("GMT"))
{
// compare to the java time zone i.e. has it already been set?
if (!TimeZone.getDefault().getID().equals(tz))
{
// now try to set the java timezone
TimeZone zone = TimeZone.getTimeZone(tz);
if (zone == null)
{
try
{
if (tz.charAt(0) != '-')
tz = "+" + tz;
com.dalsemi.system.TINIOS.setTimeZone(tz);
zone = TimeZone.getDefault();
}
catch(NumberFormatException nfe)
{ }
}
if (zone!=null)
TimeZone.setDefault(zone);
}
}
}
catch(Exception e)
{
Logger.log("Error Setting the Timezone - Check Tini's Clock");
return false;
}
return true;
}
// main routine - program starts here
public static void main(String[] args)
{
System.out.print(VERSION + " Started on " + System.getProperty("os.arch"));
System.out.println(" using " + System.getProperty("os.name"));
if (args.length != 0)
{
if (args[0].equals("-d"))
{
System.out.println("debug on");
debugFlag = true;
}
}
// set Tini's Timezone
if (IS_TINI)
setTimeZone();
System.out.println("TWS Local Time = " + new Date());
try
{
// get the preferences
36
Prefs.read();
Logger.log("TWS " + VERSION + " Started on " +
System.getProperty("os.arch"));
// create an instance of the weather server
TWS tws = new TWS();
// start the main loop
tws.mainLoop();
}
catch(Throwable t)
{
Logger.log("Exception: Main() " + t);
}
finally
{
Logger.log("TiniWeatherServer Stopped");
System.exit(1);
}
}
}
/******************************************************************************
Project Name: TiniWeatherServer
File name: TempDevice.java
Version: 2.0
Last Updated: 04/04/07 T. Bitson edited by Subhi Priatna
*****************************************************************************/
import com.dalsemi.onewire.*;
import com.dalsemi.onewire.adapter.*;
import com.dalsemi.onewire.container.*;
public class TempDevice extends OWDevice
{
protected float result = NO_VALUE;
private OneWireContainer28 device = null;
public TempDevice(DSPortAdapter adapter, OWHub hub, String identifier)
{
super(identifier);
this.hub = hub;
// do we have a valid serial number?
if (getSerialNum().substring(14).equals("28"))
{
// activate the hub channel for ths device
hub.activateChannel(getHubChannel(), getHubPort());
device = new OneWireContainer28(adapter, getSerialNum());
if (device != null)
{
// looks like the device is valid, enable it
deviceDisabled = false;
// does this temp sensor have greater than .5 deg resolution?
try
{
if (device.hasSelectableTemperatureResolution())
{
// if so, set resolution to max
byte[] state = device.readDevice();
device.setTemperatureResolution(device.RESOLUTION_9_BIT, state);
device.writeDevice(state);
Logger.log("Temp Device Supports High Resolution");
}
}
catch (OneWireException e)
{
Logger.log("Error Setting Resolution: " + e);
}
}
// couldn't create the one wire container
else
37
{
Logger.log("Temperature Sensor Not Found - Disabling Device");
device = null;
}
// deactivate hub channel
hub.deactivateChannel(getHubChannel(), getHubPort());
}
// invalid serial number string
else
{
Logger.log("Invalid or No " + identifier + " Device - Device Disabled");
}
}
public boolean read()
{
if (deviceDisabled)
return false;
// activate the hub channel for ths device
hub.activateChannel(getHubChannel(), getHubPort());
try
{
// is device there?
if (device.isPresent())
{
// read temperature
if (debugFlag)
System.out.println("Temperature: " + device.getName() + " " +
device.getAddressAsString());
byte[] state = device.readDevice();
device.doTemperatureConvert(state);
state = device.readDevice();
result = (float)device.getTemperature(state)-1;
// convert to degs F
if (Prefs.isTempDegsF())
result = result * 9.0f/5.0f + 32f;
if (debugFlag)
System.out.println("Temperature = " + result + " degs");
// sum up all measurements for average
sum += result;
num++;
// check highs & lows
if (result > high)
high = result;
if (result < low)
low = result;
// if we're here, we must have a good measurement
// deactivate hub channel
hub.deactivateChannel(getHubChannel(), getHubPort());
return true;
}
else // device isn't there
{
Logger.log("Temperature Sensor Not Present");
}
}
catch (OneWireException e)
{
Logger.log("Error Reading Temperature: " + e);
}
// increment error count and check if we have exceeded allowed errors
38
errors++;
if (errors >= Prefs.getAllowedErrors())
{
Logger.log("Temperature Sensor Disabled");
deviceDisabled = true;
result = NO_VALUE;
}
// deactivate hub channel
hub.deactivateChannel(getHubChannel(), getHubPort());
return false;
}
public float getCurrentMeasurement()
{
return result;
}
public String getCurrentMeasurementStr()
{
return formatFloat(result, numDigits);
}
public void midnightReset()
{
// reset the highs and lows
high = -99;
low = 99;
//reset the device error count
errors = 0;
// if this is a valid device, re-enable it
if (device != null)
deviceDisabled = false;
}
}
/******************************************************************************
*
* Project Name: TiniWeatherServer
* File name: WeatherStation.java
* Version: 1.0.0
* Last Updated: 07/15/07
*
*
* This class provides the primary interface to the weather station. It
* utilizes the Pref class to provide weather station specific data such
* as device serial number (ID) and calibration values. A measurement
* of each device is performed by using the getWeather() method. Averages
* and trends of the data are stored in each device instance.
*
*****************************************************************************/
import java.util.*;
import com.dalsemi.onewire.*;
import com.dalsemi.onewire.adapter.*;
import com.dalsemi.onewire.container.*;
public class WeatherStation
{
private boolean debugFlag = TWS.debugFlag;
// primary weather station devices
protected TempDevice ts1;
protected TempDevice ts2;
protected TempDevice ts3;
protected TempDevice ts4;
protected TempDevice ts5;
protected OWDevice bs1;
private DSPortAdapter adapter1;
39
private OWHub hub;
private static float[] y;
private float lastRain = 0;
public WeatherStation()
{
if (debugFlag)
System.out.println("Initializing Weather Station");
// get an instance of the 1-Wire adapter using the prefs
if (debugFlag)
System.out.println("Initializing Weather Station");
// get an instance of the 1-Wire adapter using the prefs
try
{
// get an insrance of Tini's External 1-Wire adapter
if (TWS.IS_TINI)
adapter1 = new TINIExternalAdapter();
else
{
if (debugFlag)
System.out.println("Trying to open adapter " + Prefs.getAdapterType() +
" on port " + Prefs.getAdapterComPort());
adapter1 = OneWireAccessProvider.getAdapter(Prefs.getAdapterType(),
Prefs.getAdapterComPort());
}
if (debugFlag)
System.out.println("Found Adapter1: " + adapter1.getAdapterName());
adapter1.beginExclusive(true);
}
catch (OneWireException e)
{
Logger.log("Error: Unable to connect to 1-Wire adapter, exiting Program - "
+ e);
System.out.println("Error: Unable to connect to 1-Wire adapter, exiting
Program - " + e);
System.exit(1);
}
// get the hub
hub = new OWHub(adapter1, Prefs.getHubIDs());
// array for trend data
y = new float[3];
// create instances of the various 1-Wire devices using the identifier
// for the device from the prefs file.
ts1 = new TempDevice(adapter1, hub, "Temp_Sensor_1");
ts2 = new TempDevice(adapter1, hub, "Temp_Sensor_2");
ts3 = new TempDevice(adapter1, hub, "Temp_Sensor_3");
ts4 = new TempDevice(adapter1, hub, "Temp_Sensor_4");
ts5 = new TempDevice(adapter1, hub, "Temp_Sensor_5");
// load the appropriate class depending on the barometer type
// dewpoint is a special case
}
public void getWeather()
{
// read each sensor. The results are saved and can be retreived using
// the getCurrentMeasurement() method
ts1.read();
ts2.read();
ts3.read();
ts4.read();
ts5.read();
resetBus(adapter1);
// print the results
if (debugFlag || !TWS.IS_TINI)
{
System.out.println("Current Temp 1 = " + ts1.getCurrentMeasurement());
System.out.println("Current Temp 2 = " + ts2.getCurrentMeasurement());
40
System.out.println("Current Temp 3 = " + ts3.getCurrentMeasurement());
System.out.println("Current Temp 4 = " + ts4.getCurrentMeasurement());
System.out.println("Current Temp 5 = " + ts5.getCurrentMeasurement());
System.out.println("\n");
}
}
public void crunchData(int index)
{
// this routine should get called just before updating the web page. it
// is optimized for 10-minute intervals, but should work for any times.
// Set the history index for all devices
OWDevice.setHistoryIndex(index);
// update the wind high value
// calculate the rain rate
// update the trend data for devices that use trending
ts1.updateTrend();
ts2.updateTrend();
ts3.updateTrend();
ts4.updateTrend();
ts5.updateTrend();
}
public void updateHistories()
{
// update the history for each device
// this is done after the web page update!
ts1.updateHistory();
ts2.updateHistory();
ts3.updateHistory();
ts4.updateHistory();
ts5.updateHistory();
}
public void resetAllAverages()
{
// reset the averages for the devices
// this is also done after the web page update
ts1.resetAverages();
ts2.resetAverages();
ts3.resetAverages();
ts4.resetAverages();
ts5.resetAverages();
// reset the wind gust for this period
}
public void resetAllStats()
{
// this routine should be called at midnite to reset the highs & lows
ts1.midnightReset();
ts2.midnightReset();
ts3.midnightReset();
ts4.midnightReset();
ts5.midnightReset();
}
public void resetBus(DSPortAdapter adapter)
{
try
{
adapter.reset();
}
catch (OneWireException e)
{
Logger.log("Error Reseting 1-WIre Bus");
}
}
public void close()
{
// closes the weather station. Presently, all that needs to be done
// is to free up the 1-Wire adapter
try
{
adapter1.endExclusive();
adapter1.freePort();
Logger.log("Adapter Closed");
}
41
catch (OneWireException e)
{}
}
}
/************************************************************************
Project Name: TINIWeatherStation
File name: Charter.java
Version: 2.0
Last Updated: 07/24/07 T. Bitson
This file provides the classes to store the weather data in the
neceesary files for the charting routines. Charting is enabled
in the prefs.ini file
*************************************************************************/
import java.io.*;
import java.util.*;
public class Charter
{
private static final int NUM_FILES = 5;
private static final String[] FILENAME = {"temp.log",
"temp2.log",
"temp3.log",
"temp4.log",
"temp5.log"};
private static final char DELIM = ',';
private static final String NEWLINE = "\r\n";
private static boolean debugFlag = TWS.debugFlag;
// clears the files and creates them if they dont exist
public void reset()
{
try
{
FileOutputStream file;
// create empty files. This will clear out old data
for (int i = 0; i < NUM_FILES; i++)
{
if (debugFlag)
System.out.println("Clearing Chart Data File " + Prefs.getWebPagePath()
+ FILENAME[i]);
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[i], false);
file.close();
}
}
catch (java.io.IOException e)
{
Logger.log("Charter.init(): " + e);
}
}
// write each measurement to a log file
public void log(Date d, WeatherStation ws)
{
FileOutputStream file;
String time = convert2Time(d);;
try
{
if (debugFlag)
System.out.println("Updating Chart Data at " + time);
synchronized(TWS.lock)
{
// write the temperature & dewpoint data
42
if (ws.ts1.isAvailable())
{
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[0], true);
file.write((time + DELIM).getBytes());
file.write((ws.ts1.getCurrentMeasurementStr() + NEWLINE ).getBytes());
file.close();
}
// write temperature 2
if (ws.ts2.isAvailable())
{
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[1], true);
file.write((time + DELIM).getBytes());
file.write((ws.ts2.getCurrentMeasurementStr() + NEWLINE).getBytes());
file.close();
}
// write temperature 3
if (ws.ts3.isAvailable())
{
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[2], true);
file.write((time + DELIM).getBytes());
file.write((ws.ts3.getCurrentMeasurementStr() + NEWLINE).getBytes());
file.close();
}
// write temperature 4
if (ws.ts4.isAvailable())
{
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[3], true);
file.write((time + DELIM).getBytes());
file.write((ws.ts4.getCurrentMeasurementStr() + NEWLINE).getBytes());
file.close();
}
// write temperature 5
if (ws.ts5.isAvailable())
{
file = new FileOutputStream(Prefs.getWebPagePath() + FILENAME[4], true);
file.write((time + DELIM).getBytes());
file.write((ws.ts5.getCurrentMeasurementStr() + NEWLINE).getBytes());
file.close();
}
}
}
catch(Exception e)
{
Logger.log("Charter.log() " + e.toString());
}
}
// converts a time in millisecs to hh:mm
private String convert2Time(Date d)
{
int hour = d.getHours();
int minute = d.getMinutes();
String timeString = "";
// build hour
if (hour < 10)
timeString += "0";
timeString = timeString + Integer.toString(hour) + ":";
// build minute
if (minute < 10)
timeString += "0";
timeString = timeString + Integer.toString(minute);
return (timeString);
}
}
43
Lampiran 5. Contoh konfigurasi pada (prefs.ini)
# TiniWeatherServer Preferences File
#
# Default settings for Tini
#
Prefs_Version = 5.0
#
#
# Primary 1-Wire Adapter
Adapter_Type = DS9097U
Adapter_Com_Port = TINIExternalAdapter
#
# Hub Info
Number_Of_Hub_Channels = 0
Hub_Channel_1 = 0000000000000000
Hub_Channel_2 = 0000000000000000
Hub_Channel_3 = 0000000000000000
#
# 1-Wire Sensors - device serial number + hub channel & port
Temp_Sensor_1 = 9D000001986C7C28,0,0
Temp_Sensor_2 = F400000109860728,0,0
Temp_Sensor_3 = 500000010A003E28,0,0
Temp_Sensor_4 = 730000019871E628,0,0
Temp_Sensor_5 = 9700000198546928,0,0
Temp_Units_is_Degs_F = false
# System Settings
Errors_Before_Device_Disable = 10
Watchdog_Timer_Enable = false
Error_Logging_Enable = true
Error_Logging_Path_Name = /web/tws.log
Data_Logging_Enable = true
Mail_Logs_Enable = false
MailTo_Address = [email protected]
MailFrom_Address = [email protected]
Auto_Time_Set_Enable = true
Time_Server_Address = time.nist.gov
# Web Server Settings
Web_Server_Root_Directory = /web/
Web_Server_Default_Page = weather.xml
Web_Server_Port = 80
Web_Server_Log_Enable = false
Web_Log_Filename = /web/web.log
# Web Page Settings
Weather_Page_Path = /web/
XML_Page_Name = weather.xml
XSL_Page_Name = weather_image.xsl
Web_Counter_Start = 0
Charting_Enabled = true
# Weather Underground
WU_Posting_Enabled = false
WU_Username = username
WU_Password = password
# Beta Brite sign Settings
Enable_BetaBrite = false
BetaBrite_Port = serial4
Temperature_Hi_Red = 24
Temperature_Lo_Green = 24
Lampiran 6. Program XML (weather.xml)
<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet href="weather.xsl" type="text/xsl"?>
<xml>
<page>
<version>TWS 5.0.0c</version>
<date>8/4/07 7:20 AM</date>
<freemem>458k</freemem>
<hits>284859</hits>
<uptime> 12 Days, 10 Hours, 40 Mins</uptime>
</page>
<temperature1>
<current>78.3</current>
44
<high>82.4</high>
<low>78.2</low>
<trend>0.2</trend>
<day>2.4</day>
</temperature1>
<temperature2>
<current>-</current>
<high>-</high>
<low>-</low>
<trend>-</trend>
<day>-</day>
</temperature2>
<humidity>
<current>72.5</current>
<high>73.2</high>
<low>57.1</low>
<trend>1.3</trend>
<day>-7.4</day>
</humidity>
<dewpoint>
<current>69.0</current>
<high>69.3</high>
<low>65.9</low>
<trend>0.7</trend>
<day>-0.4</day>
</dewpoint>
<wind>
<current>0.8</current>
<direction> E </direction>
<high>4.9</high>
<peak>1.2</peak>
<trend>0.0</trend>
<day>-0.2</day>
</wind>
<pressure>
<current>30.03</current>
<high>30.03</high>
<low>29.98</low>
<trend>0.04</trend>
<day>0.01</day>
</pressure>
<rain>
<ytd>7.00</ytd>
<midnite>0.00</midnite>
<rate>0.00</rate>
<day>0.00</day>
</rain>
<lightning>
<current>0.0</current>
<high>1.0</high>
<trend>0.0</trend>
<day>-0.0</day>
</lightning>
</xml>
45
Lampiran 7. Program PHP (index.php) untuk mengambil data dari mikrokontroller ke PC Server
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Get Temperature Data by agrdsn</title>
<link rel="stylesheet" href="style.css" type="text/css" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="./jquery-1.3.2.min.js"></script>
<script language="javascript">
function get_data() {
$('#ambil_data').html('<small>Mohon tunggu... Sedang mengambil data
dan menyimpan ke dalam database MySQL. <a
href="http://localhost/tini/ajax/" style="color:red;text-
underline:none;">stop</a></small></smal><p><img src="./ajax-
loader.gif" width="220" height="19" /></p>');
setTimeout('getTemp()', 1000);
}
function getTemp() {
$("#random").show("slow").fadeIn();
$("#random").load("getTemp.php", '',callback);
}
function callback() {
$("#random").show("slow");
setTimeout("getTemp();", 1000*2);
}
//$(document).ready(getTemp);
</script>
</head>
<body>
<!-- division of page -->
<div id="page">
<h3>Get Temperature Data</h3>
<?php include_once "date.php"; ?>
<hr>
<!-- division of the left -->
<div id="left">
<?php
/* show the svg chart
$doc = new DOMDocument();
$doc->loadHTML('<html><body><embed
src="../charts/svg_chart2/chart.svg" width="600"
height="450" type="image/svg+xml" /></body></html>');
echo $doc->saveHTML();*/
include_once('./table.php');
?>
</div>
<!-- division of right -->
<div id="right"> <?php include_once('prosedur.php'); ?>
<div id="random"></div>
<div id="ambil_data">
<p>Mulai ambil data :
<input type="button"
onclick="get_data()" value="Get Data!" /></p>
</div>
</div>
<!-- division of bottom -->
<div id="bottom">
Copyright ©2009 agung.ridwan.sn <br />
Best Viewed on Mozilla Firefox
</div>
</div>
</body>
</html>
46
Lampiran 8. Program PHP (table.php) untuk menampilkan tabel temperatur
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en-us" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<title>Temperature Data</title>
<link rel="stylesheet" href="table-sorter/jq.css" type="text/css" media="print,
projection, screen">
<link rel="stylesheet" href="table-sorter/style.css" type="text/css" media="print,
projection, screen">
<script type="text/javascript" src="table-sorter/jquery-latest.js"></script>
<script type="text/javascript" src="table-sorter/jquery.js"></script>
<script type="text/javascript" src="table-sorter/chili-1.js"></script>
<script type="text/javascript" src="table-sorter/docs.js"></script>
<script type="text/javascript">
$(function() {
$("#tablesorter-demo").tablesorter({sortList: [[0,0]], widgets:['zebra']});
});
</script>
</head>
<body>
<?php
include_once 'dbkoneksi.php';
//4. Definisikan query
$sql = "SELECT `datetime`, `temp1`, `temp2`, `temp3`, `temp4`, `temp5` FROM `log`
ORDER BY `id` DESC";
//5. Eksekusi query dan hasil disimpan dalam object resultset
// resultset : object dari kumpulan data2 hasil query yang berbentuk table
$result = mysql_query($sql,$koneksi) or die (mysql_error().' :Query Gagal'.$sql);
$juduls = array("No.","Date","Temp 1","Temp 2","Temp 3","Temp 4","Temp 5");
?>
<table id="tablesorter-demo" class="tablesorter" border="0" cellpadding="0"
cellspacing="1">
<thead>
<tr>
<?php
foreach($juduls as $j)
{
echo '<th class="header">'.$j.'</th>';
}
?>
</tr>
</thead>
<tbody>
<?php
//6. Populasi/tampilkan data
$counter = 1;
while ($row = mysql_fetch_array($result))
{
if(!counter%2){
echo '<tr class="even"><td>'.$counter.'</td>';
echo '<td>'.$row['datetime'].'</td>';
echo '<td>'.$row['temp1'].'</td>';
echo '<td>'.$row['temp2'].'</td>';
echo '<td>'.$row['temp3'].'</td>';
echo '<td>'.$row['temp4'].'</td>';
echo '<td>'.$row['temp5'].'</td></tr>';
}else{
echo '<tr class="odd"><td>'.$counter.'</td>';
echo '<td>'.$row['datetime'].'</td>';
echo '<td>'.$row['temp1'].'</td>';
echo '<td>'.$row['temp2'].'</td>';
echo '<td>'.$row['temp3'].'</td>';
47
echo '<td>'.$row['temp4'].'</td>';
echo '<td>'.$row['temp5'].'</td></tr>';
$counter++;
}
}
?>
</tbody>
</table>
</body>
Lampiran 9. Program PHP (dbkoneksi.php) untuk menghubungkan ke Database MySQL
<?php
//1. Definisikan variable koneksi database
define('DBSERVER','localhost');
define('DBUSER','root');
define('DBPASS','yourpassword');
define('DBNAME','tws');
//2. Lakukan koneksi ke database server
$koneksi = mysql_connect(DBSERVER,DBUSER,DBPASS);
if ($koneksi) //bernilai false jika gagal
{
// echo '<h1>Koneksi berhasil ..</h1>';
}
else
{
echo '<h1>Koneksi gagal ..</h1>';
}
//3. Akses basis data
if (mysql_select_db(DBNAME,$koneksi))
{
// echo '<h1>Basis data '.DBNAME.' ditemukan!</h1>';
}
else {
echo '<h1>Basis data '.DBNAME.' tidak ditemukan!</h1>';
}
?>
Lampiran 10. Program PHP (logsaver.php) untuk menyimpan data temperatur <html>
<head>
<title>Get Temperature with SimpleXML</title>
</head>
<body>
<?php
// alamat DSTINIm400: 192.168.1.3
$url = fopen ("http://192.168.1.3/", "r");
if (!$url) {
echo "<br><h2>Failed to open file.</h2>";
echo "Please check your connectivity.";
exit;
}
else {
$xml = simplexml_load_file("http://192.168.1.3");
foreach($xml->temperature1 as $temp1) {
echo "T1 = ".$temp1->current.". MAC: 9D000001986C7C28.<br />";
}
foreach($xml->temperature2 as $temp2) {
echo "T2 = ".$temp2->current.". MAC: F400000109860728.<br />";
}
foreach($xml->temperature3 as $temp3) {
echo "T3 = ".$temp3->current.". MAC: 500000010A003E28.<br />";
}
foreach($xml->temperature4 as $temp4) {//diganti dr 65000001096B3A28 -
>4A00000198812628
48
echo "T4 = ".$temp4->current.". MAC: 730000019871E628.<br />";
}
foreach($xml->temperature5 as $temp5) {
echo "T5 = ".$temp5->current.". MAC: 9700000198546928.<br />";
}
foreach($xml->page as $tgl) {
echo "Date taken at ".$tgl->date.".<br />";
}
// Some add files
// Insert log to database
mysql_connect('localhost', 'root', 'yourpassword')
or die("Could not connect : " . mysql_error());
mysql_select_db('tws')
or die("Could not select database");
//$data = get_data("SELECT `datetime`, `temp1`, `temp2`, `temp3`, `temp4` FROM
`log` ORDER BY `datetime` DESC LIMIT 0,10");
//print_result($data);
$last_time = $data[0]['datetime'];
//var_dump($last_time);
//temporary
$t1 = $temp1->current;
$t2 = $temp2->current;
$t3 = $temp3->current;
$t4 = $temp4->current;
$t5 = $temp5->current;
$tg = $tgl->date;
/*
// Get current date and temp from XML
$currents = array($t1,$t2,$t3,$t4);
foreach($currents as $value) {
if ($value['tag']=='DATE' or $value['tag']=='CURRENT') $currents[] =
$value['value'];
} */
$datetime = tini2mysql_datetime($tg);
//var_dump($currents);
if (strcmp($last_time, $datetime) < 0) {
put_data("INSERT INTO `log` (`datetime`, `temp1`, `temp2`, `temp3`, `temp4`,
`temp5`)
VALUES ('$datetime', '$t1', '$t2', '$t3', '$t4', '$t5')");
}
/*
echo "t1 = ".$t1."<br>";
echo "t2 = ".$t2."<br>";
echo "t3 = ".$t3."<br>";
echo "t4 = ".$t4."<br>";
echo "tg = ".$tg."<br>";
*/
}
// Convert datetime to MySQL format
function tini2mysql_datetime($tini_datetime) {
$datetime = explode(' ', $tini_datetime);
$date = $datetime[0];
for ($i=1; $i<count($datetime); $i++) {
if ($datetime[$i] != '') {
$time = $datetime[$i];
break;
}
}
$ampm = $datetime[$i+1];
$date = explode('/', $date);
if ($date[0]<10) $date[0] = '0'.$date[0];
if ($date[1]<10) $date[1] = '0'.$date[1];
$date = '2'.$date[2].'-'.$date[1].'-'.$date[0];
$time = explode(':', $time);
if ($ampm == 'PM') $time[0] = $time[0] + 12;
if ($time[0]<10) $time[0] = '0'.$time[0];
49
$sec = date("s");
$time = $time[0].':'.$time[1].':'.$sec;
return $date.' '.$time;
}
function put_data($query) {
return mysql_query($query) or die('Error ' . substr($query,0,6) . ': ' .
mysql_error());
}
?>
Lampiran 11. Stylesheet CSS (style.css) /* CSS Document */
#page{
margin:0px auto;
width:950px;
border: 1px solid gray;
}
#page #atas{
text-align: center;
font-family: helvetica;
}
#page #left{
width: 600px;
height: 100%;
float:left;
background-color: white;
padding-left: 2em;
}
#page #right{
width: 300px;
height: 1000px;
float: right;
background-color: #ecf3fb;
border-left: 1px solid gray;
}
#page #right #ambil_data{
padding-left: 20px;
background-color: green;
color: white;
font-style: bold;
}
#page #right #random{
font-size:10pt;
}
#page #bottom{
clear: both; /*biar muncul di Firefox*/
background-color: gray;
text-align: center;
font-size: 10pt;
font-family: helvetica;
height: 40px;
color: white;
overflow: auto; /*kalau di firefox,bisa turun.tapi IE+opera kagak.f(x):bisa
tambahin scroll*/
}
50
Lampiran 12. SQL Struktur data tws table log
-- Host: localhost
-- Waktu pembuatan: 25. Juni 2010 jam 11:30
-- Versi Server: 5.0.51
-- Versi PHP: 5.2.5
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";# MySQL balikkan hasil kosong (a.k. baris
yang kosong).
--
-- Database: `tws`
--
CREATE DATABASE tws2;
USE tws2;
--
-- Struktur dari tabel `log`
--
CREATE TABLE IF NOT EXISTS `log` (
`id` int(11) NOT NULL auto_increment,
`datetime` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
`temp1` float NOT NULL,
`temp2` float NOT NULL,
`temp3` float NOT NULL,
`temp4` float NOT NULL,
`temp5` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=543 ;
--
-- Struktur dari tabel `log`
--
CREATE TABLE IF NOT EXISTS `log` (
`id` int(11) NOT NULL auto_increment,
`datetime` timestamp NOT NULL default CURRENT_TIMESTAMP on update
CURRENT_TIMESTAMP,
`temp1` float NOT NULL,
`temp2` float NOT NULL,
`temp3` float NOT NULL,
`temp4` float NOT NULL,
`temp5` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=543 ;