Teknik Elektro LinksBarrier-Gate & Turnstile Interface, Thermostat, Relay Driver, Microcontroler Board

Contoh Program Membaca Data Suhu Dari Port USB, Menampilkan Grafik Suhu, Mengontrol Buzzer Dan TRIAC

Pada kesempatan ini saya akan memberikan contoh program untuk membaca data suhu dari port USB dan menampilkannya dalam bentuk grafik dua-dimensi. Program ini saya buat menggunakan Lazarus versi 1.6 dengan kompiler bahasa Pascal (FreePascal) versi 3.0.0. Komputer yang saya gunakan pada eksperimen ini adalah netbook dengan prosesor Intel Atom 1,67GHz dengan sistem operasi Windows 7 Starter 32-bit. Dan modul USB yang saya gunakan adalah USB-TC101.

Nah, berikut ini adalah gambar tampilan dari program yang akan kita bahas dalam tulisan ini.

Program USB-TC101 Pascal

Cerita singkatnya begini, dengan menggunakan komponen TIMER, program secara periodik membaca data suhu dari modul USB-TC101. Kemudian menampilkan datanya pada label (tertampil 62.5 pada gambar) dan menambahkan data suhu pada grafik. Button Buzzer dan TRIAC digunakan untuk mengontrol (ON/OFF) output Buzzer dan TRIAC.

Tapi sebelum membahas programnya, ada baiknya kita berkenalan dulu dengan modul antarmuka USB-TC101.

Modul Antarmuka USB-TC101

USBINOV USB-TC101USB-TC101 adalah modul antarmuka USB yang memiliki sebuah input sensor suhu dan dua buah output berupa buzzer dan SSR (Solid-State Relay). Sensor suhu yang digunakan adalah DS18B20. Solid-State Relay dibangung menggunakan komponen TRIAC. SSR ini dapat digunakan untuk menggerakkan beban pemanas, baik pemanas berupa elemen pemanas maupun lampu pijar.

Dengan adanya output berupa buzzer dan TRIAC yang dapat dikontrol dari komputer, maka selain dapat digunakan untuk aplikasi monitoring suhu, modul USB-TC101 juga dapat diaplikasikan pada sistem alarm suhu dan sistem kontroler suhu berbasis PC atau MiniPC seperti Raspberry Pi.

Informasi yang lebih lengkap mengenai modul USB-TC101 dapat dibaca pada tabel spesifikasi berikut ini.

Spesifikasi USB-TC101

Tegangan Kerja DC 5V (USB Powered – tidak perlu catudaya eksternal)
Jumlah Output 2 buah
Tipe Output TRIAC dan BUZZER
Mikrokontroler ATtiny85
Driver TRIAC MOC3021
LED Indikator Power On, Relay On
Watchdog Timer 120ms
Sistem Operasi Windows, Linux, Raspberry Pi
Software Driver libusb
Command-Line Interface usbtc101c.exe, usbtc101c

Modul USB-TC101 dilengkapi dengan program Command-Line Interface (CLI) yang tersedia untuk tiga platform yakni Windows, Linux dan Linux-ARM (Raspberry Pi).

Program Demo USB-TC101

Untuk mengakses modul USB-TC101, diperlukan paket program LIBUSB-Win32. Paket ini menyediakan driver LIBUSB versi Windows. Driver LIBUSB harus terinstalasi agar modul USB dapat dikenali dan dapat bekerja pada sistem operasi Windows.

Paket LIBUSB-Win32 juga dilengkapi dengan file header (.h) dan file library (.lib) yang siap digunakan dengan bahasa pemrograman C. Untuk pemrograman bahasa Pascal, diperlukan unit binding LIBUSB.PAS, yakni unit yang menjembatani kode program FreePascal dengan library libusb (libusb0.dll).

Unit ini saya peroleh dari sebuah forum berbahasa Jerman. Saya tidak mengerti apa yang tertulis pada forum tersebut, tapi yang terpenting adalah unit tersebut berhasil saya kompilasi menggunakan FreePascal dan berhasil pula saya aplikasikan pada modul-modul USB yang saya buat (modul-modul USB selengkapnya di www.usbinov.com). Kode program LIBUSB.PAS tidak saya tampilkan di sini karena lumayan panjang. File ini saya sertakan dalam paket file unduhan yang terkompresi.

Skenario Program

Kita mulai dari bagian awal program. Ketika program dijalankan, program akan mendeteksi apakah modul USB-TC101 tertancap di salah satu port USB dan telah dikenali oleh sistem operasi ataukah tidak. Bagian program ini terletak pada event OnCreate seperti ditunjukkan pada penggalan kode program berikut ini.

procedure TForm1.FormCreate(Sender: TObject);
var
 nbyte: integer;
begin
 //get usbtc101 handle
 USBTC101_Device:= USBFindDevice(5824, 1500);
 if pUSB_Device(USBTC101_Device)=nil then
 begin
 ShowMessage('USB-TC101 device cannot be found.');
 SendMessage(Form1.Handle, WM_CLOSE, 0, 0);
 Exit;
 end;

 //try to open the device
 try
 USBTC101_Handle:= usb_open(USBTC101_Device);
 except
 ShowMessage('Fail opening USB-TC101 device.');
 SendMessage(Form1.Handle, WM_CLOSE, 0, 0);
 Exit;
 end;

 //check the id
 nbyte:= usb_control_msg(USBTC101_Handle, $C0, 0, 0, 0, buffer, sizeof(buffer), 5000);
 if buffer<>'USBTC101-016' then
 begin
 ShowMessage('Wrong device.'#13#10'Contact www.usbinov.com.'#13#10'Thank you.');
 SendMessage(Form1.Handle, WM_CLOSE, 0, 0);
 Exit;
 end;

 X:= 0;
 Timer1.Enabled:= True;
 Label1.Caption:= 'Temperature (°C)';
end;

Jika fungsi USBFindDevice berhasil mendeteksi modul, maka program akan mencoba membuka koneksi dengan modul untuk mendapatkan handle dari modul USB-TC101. Jika gagal mendeteksi atau gagal membuka modul USB-TC101, maka program akan menampilkan pesan kesalahan dan mengakhiri program dengan mengirimkan pesan WM_CLOSE kepada handle aplikasi, yakni Form1.Handle. Jika berhasil, program akan membaca ID dari modul USB-TC101 dan melakukan otentikasi. Dan jika otentikasi berhasil, maka program akan mengaktifkan Timer1.

ID Unik Sebagai Pengaman Aplikasi

Setiap modul buatan USBINOV memiliki ID yang unik (berbeda). Pada eksperimen ini, saya menggunakan modul USB-TC101 dengan ID = “USBTC101-016″. ID unik yang dimiliki masing-masing modul USB dapat digunakan untuk fungsi otentikasi. Dengan melakukan otentikasi ID modul, maka program hanya bekerja jika digunakan dengan modul yang cocok ID-nya. Dengan demikian, aplikasi yang kita buat akan lebih aman dari pembajakan, karena meskipun program dapat digandakan dengan mudah dan modul USB dapat diorder, tapi karena ID-nya berbeda, maka program aplikasi tidak akan bekerja.

Membaca, Menampilkan dan Menggambar Grafik Suhu

Timer1 bekerja pada interval 1000ms atau 1 detik. Setiap 1 detik, program akan mengeksekusi kode program pada event OnTimer dari Timer1. Kode programnya adalah sebagai berikut.

procedure TForm1.Timer1Timer(Sender: TObject);
var
 nbyte: integer;
begin
 nbyte:= usb_control_msg(USBTC101_Handle, $C0, 1, 0, 0, buffer, sizeof(buffer), 5000);
 if nbyte<0 then
 begin
 Timer1.Enabled:= False;
 ShowMessage('Error reading temperature from USB-TC101.');
 usb_close(USBTC101_Handle);
 SendMessage(Form1.Handle, WM_CLOSE, 0, 0);
 Exit;
 end
 else begin
 lbSuhu.Caption:= buffer;
 X:= X + 1;
 if X>300 then
 begin
 chartSuhu.Clear;
 X:= 0;
 end;
 chartSuhu.AddXY(X, StrToFloat(buffer));
 end;
end;

Untuk membaca data suhu digunakan perintah:

nbyte:= usb_control_msg(USBTC101_Handle, $C0, 1, 0, 0, buffer, sizeof(buffer), 5000);

Jika perintah ini berhasil, maka variabel buffer akan berisi data berupa string dan variabel nbyte akan berisi nilai panjang atau jumlah karakter dari yang disimpan dalam variabel buffer. Jika nbyte bernilai kurang-dari nol, maka berarti fungsi telah gagal membaca data suhu dari modul USB-TC101 dan program pun akan diakhiri. Kegagalan proses pembacaan bisa disebabkan karena modul dilepas atau ada gangguan komunikasi.

Data suhu yang diterima dari modul USB-TC101 ditampilkan pada label dengan ukuran karakter yang besar dan pada grafik, perintahnya adalah sebagai berikut.

lbSuhu.Caption:= buffer;
 X:= X + 1;
 if X>300 then
 begin
 chartSuhu.Clear;
 X:= 0;
 end;
 chartSuhu.AddXY(X, StrToFloat(buffer));

Karena sumbu X grafik memiliki batasan nilai 300, maka dilakukan pengecekan terhadap nilai variabel X. Jika X melebihi 300, maka dilakukan proses penghapusan gambar grafik dan penggambaran dimulai lagi dari X=0. Penggambaran grafik dilakukan dengan perintah sebagai berikut.

chartSuhu.AddXY(X, StrToFloat(buffer));

Perlu Diperhatikan

Untuk mengubah data suhu dari tipe string menjadi tipe real (float), digunakan fungsi StrToFloat. Fungsi ini menggunakan notasi titik (.) sebagai penanda desimal, bukan koma (,). Jadi jika setingan regional dan format angka pada sistem operasi menggunakan koma (,) sebagai tanda bilangan desimal, maka perlu dilakukan pengubahan setingan melalui Control Panel.

Pengontrolan Output Buzzer dan TRIAC

Bagian program untuk mengaktifkan dan mematikan Buzzer dan TRIAC adalah sebagai berikut.

procedure TForm1.btnBuzzerOnClick(Sender: TObject);
begin
 usb_control_msg(USBTC101_Handle, $C0, 3, 1, 1, buffer, sizeof(buffer), 5000);
 buzzer.Brush.Color:= clRed;
end;

procedure TForm1.btnBuzzerOffClick(Sender: TObject);
begin
 usb_control_msg(USBTC101_Handle, $C0, 3, 0, 0, buffer, sizeof(buffer), 5000);
 buzzer.Brush.Color:= clSilver;
end;

procedure TForm1.btnTriacOnClick(Sender: TObject);
begin
 usb_control_msg(USBTC101_Handle, $C0, 2, 1, 1, buffer, sizeof(buffer), 5000);
 triac.Brush.Color:= clRed;
end;

procedure TForm1.btnTriacOffClick(Sender: TObject);
begin
 usb_control_msg(USBTC101_Handle, $C0, 2, 0, 0, buffer, sizeof(buffer), 5000);
 triac.Brush.Color:= clSilver;
end;

Jika button ON ditekan, maka gambar box di atas button akan berubah warna menjadi merah (clRed). Dan jika button OFF ditekan, maka gambar box akan berubah menjadi abu-abu muda (clSilver).

Pada keempat event tersebut, pemanggilan fungsi usb_control_msg tidak dicek apakah pemanggilan fungsi berhasil ataukah gagal. Praktek ini kurang baik, Anda dapat menambahkan sendiri rutin pengecekan dengan mengacu pada kode program bagian event Timer1.

Download

Anda dapat mengunduh project Lazarus untuk program demo USB-TC101 melalui link berikut ini.

Link Program Demo USB-TC101

Akhir kata, saya mengucapkan terima kasih telah membaca, semoga tulisan ini bermanfaat bagi kita semua.

Selamat berkarya.

 

 

 

 

 

 

Add a Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>