Posting ini adalah kelanjutan dari posting terdahulu, kirim SMS via attiny intro disini dan lanjut disini, kali ini kita akan bahas mengenai mode "penerima sms" , dimana micro AVR akan menerima SMS dan melakukan keputusan atau proses berdasarkan parsing teks sms yg dikirim.
Kelemahan mode serial UART yg sebelumnya adalah bisa mengirim(banyak teks) dan menerima hanya 1 teks sebagai triger interupt.
...Bagaimana jika Teks yg ingin diparsing berupa beberapa karakter? semisal "LED1ON" ?..
Ternyata jika kita cek satu persatu per-karakter sms yg diterima maka akan muncul masalah "sms terpotong" atau timing yg kacau....Untuk itu dibutuhkan mode "FIFO" atau "circular buffering" dimana teks yg diterima oleh micro melalui UART/serial akan disimpan dalam buffer memory barulah kemudian akan diolah/parsing untuk keperluan kontrol.
Setelah mencoba beberapa library , yang paling pas adalah pfleury uart library penjelasan disini dan download disini. Silahkan baca terlebih dahulu dan ternyata cukup mudah dan simple.
Selanjutnya kita ingat dulu AT command dari modem yg kita gunakan yaitu Wavecom. Beberapa command yg penting adalah :
AT+IFC=0,0 : Agar mode serial control = none
ATE0 : Agar karakter yg dikirim tidak di echo/kembalikan
AT+CMGF=1 : mode sms "teks"
dan yang baru adalah :
AT+CNMI=2,2 : mode SMS terima langsung tampil teksnya
jika sms diterima dengan mode diatas, maka ketika sms diterima akan muncul seperti ini di modem :
+CMT :"+628155555555","11/10/01,12 :30 :00+00",
pesan sms disini
Lanjut kita ke proyek sebenarnya, kali ini kita menggunakan micro ATMEGA 8515 dengan circuit seperti berikut (micro lain menyesuaikan aja):
*) modem wavecom memiliki mode komunikasi serial yg "cross" jadi jangan lupa untuk melakukan cros TX & RX (pin 2 vs pin 3 dari DB9)
selanjutnya kita akan bahas scriptnya
-Inisialisasi
kita akan menggunakan library uartnya si pleury, dengan mengcopy "uart.h" serta "uart.c" ke folder avr studio dan menambah source uart.c dan include uart.h
#define F_CPU 7372800UL //xtal yg digunakan biar error 0% #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include "uart.h" //pastikan sudah tersedia di folder program //definisi baudrate RS232 #define UART_BAUD_RATE 9600 char buffer[10]; //definisi buffer teks int indexbuf=0;
cara menambahkan uart.c :
- Inisialisasi I/O port dan modem wavecom
int main(void)
{
DDRA |= (1<<PA6)|(1<<PA7); //port yg digunakan PA6 & PA7
unsigned int c;
uint8_t a;
//inisialisai UART dari library pfleury
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
sei(); // mode receive interupt
uart_puts_P("ATE0\r"); // biar tidak memenuhi buffer
_delay_ms(500);
uart_puts_P("AT+CMGF=1\r"); //mode smsteks
_delay_ms(500);
uart_puts_P("AT+CNMI=2,2\r"); // mode langsung baca sms
/** Size of the circular receive buffer, must be power of 2 */ #ifndef UART_RX_BUFFER_SIZE #define UART_RX_BUFFER_SIZE 64 #endif /** Size of the circular transmit buffer, must be power of 2 */ #ifndef UART_TX_BUFFER_SIZE #define UART_TX_BUFFER_SIZE 64 #endif
- Parsing SMS
Kita lanjut dengan Parsing SMS yg masuk, dimana akan meng-ON/OFF Led di port A6 & A7. Untuk mepermudah parsing, kita gunakan trigger karakter khusus sehingga dapat menandai SMS yg akan diparsing ( kali ini menggunakan " $ ")
PORTA &= ~_BV(PA6) & ~_BV(PA7);
while(1)
{
c = uart_getc();
if ( c & UART_NO_DATA ) // jika ga ada data masuk
{
}
else
{
if( c == '$') indexbuf=0; //jika triger $, maka mulai parsing (index aray buffer = 0 )
buffer[indexbuf] = c; //masukkan teks sms ke buffer
indexbuf++; //index array ditambah
}
// Jika yg diterima sms "$LED1ON", maka Led di PA6 akan hidup
if( buffer[0]=='$' && buffer[1]=='L' &&buffer[2]=='E' &&
buffer[3]=='D' && buffer[4]=='1' &&
buffer[4]=='O' && buffer[5]=='N')
{ PORTA |= _BV(PA6);
for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
}
// Jika yg diterima sms "$LED2ON", maka Led di PA7 akan hidup
if( buffer[0]=='$' && buffer[1]=='L' &&buffer[2]=='E' &&
buffer[3]=='D' && buffer[4]=='2' &&
buffer[4]=='O' && buffer[5]=='N')
{ PORTA |= _BV(PA7);
for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
}
// Jika yg diterima sms "$LED1OFF", maka Led di PA6 akan mati
if( buffer[0]=='$' && buffer[1]=='L' &&buffer[2]=='E' &&
buffer[3]=='D' && buffer[4]=='1' &&
buffer[5]=='O' && buffer[6]=='F' && buffer[7]=='F')
{ PORTA &= ~_BV(PA6);
for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
}
// Jika yg diterima sms "$LED2OFF", maka Led di PA7 akan mati
if( buffer[0]=='$' && buffer[1]=='L' &&buffer[2]=='E' &&
buffer[3]=='D' && buffer[4]=='2' &&
buffer[5]=='O' && buffer[6]=='F' && buffer[7]=='F')
{ PORTA &= ~_BV(PA7);
for(a=0;a<10;a++) buffer[a]=0;// bersihkan buffer
}
}
}
Cara parsing pada script diatas masih menggunakan logika sederhana seperti penjelasan berikut :
1. Format SMS dimulai dengan karakter '$', sehingga parsing akan menunggu karakter ini muncul lalu kemudian diarahkan menuju posisi array buffer 0
2. Tiap array buffer kemudian di cek satu per satu sampai menemukan format kata sesuai keinginan, seperti contoh yg digunakan berupa kata $LED1ON :
if( buffer[0]=='$' && buffer[1]=='L' &&buffer[2]=='E' &&
buffer[3]=='D' && buffer[4]=='1' &&
buffer[4]=='O' && buffer[5]=='N')
{ PORTA |= _BV(PA6);
}
3. Diakhiri dengan pembersihan isi buffer agar bisa digunakan selanjutnya.
Kontrol micro via sms ini memiliki banyak kemungkinan aplikasi sesuai kreativitas diantaranya :
1. Menghidupkan Lampu otomatis via SMS
2. Membaca data suhu atau kondisi on/off setelah sms dikirim (tanpa harus menerima report terus menerus seperti contoh sebelumnya)
3. Trigger BO** .....duhhh jangan yaaa....INGAT ! Pisau didapur bisa bikin masakan enak, tapi ditangan orang tidak bertanggung jawab maka pisau dapur bisa menjadi alat pembunuh...
SELAMAT MENCOBA