berikut ini adalah contoh aplilaksi mikrokontroler dalam kehidupan sehari hari... mikrokontroller dapat dipergunakan dalam automatisasi waktu nyala / padam nya peralatan listrik, pengaman rumah / tambak/ kebun dan sebagaianya
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
.
Untuk input kita gunakan tombol yang terhubung ke PIND.2, saat tombol di tekan microcontroller akan mengirim SMS “PIND.2= ON”.
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 = 100
PORTC.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 Loading
setting 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 Byte
Inisialisasi 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 Sub
Proses 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
Return
Dari 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 Led
Data 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 If
Saat 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 If
Mencari 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: