Vous êtes sur la page 1sur 14

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 mendaftarkan 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:
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:

Peralatan yang digunakan untuk aplikasi ini:


1.
2.
3.
4.

Smart AVR 16 System


Wavecom Fastrack M1206B
Smart LCD Display
USB downloader

Posted by zigan
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
11 Agustus 2011 11.48
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
25 Agustus 2011 23.41
mas tanya bagaimana dengan komunikasi GPRS apakah konfigurasi pin2
nya sama??
Anonim mengatakan...
on

17 Desember 2011 17.44


iya sama konfigursi pinnya, tapi comandnya yg beda.
zigan mengatakan...
on
18 Desember 2011 16.47
mas kalo pake input(buttom)bagaimana
maaf mas masih awam
tolong bantuannya
Anonim mengatakan...
on
13 Januari 2012 08.45
mas kalo pake input(buttom)bagaimana programnya?
maaf mas masih awam
tolong bantuannya
Anonim mengatakan...
on
13 Januari 2012 08.52
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
18 Januari 2012 18.48
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
4 Februari 2012 11.30
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
5 Februari 2012 22.09
mas, klo mo ngirim ke sekaligus 2 nomer hp yg berbeda caranya gmn
mas?
mohon bantuannya, maklum masih newbie...heheh
Anonim mengatakan...
on
17 April 2012 14.03
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
26 Juni 2012 18.42
Salam kenal mas, program nya di mikon saya hanya bisa kirim sms, untuk
menerima beum bisa. Mikon yang dipake atmega8535, wavecom m130b

====================================================
Programnya sederhana, seperti ini saja :
$regfile = m16def.dat
$crystal = 16000000
$baud = 9600
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.2 , Db4 = Portc.4 ,
Config Lcdpin = Pin , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2
Cursor Off
Cls
Lcd Kirim SMS.
Waitms 500
Print AT+CMGS=;
-no HP penerima
Print 083840761524
Waitms 700
-isi SMS
Print Tes Kirim SMS;
Print Chr(26)
Wait 1
Lowerline
Lcd SMS terkirim
End
Untuk mengganti nomor HP penerima sms, cukup ganti baris 15 : Print
083840761524 dengan nomor HP yang dikehendaki. Isi SMS juga dapat
diganti, yaitu dengan mengganti perintah Print Tes Kirim SMS; dengan is sms
yang diinginkan.

Vous aimerez peut-être aussi