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.
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 <DHT11.h>
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(); }
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
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
Perintah untuk menghentikan program yang tersimpan pada tombol dengan
tulisan STOP.
Private Sub Save_Click()
End End Sub
' 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 penambahan data bila TextBox penampil suhu nilainya berubah.
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)
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
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.
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
Pola
penyalaan
LED
‘1’
–
(angka
1)
LED
merah
ON;
LED
lainnya
OFF
‘2’
–
(angka
1)
LED
merah
ON;
LED
lainnya
OFF
‘3’
–
(angka
1)
LED
merah
ON;
LED
lainnya
OFF
‘4’
–
(angka
1)
Semua
LED
ON
‘5’
–
(angka
1)
Semua
LED
ON
dan
OFF
secara
serentak
dalam
interval
tertentu
(berkedip
atau
blinking
)
Karakter
lain
Semua
LED
OFF
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;
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);
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 :
' ---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
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
'---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
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”).
‘---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
If Index = 1 Then 'Bila tombol hijau ditekan
lblLED(0).BackColor = vbWhite lblLED(1).BackColor = vbGreen lblLED(2).BackColor = vbWhite End If
If Index = 2 Then 'Bila tombol kuning ditekan
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
If Index = 4 Then 'Bila Semua LED berkedip
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
(a) (b)
Gambar 6. Tampilan antar muka kontrol lampu LED pada mode berjalan.