Dalam artikel ini, akan dibahan mengenai aplikasi mikrokontroller sebagai pengendali peralatan listrik dengan SMS
Aplikasi yang akan kita buat ini berfungsi untuk meng ON-OFF kan pin ouput microcontroller melalui SMS.
Pin-pin output yang kita gunakan adalah PORTC yang sudah terhubung ke LED. Untuk men ON-OFF kan ouput, format sms yang harus dikirm #CMD.
Isi CMD merupakan data biner 4bit, misal:
- #1111 (PORTC.0--PORTC.3 ON semua)
- #0001 (hanya PORTC.0 yang ON)
- #0111(hanya PORTC.3 yang OFF) dst.
Dalam aplikasi kita akan menggunakan LCD, RS232 dan interrupt jadi sebelum mencoba artikel ini simak dahulu artikel tentang LCD, RS232 dan interrupt
Code yang digunakan:
$regfile = "m16def.dat" $crystal = 11059200 $baud = 9600 $lib "lcd4busy.lbx" '***********inisialiasi PORT I/O********* Led Alias Portc.7 Config Portc = Output Portd.2 = 1 Config Pind.2 = Input Config Int0 = Falling Config Debounce = 100 '***********inisialiasai variabel2 dan subroutine untuk lcd********* 'karakter logo AVRku.com - IndoLab.net Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8 'karakater u loading Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 31 , 32 , 32 ' ' Config Lcd = 16 * 2 Const _lcdport = Portb Const _lcdddr = Ddrb Const _lcdin = Pinb Const _lcd_e = 2 Const _lcd_rw = 1 Const _lcd_rs = 0 Cursor Off Declare Sub Loading '***********variabel2 untuk sms********* Dim No_hp As String * 15 Dim Data_masuk As String * 100 Dim Cmti_pos As Byte , Cmgr_pos As Byte , Index_pos As Byte , Cmd_pos As Byte 'position of CMTI, CMGR, SMS index, Command Dim Pjg_sms_index As Byte , Pjg_data As Byte Dim Sms_index As String * 3 Dim Cmd As String * 4 Dim Cmdbin As Byte '***********main program********* No_hp = "+6285646690454" 'No_hp = Quote(no_hp) Portc = &HFF Call Loading Print "Connection OK" Enable Interrupts Enable Int0 On Int0 Kirim_sms Do Input Data_masuk Toggle Led Pjg_data = Len(data_masuk) 'periksa apakah ada data CMTI? Cmti_pos = Instr(data_masuk , "CMTI") If Cmti_pos <> 0 Then Index_pos = Instr(data_masuk , ",") ' posisi index sms yg baru masuk berada setelah koma "," Incr Index_pos Pjg_sms_index = Pjg_data - Index_pos Incr Pjg_sms_index Sms_index = Mid(data_masuk , Index_pos , Pjg_sms_index) Cls Lcd Data_masuk Lowerline Lcd Cmti_pos ; "-" ; Pjg_data ; "-" ; Index_pos ; "-" ; Pjg_sms_index ; "-" ; Sms_index Print "AT+CMGR=" ; Sms_index ; Chr(13) ; Chr(10) End If 'periksa apakah ada karakter # Cmd_pos = Instr(data_masuk , "#") If Cmd_pos <> 0 Then Incr Cmd_pos Cmd = Mid(data_masuk , Cmd_pos , 4) Cmdbin = Binval(cmd) Portc = Not Cmdbin Cls Lcd "Command Executed" Lowerline Lcd "Cmd= " ; Cmd Print "AT+CMGD=" ; Sms_index ; Chr(13) ; Chr(10) End If Loop '***********subroutine********* Sub Loading Local Geser As Byte , Ulang As Byte For Ulang = 1 To 2 Cls Lcd Chr(6) Lcd Chr(32) Lcd "AVRku-IndoLab" Lcd Chr(6) Locate 2 , 1 Lcd "loading" For Geser = 0 To 5 Lcd Chr(0) Waitms 200 Next Geser Next Ulang End Sub Kirim_sms: Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10) Print "PIND.2= ON" ; Chr(26) Cls Lcd "Kirim SMS ke:" Lowerline Lcd No_hp Waitms 200 Gifr = 64 Return End
VIDEO saat program udah jalan bisa di lihat di sini
PEMBAHASAN CODE PROGRAM:
$regfile = "m16def.dat" $crystal = 11059200 $baud = 9600 $lib "lcd4busy.lbx"Inisialisasi library yang digunakan (m16def.dat dan lcd4busy.lbx)
setting crystal dan baud rate (xtal=11,059200MHz dan baud=9600bps)
'***********inisialiasi PORT I/O********* Led Alias Portc.7 Config Portc = Output Portd.2 = 1 Config Pind.2 = Input Config Int0 = Falling Config Debounce = 100PORTC.7 diberi nama Led (nama pengganti agar mudah diingat). Pin ini digunakan sebagai indikator data yang masuk lewat RS232, setiap ada data yang masuk maka PORTC.7 akan di on-off.
PORTC d setting sebagai output. Selain PORTC.7 kita juga akan menggunakan PORTC.0, PORTC.1, PORTC.2 dan PORTC.3
PIND.2 digunakan sebagai input, pin ini merupakan pin INTERRUPT EXTERNAL 0 jadi sekalian kita akan belajar cara memakai interrupt di BASCOM AVR.
nilai Debounce merupakan nilai delay untuk mengantisipasi bouncing saat tombol yang terhubung ke PIND.2 ditekan.
'***********inisialiasai variabel2 dan subroutine untuk lcd********* 'karakter logo AVRku.com - IndoLab.net Deflcdchar 6 , 30 , 6 , 10 , 16 , 7 , 3 , 5 , 8 'karakater u loading Deflcdchar 0 , 32 , 32 , 32 , 31 , 31 , 31 , 32 , 32 ' ' Config Lcd = 16 * 2 Const _lcdport = Portb Const _lcdddr = Ddrb Const _lcdin = Pinb Const _lcd_e = 2 Const _lcd_rw = 1 Const _lcd_rs = 0 Cursor Off Declare Sub Loadingsetting untuk LCD dan men”daftar”kan sub routine “Loading” agar dikenali oleh Bascom AVR.
'***********variabel2 untuk sms********* Dim No_hp As String * 15 Dim Data_masuk As String * 100 Dim Cmti_pos As Byte , Cmgr_pos As Byte , Index_pos As Byte , Cmd_pos As Byte 'position of CMTI, CMGR, SMS index, Command Dim Pjg_sms_index As Byte , Pjg_data As Byte Dim Sms_index As String * 3 Dim Cmd As String * 4 Dim Cmdbin As ByteInisialisasi variabel2 yang akan digunakan untuk sms.
No_hp = menyimpan no hp tujuan.
Data_masuk = data yang masuk ke serial dimasukkan ke variable ini
Cmti_pos = menyimpan nilai saat proses mencari karakter “CMTI” di data_masuk. Saat ada sms baru, maka modem akan mengirim karakter “+CMTI” ke microcontroller.
Cmgr_pos = menyimpan nilai saat proses mencari karakter “CMTI” di data_masuk. “+CMGR” akan muncul begitu kita membaca sms.
Sms_index = menyimpan nilai saat proses mencari posisi sms. Begitu sms diterima, maka sms tersebut oleh modem akan di simpan dengan nomer urut tertentu.
Index_pos = menyimpan nilai saat proses mencari karakter “,” (koma). Karakter koma berada sebelum sms_index, jadi kita harus cari dulu karakter koma setelah “CMTI” untuk menemukan sms_index.
Cmd_pos= menyimpan nilai saat proses mencari karakter “#” (pagar). Karakter pagar berada sebelum command (command ini untuk menggerakkan OUTPUT), jadi kita harus cari dulu karakter pagar saat membaca isi sms untuk menemukan command.
Cmd = menampung command yang masuk
Cmdbin = menampung data biner hasil konversi dari Cmd. Data yang akan di keluarkan ke PORTC (output) harus dalam bentuk biner
No_hp = "+6285646690454"
Nomer HP yang dituju,/ nomer HP user. Ganti sesuaikan dengan nomer HP yang anda gunakan.Call Loading
Memanggil subroutine Loading.Sub Loading Local Geser As Byte , Ulang As Byte For Ulang = 1 To 2 Cls Lcd Chr(6) Lcd Chr(32) Lcd "AVRku-IndoLab" Lcd Chr(6) Locate 2 , 1 Lcd "loading" For Geser = 0 To 5 Lcd Chr(0) Waitms 200 Next Geser Next Ulang End SubProses pada subroutine Loading hanya berupa animasi karakater pada LCD saat awal microcontroller dijalankan, just 4 fun
Enable Interrupts
Enable Int0
On Int0 Kirim_sms
Mengaktifkan Interrupt. Saat terjadi Interrupt External 0 / Int0 / tombol PIND.2 ditekan, program akan menuju label Kirim sms :Kirim_sms: Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10) Print "PIND.2= ON" ; Chr(26) Cls Lcd "Kirim SMS ke:" Lowerline Lcd No_hp Waitms 200 Gifr = 64 ReturnDari code diatas bisa dilihat bahwa micro akan mengirim sms nomer hp user.
“Gifr=64” menset nilai bit ke enam pada register GIFR, bit ke enam pada GIFR untuk flag untuk INT0. Nilai ini perlu di set saat interrupt terjadi mencegah pemanggilan ulang interrupt ketika terjadi bouncing penekanan tombol. Untuk latihan coba hilangkan baris code ini, lalu lihat apa yang terjadi saat tombol ditekan?
Input Data_masuk Toggle LedData yang masuk ditampung pada variabel Data_masuk. Setiap ada data yang masuk, maka led (PORTC.7) di ON-Off
Pjg_data = Len(data_masuk)Perintah Len untuk mengetahui jumlah data yang masuk (panjang data)
'periksa apakah ada data CMTI? Cmti_pos = Instr(data_masuk , "CMTI")Instr digunakan untuk mengetahui posisi string pada sebuah data. Pada contoh ini string yang kita cari adalah CMTI.
If Cmti_pos <> 0 Then Index_pos = Instr(data_masuk , ",") ' posisi index sms yg baru masuk berada setelah koma "," Incr Index_pos Pjg_sms_index = Pjg_data - Index_pos Incr Pjg_sms_index Sms_index = Mid(data_masuk , Index_pos , Pjg_sms_index) Cls Lcd Data_masuk Lowerline Lcd Cmti_pos ; "-" ; Pjg_data ; "-" ; Index_pos ; "-" ; Pjg_sms_index ; "-" ; Sms_index Print "AT+CMGR=" ; Sms_index ; Chr(13) ; Chr(10) End IfSaat Cmti_pos tidak sama dengan 0 berarti dalam variabel Data_masuk sudah ditemukan string CMTI yang menandakan ada sms baru. Proses yang dilakukan pada code diatas yaitu mencari karakter koma untuk mengetahui posisi index.
Selanjutnya mencari tahu berapa digit panjang index nya, apakah 2 digit atau hanya 1 digit. Perlu di ketahui m1206b bisa menyimpan sms dari index 1 – 20. Logika yang dipakai untuk mencari panjang digit ini dengan menggunakan perintah: Pjg_sms_index = Pjg_data – Index_pos
Setelah posisi dan panjang didapat, sekarang waktunya memisahkan index dari variable Data_masuk kemudian ditampung ke variabel Sms_index menggunakan perintah: Sms_index = Mid(Data_masuk, Index_pos, Pjg_sms_index)
Data2 variabel yang sudah didapat akan ditampilkan di LCD.
'periksa apakah ada karakter # Cmd_pos = Instr(data_masuk , "#") If Cmd_pos <> 0 Then Incr Cmd_pos Cmd = Mid(data_masuk , Cmd_pos , 4) Cmdbin = Binval(cmd) Portc = Not Cmdbin Cls Lcd "Command Executed" Lowerline Lcd "Cmd= " ; Cmd Print "AT+CMGD=" ; Sms_index ; Chr(13) ; Chr(10) End IfMencari karakter # (pagar) yang menandakan command untuk menggerakkan output.
Proses yang terjadi pada code di atas adalah mengambil 4 data setelah karakter pagar. 4 data ini adalah command. 4 data yang masih bertipe string ini lalu dikonversi ke tipe biner dengan perintah Binval.
Data command yang sudah bertipe biner lalu dikeluarkan ke PORTC (tapi di NOT kan dulu karena LED-LED yang terhubung ke output bersifat active-low)
Sebelum microcontroller dan modem dihubungkan, setting modem Wavecom Fastrack m1206b harus di sesuaikan:
- Baudrate. Baudrate default wavecom fastrack m1206b adalah 115200bps sedangkan dalam program d atas memakai baudrate 9600bps. Untuk merubah setting modem kita gunakan terminal ( bisa pake terminal emulator, hyperterminal, tera term dll). Buka terminal dengan baudrate 115200 bps. Ketik: AT lalu enter. jika modem sudah terkoneksi dengan benar maka akan ada reply: OK. ketik AT+IPR=9600 lalu enter. Tutup terminal. Buka lagi tapi dengan baudrate 9600bps. Ketik: AT lalu enter, jika ada reply: OK berarti pengubahan baudrate berhasil.
- Echo Off, ketik ATE0 lalu enter.
- Untuk menyimpan perubahan konfigurasi ketik AT&W lalu enter.
- Koneksi m1206b ke PC dengan koneksi m1206b ke mikrokontroller ada sedikit perbedaan, perhatikan gambar berikut:
gan kalau pakai mega8535 apa settingannya cuman di ganti dengan m8535 saja...
ReplyDeletedan codingnya tetep gitu apa berubah.