Tuesday, 3 July 2012

SMS controller dengan mirkokontroller + Bascom AVM , AT Mega16, modem Wavecom Fastrack M1206B

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 #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.
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 Hot smile

 
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:
  1. 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.
  2. Echo Off, ketik ATE0 lalu enter.
  3. Untuk menyimpan perubahan konfigurasi ketik AT&W lalu  enter.
  4. Koneksi m1206b ke PC dengan koneksi m1206b ke mikrokontroller ada sedikit perbedaan, perhatikan gambar berikut:  

1 comment:

  1. gan kalau pakai mega8535 apa settingannya cuman di ganti dengan m8535 saja...
    dan codingnya tetep gitu apa berubah.

    ReplyDelete