Subscribe via email

Enter your email address:

Delivered by FeedBurner

Bascom AVR, Mega16,Wavecom Fastrack M1206B, 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 dan RS232.

 

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:

image


 

Peralatan yang digunakan untuk  aplikasi ini:

  1. Smart AVR 16 System
  2. Wavecom Fastrack M1206B
  3. Smart LCD Display
  4. USB downloader

Comments :

13 comments to “Bascom AVR, Mega16,Wavecom Fastrack M1206B, SMS”

mas, saya pake siemens M35i. data berupa PDU. untuk membaca data bisa dilakukan dengan lancar, tetapi untuk pengiriman, masih error pada respon hpnya. kira2 salahnya apa ya mas?? saya pakai perintah echo off biar gk ada karakter balik dari hp. yang saya tanyakan, format CR /chr(13) dan LF/chr(10) dari bascom gimana? di tulisan program diatas ada "AT+CMGS";chr(34);no_hp;chr(34);chr(44);chr(13);chr(10)
setelah ada reply dari hp berupa "> " lalu kita masukkan pesan diikuti chr(26)
padahal dengan syntax print "AT" tanpa chr(13) maupun chr(10) sudah ada reply "OK"
gimana ya mas??? terima kasih

Anonim mengatakan...
on 

Wah tutorialnya sangat bagus gan. Saya sudah mencoba sebagian kode ini dan ternyata berhasil. Terima kasih banyak atas tutorialnya.

Pernah bikin koneksi serial melalui CSD gak mas? Saya lagi nyoba tapi belum sukses, No Carrier terus. Kalau pernah buat koneksi serial via CSD mohon dishare ya gan.
Terima kasih

Anonim mengatakan...
on 

mas tanya bagaimana dengan komunikasi GPRS apakah konfigurasi pin2 nya sama??

Anonim mengatakan...
on 

iya sama konfigursi pinnya, tapi comandnya yg beda.

zigan mengatakan...
on 

mas kalo pake input(buttom)bagaimana
maaf mas masih awam
tolong bantuannya

Anonim mengatakan...
on 

mas kalo pake input(buttom)bagaimana programnya?
maaf mas masih awam
tolong bantuannya

Anonim mengatakan...
on 

d scan aja mas kondisi port yang digunakan, jika terjadi perubahan level tegangan(menandakan push button d tekan)maka code untuk sms d jalankan :D

zigan mengatakan...
on 

mau tanya gimana nambahkan coding ini
untuk memasukan no HP nya pake SMS ke alatnya.
jadi untuk merubah no HP tujuan cukup dengan kirim SMS ke alatnya..

Anonim mengatakan...
on 

saya buatkan deklasi kirim_sms1 coding tambahan nya menjadi :
Kirim_sms:
Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10)
Print "Laporan 1" ; Chr(26)
Cls
Lcd "Kirim SMS ke:"
Lowerline
Lcd No_hp
Waitms 200
Gifr = 64
'Sub Loading
Return
End

Kirim_sms1:
Print "AT+CMGS=" ; Chr(34) ; No_hp ; Chr(34) ; Chr(44) ; Chr(13) ; Chr(10)
Print "Laporan 2" ; Chr(26)
Cls
Lcd "Laporan Terkirim:"
Lowerline
Lcd No_hp
Waitms 200
Gifr = 64
Return
End

dan saya nambahkan pusbotom nya di PINA.0 tapi deklarasi Kirim_sms1 eror terus.. kenapa ya..???

Do
If Pina.0 = 0 Then
Kirim_sms1 <<< ini eror..
Wait 1
End If
Loop


bingung... mas.. gimana itu yang benernya..

Anonim mengatakan...
on 

mas, klo mo ngirim ke sekaligus 2 nomer hp yg berbeda caranya gmn mas?
mohon bantuannya, maklum masih newbie...heheh

Anonim mengatakan...
on 

salam kenal mas.

turorial yang mas berikan di atas fungsi sms untuk mengaktifkan output dan input mikro yah?

kalau listing program mikro mengrim sms yang terhubung dengan wavecom gmn yah mas?


jadi ketika tombol 1 di tekan maka sms dikirim ke suatu nomor hp yang dituju>.


moohon bantuannya mas.
ni email saya : aneuk.atjeh12@gmail.com

Ferry mengatakan...
on 

Salam kenal mas, program nya di mikon saya hanya bisa kirim sms, untuk menerima beum bisa. Mikon yang dipake atmega8535, wavecom m130b

Slay Mack mengatakan...
on 

Mohon pencerahannya...
terima kasih mas

Slay Mack mengatakan...
on