Membaca dan Merekam Data dari Sensor Pendahuluan Pada bagian ini akan dibahas mengenai contoh akuisisi data secara real time dari sensor yang terhubung dengan komputer melalui jalur USB. Pada contoh kasus ini digunakan sensor DHT11 yang akan mengirimkan data suhu dan kelembaban udara (RH) secara berkala. Data yang dikirim kemudian akan dibaca dan disimpan menggunakan program visual basic dan selanjutnya data akan ditampilkan dalam bentuk grafik untuk visualisasi. Skema Rangkaian Gambar 1 menunjukkan skema rangkaian sensor DHT11 yang terhubung dengan mikrokontroler Arduino Uno. Sensor ini memiliki 4 pin/kaki yaitu Vcc, Data‐signal, GND1, dan GND2. Pin Vcc dihubungkan dengan sumber tegangan 3.3 Volt, pin GND1 dan GND2 dihubungkan dengan ground, dan pin Data‐signal dihubungkan pada digital pin yang akan kita gunakan untuk membaca data dari sensor. Selanjutnya mikrokontroler Arduino akan terhubung dan berkomunikasi dengan komputer melalui jalur USB.
Gambar 1. Skema rangkaian untuk pembacaan sensor DHT11. 1
Program pada mikrokontroler Arduino Berikut ini adalah list program pada mikrokontroler Arduino. Untuk sensor DHT11 ini telah tersedia library program DHT11.h. Sebagaimana ditunjukkan pada skema rangkaian pada Gambar X, pada contoh ini digunakan pin digital 4 untuk pembacaan data. Untuk update pembacaan data dilakukan setiap 3 detik. Untuk mengubahnya bisa dilakukan dengan mengubah nilai variable ‘update_time’sesuai dengan interval yang diinginkan (dalam millisecond). /* Program pembacaan suhu dan RH dengan sensor DHT11 */ #include int pin=4; DHT11 dht11(pin); long cur_time, time0; int update_time=3000; float cur_Temp, cur_RH; void setup(){ Serial.begin(9600); cur_time=millis(); time0=millis(); } void loop(){ int err; float temp, humi; while ((millis()-cur_time)< update_time){ if((err=dht11.read(humi, temp))==0){ cur_Temp=temp; cur_RH=humi; } delay(DHT11_RETRY_DELAY); //delay for reread } // Update Sensor Data: Serial.print(millis()-time0); Serial.print(","); Serial.print(cur_Temp); Serial.print(","); Serial.print(cur_RH); Serial.println(); cur_time=millis(); } 2
Program Visual Basic pembacaan dan perekaman data dari sensor Pemrograman dengan Visual Basic diawali dengan membuat desain layout tampilan seperti pada Gambar 2 untuk menampilkan data hasil pembacaan dari sensor DHT11 yang dikirim dalam format text. Tampilan antarmuka terdiri dari TextBox untuk menampilkan data Kelembaban dan Suhu , sebuah tombol CommandButton untuk mengakhiri program, dan MsChart untuk menampilkan grafik secara real time.
Gambar 2. Desain layout untuk menampilkan data pembacaan sensor Langkah selanjutnya adalah penulisa kode program sesuai kebutuhan fungsional tampilan. Pada saat program dijalankan VB akan mengaktifkan jalur komunikasi serial melalui Port Comm 4 dengan perintah sebagai berikut :
Private Sub Form_Load() With MSComm1 If .PortOpen Then .PortOpen = False .CommPort = 4 .Settings = "9600,N,8,1" .DTREnable = True .RTSEnable = True .RThreshold = 1 .SThreshold = 0 .PortOpen = True End With With Text1 .BackColor = vbWhite .Locked = True .Text = "" End With End Sub
3
Selanjutnya diperlukan perintah untuk membaca data dari file dengan nama “dataku.txt” dan menampilkannya dalam bentuk grafik dengan kode program berikut : Private Sub MSComm1_OnComm() Dim strInput As String Dim str() As String Dim nfile As String Static strBuffer As String Dim boComplete As Boolean Dim intPos As Integer Dim t(1000), h(1000), s(1000), jr, j '------------Membaca data untuk grafik---------------------jr = 0 Open App.Path + "\dataku.txt" For Input As #1 Do Until EOF(1) jr = jr + 1 Input #1, t(jr), h(jr), s(jr) Loop Close #1 '-------------Menampilkan Grafik----------------------------Grafik.Visible = True With Grafik .Refresh .RowCount = jr .ColumnCount = 2 For j = 1 To jr .Row = j: .RowLabel = "" .Column = 1: .Data = h(j): .ColumnLabel = "Kelembaban" .Column = 2: .Data = s(j): .ColumnLabel = "Suhu" Next j End With Open App.Path + "\dataku.txt" For Append As #3 With MSComm1 '-----------------test data masuk--------------Select Case .CommEvent Case comEvReceive ' Pembacaan data ' Terima dan tambahkan ke buffer strInput = .Input strBuffer = strBuffer & strInput Do ' Pengecekan apakah input ke buffer sudah lengkap ' NOTE: pengirim data berhenti tiap ada code Carriage Return intPos = InStr(strBuffer, vbCrLf) If intPos <> 0 Then
4
' Rekord data lengkap ' Ekstrak data ke buffer strInput = Mid$(strBuffer, 1, intPos - 1) str = Split(strInput, ",") Text1.Text = CInt((Val(str(0) - 521) / 1000)) Text2.Text = str(1) Text3.Text = str(2) Write #3, Val(Text1.Text), Val(Text2.Text),Val(Text3.Text) ' Pengecekan keberadaan data lain di buffer If intPos + 1 < Len(strBuffer) Then ' Pengiriman data ke awal buffer ' kembali ke looping strBuffer = Mid(strBuffer, intPos + 2) Else ' tidak ada data di buffer ' selesai strBuffer = "" boComplete = True End If Else ' Pembacaan rekord selesai ' Keluar boComplete = True End If Loop Until boComplete = True End Select End With 'MSComm1 Close #3 End Sub
Perintah untuk menghentikan program yang tersimpan pada tombol dengan tulisan STOP. Private Sub Save_Click() End End Sub
5
Perintah penambahan data bila TextBox penampil suhu nilainya berubah.
Private Sub Textbox1_Change() If InStr(Textbox1.Text, Chr(42)) = 0 Then Open "dataku.txt" For Append As #1 Print #1, Textbox1.Text Close #1 Else End If End Sub Setelah seluruh kode program selesai diketik selanjutnya adalah menjalankan program untuk mengetahui apakah desain layout telah sesuai dengan rancangan tampilan yang diharapkan. Gambar 3 menunjukkan tampilan program pada saat dijalankan.
Gambar 3. Tampilan program pada saat berjalan (Running mode)
6
Mengirim Perintah dari Komputer ke Aktuator Pendahuluan Pada bagian ini akan dibahas mengenai komunikasi computer dengan perangkat (device) lain. Dalam contoh kasus ini, komputer akan dihubungkan dengan Mikrokontroler Arduino Uno dan beberapa LED. Komputer akan mengirimkan perintah sehingga dapat mengatur penyalaan LED sesuai dengan pola‐pola tertentu yang telah ditetapkan sebelumnya. Skema Rangkaian Gambar 4 menunjukkan rangkaian yang digunakan dalam contoh ini. Tiga buah LED (kuning, hijau dan merah) dihubungkan dengan pin digital (2,3, dan 4) sebagai output. Untuk membatasi arus bisa ditambahkan resistor 220 – 330 ohm. Perlu dipastikan bahwa polaritas (positif dan negatif) dari LED tidak terbalik. Selanjutnya mikrokontroler Arduino akan terhubung dan berkomunikasi dengan komputer melalui jalur USB.
Gambar 4. Skema rangkaian penyalaan LED sesuai perintah dari komputer. 7
Program pada mikrokontroler Arduino Pada contoh ini, Mikrokontroler Arduino diprogram agar ketika menerima perintah dari computer, maka Arduino akan mengatur penyalaan LED sesuai dengan pola yang telah ditetapkan sebalumnya. Ada 6 (enam) nilai input dan pola penyalaan LED yang digunakan dalam contoh ini sebagaimana ditunjukkan dalam Tabel XI. Tabel 1. Input dan pola penyalaan LED Input ‘1’ – (angka 1) ‘2’ – (angka 1) ‘3’ – (angka 1) ‘4’ – (angka 1) ‘5’ – (angka 1)
Pola penyalaan LED LED merah ON; LED lainnya OFF LED merah ON; LED lainnya OFF LED merah ON; LED lainnya OFF Semua LED ON Semua LED ON dan OFF secara serentak dalam interval tertentu (berkedip atau blinking) Semua LED OFF
Karakter lain Berikut ini list program yang digunakan pada mikrokontroler Arduino.
/* Program Penyalaan LED berdasarkan perintah dari Komputer */ int led_Red = 4; int led_Green = 3; int led_Yellow = 2; void setup(){ Serial.begin(9600); pinMode (led_Red, OUTPUT); pinMode (led_Green, OUTPUT); pinMode (led_Yellow, OUTPUT); } void loop(){ while (Serial.available() == 0); int command = Serial.read()-'0'; switch (command){ case 1 : //Input ‘1’ --> Red LED ON while (Serial.available() == 0) { digitalWrite(led_Red,HIGH); } digitalWrite(led_Red,LOW); break; 8
case 2 :
// Input ‘2’ --> Green LED ON while (Serial.available() == 0) { digitalWrite(led_Green,HIGH); } digitalWrite(led_Green,LOW); break;
case 3 :
// Input ‘3’ --> Yellow LED ON while (Serial.available() == 0) { digitalWrite(led_Yellow,HIGH); } digitalWrite(led_Yellow,LOW); break;
case 4 :
// Input ‘4’ --> All LED ON while (Serial.available() == 0) { digitalWrite(led_Red,HIGH); digitalWrite(led_Green,HIGH); digitalWrite(led_Yellow,HIGH); } digitalWrite(led_Red,LOW); digitalWrite(led_Green,LOW); digitalWrite(led_Yellow,LOW); break;
case 5 :
//Input ‘5’ -->Yellow LED Blinking Blinking_LED(); break;
default : // for other Input --> All LED Off digitalWrite(led_Red,LOW); digitalWrite(led_Yellow,LOW); digitalWrite(led_Green,LOW); command = 0; } } void Blinking_LED() { while (Serial.available() == 0) { digitalWrite(led_Red,HIGH); digitalWrite(led_Green,HIGH); digitalWrite(led_Yellow,HIGH); delay (100); digitalWrite(led_Red,LOW); 9
digitalWrite(led_Green,LOW); digitalWrite(led_Yellow,LOW); delay(100); } digitalWrite(led_Red,LOW); digitalWrite(led_Yellow,LOW); digitalWrite(led_Green,LOW); return; }
Program Visual Basic pembacaan data dari sensor Pemrograman dengan Visual Basic diawali dengan membuat desain layout tampilan kontrol aktuator seperti pada Gambar 5. Combo Box digunakan untuk memilih jalur komunikasi yang digunakan oleh program VB sesuai dengan jalur komunikasi yang aktif pada Arduino. Beberapa tombol lain disediakan untuk mengaktifkan aktuator yang terhubung dengan 3 buah lampu LED. Sebuah tombol dengan tulisan CLOSE disediakan untuk menutup komunikasi, dan tombol dengan tulisan SELESAI digunakan untuk mengakhiri program.
Gambar 5. Desain layout untuk tampilan komunikasi kontrol aktuator Langkah awal saat program dijalankan adalah pencarian jalur komunikasi serial yang tersedia. Perintah untuk mencari dan menghubungkan jalur komunikasi serial adalah sebagai berikut : 10
' -----------------Mencari Port COM yang aktif------------- Dim InBuffStr As String Dim flagBlink As Boolean Private Sub Form_Load() For i = 1 To 40 On Error Resume Next MSComm1.CommPort = i On Error Resume Next MSComm1.PortOpen = True On Error Resume Next MSComm1.PortOpen = False If Err.Number = 0 Then cmbComPort.AddItem ("COM" + Str(i)) End If Next i With MSComm1 .Handshaking = comNone .InputMode = 0 .InputLen = 0 .RThreshold = 1 .RTSEnable = False .Settings = "9600,n,8,1" .SThreshold = 1 .PortOpen = False End With For i = 0 To 5 lblLED(i).BackColor = vbWhite Next i MSComm1.Output = "*" disableButton End Sub Private Sub MSComm1_OnComm() Dim InBuff As String Select Case MSComm1.CommEvent Case comEvReceive ' Menerima RThreshold # char. End Select End Sub 11
'-------------Membuka koneksi ke PORT : COM-------------- Private Sub cmdOpenCom_Click() PortNum = Val(Mid$(cmbComPort.Text, 4)) If cmdOpenCom.Caption = "OPEN" Then If PortNum > 0 Then MSComm1.CommPort = PortNum MSComm1.PortOpen = True cmdOpenCom.Caption = "CLOSE" enableButton End If Else If cmdOpenCom.Caption = "CLOSE" Then MSComm1.PortOpen = False cmdOpenCom.Caption = "OPEN" disableButton End If End If End Sub ' -----------------Tombol SELESAI Private Sub Command1_Click() Call cmdLED_Click(5) End End Sub Kode program untuk mengatur fungsi masing‐masing tombol kontrol adalah sebagai berikut : '--------------- Me-Nonaktifkan semua tombol lampu Public Sub disableButton() For i = 0 To 5 cmdLED(i).Enabled = False Next i End Sub '--------------- Mengaktifkan semua tombol lampu Public Sub disableButton() For i = 0 To 5 cmdLED(i).Enabled = True Next i End Sub 12
‘------------Tombol pengatur nyala lampu LED-------------- Private Sub cmdLED_Click(Index As Integer) Dim x MSComm1.Output = Str(Index + 1) If Index = 0 Then 'Bila tombol merah ditekan lblLED(0).BackColor = vbRed lblLED(1).BackColor = vbWhite lblLED(2).BackColor = vbWhite End If 'Bila tombol hijau ditekan If Index = 1 Then lblLED(0).BackColor = vbWhite lblLED(1).BackColor = vbGreen lblLED(2).BackColor = vbWhite End If 'Bila tombol kuning ditekan If Index = 2 Then lblLED(0).BackColor = vbWhite lblLED(1).BackColor = vbWhite lblLED(2).BackColor = vbYellow End If If Index = 3 Then 'Bila semua LED dinyalakan lblLED(0).BackColor = vbRed lblLED(1).BackColor = vbGreen lblLED(2).BackColor = vbYellow End If 'Bila Semua LED berkedip If Index = 4 Then lblLED(0).BackColor = vbRed lblLED(1).BackColor = vbGreen lblLED(2).BackColor = vbYellow End If If Index = 5 Then 'Bila semua LED dimatikan lblLED(0).BackColor = vbWhite lblLED(1).BackColor = vbWhite lblLED(2).BackColor = vbWhite End If End Sub Gambar 6 menunjukkan tampilan program pada saat dijalankan. Gambar 6(a) menunjukkan tampilan pada saat tombol “LED 2” (lampu hijau) diaktifkan, sedangkan Gambar 6(b) menunjukkan tampilan pada saat tombol “Semua Menyala” diaktifkan. Tampilan pada antar muka VB menampilkan kondisi nyata status lampu LED yang terhubung dengan Arduino (kecuali tampilan pada menu “Semua Berkedip”). 13
(a)
(b) Gambar 6. Tampilan antar muka kontrol lampu LED pada mode berjalan.
14