Koneksi Mikrokontroler ATmega8535 Dengan Modul GSM Fastrack M1306B

Spesifikasi

Konfigurasi RS232 yang saya gunakan seperti biasanya TX ke RX device dan RX ke TX device, tapi ada tambahan yaitu pin 7 dan 8 disambungkan. USART Baud Rate: 115200. Berikut keterangan pin konektor DB9.

Pin No. Name Dir Notes/Description
1 DCD IN Data Carrier Detect. Raised by DCE when modem synchronized.
2 RD IN Receive Data (a.k.a RxD, Rx). Arriving data from DCE.
3 TD OUT Transmit Data (a.k.a TxD, Tx). Sending data from DTE.
4 DTR OUT Data Terminal Ready. Raised by DTE when powered on. In auto-answer mode raised only when RI arrives from DCE.
5 SGND Ground
6 DSR IN Data Set Ready. Raised by DCE to indicate ready.
7 RTS OUT Request To Send. Raised by DTE when it wishes to send. Expects CTS from DCE.
8 CTS IN Clear To Send. Raised by DCE in response to RTS from DTE.
9 RI IN Ring Indicator. Set when incoming ring detected – used for auto-answer application. DTE raised DTR to answer.

Berikut adalah contoh kode koneksi menggunakan serial RS232 antara modem dan mikrokontroler atmega8535 dengan tambahan LCD 2×16 menggunakan compiler CodeVisionAVR. Perintah menggunakan AT Command.

Inisialisasi

void sms_init()
{
        printf("ATE0"); //set command tanpa echo
        putchar(0x0D);//ENTER
        while(getchar()!='K'){}; //menunggu OK
        while(getchar()!=0x0A){}; //menunggu new line      
        delay_ms(500); 
}

Kirim SMS ukuran 1 byte

void send_sms(char flash *fmtstr1, char fmtstr2)
{
        printf("AT+CMGF=1"); //set sebagai pesan text        
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};  //menunggu new line
        while(getchar()!=0x0A){};  //menunggu new line
        delay_ms(500);          

        printf("AT+CMGS=\""); //perintah kirim sms tanpa memasukan ke memory pesan
        printf(fmtstr1); //kirim nomor tujuan
        printf("\"");
        putchar(0x0D);//ENTER 
        while(getchar()!=0x20){}; //menunggu spasi
        delay_ms(500);         

        putchar(fmtstr2); //pesan kode ukuran 1 byte
        putchar(0x1A); //kirim Ctrl+z
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line 
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);  

        printf("AT+CMGD=1"); //hapus memori pesan urutan satu
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);        

        printf("AT+CMGD=2"); //hapus memori pesan urutan dua
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);        

        printf("AT+CMGD=3"); //hapus memori pesan urutan tiga
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);
}

Kirim Text SMS

void send_sms_txt(char flash *fmtstr1, char flash *fmtstr2)
{
        printf("AT+CMGF=1"); //set sebagai pesan text
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};  //menunggu new line
        while(getchar()!=0x0A){};  //menunggu new line
        delay_ms(500);            

        printf("AT+CMGS=\""); //perintah kirim sms tanpa memasukan ke memory pesan
        printf(fmtstr1); //kirim nomor tujuan
        printf("\"");
        putchar(0x0D);//ENTER 
        while(getchar()!=0x20){}; //menunggu spasi
        delay_ms(500);         

        printf(fmtstr2); //pesan text
        putchar(0x1A); //kirim Ctrl+z
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line 
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);  

        printf("AT+CMGD=1"); //hapus memori pesan urutan satu
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);        

        printf("AT+CMGD=2"); //hapus memori pesan urutan dua
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);        

        printf("AT+CMGD=3"); //hapus memori pesan urutan tiga
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        delay_ms(500);
}

Menerima pesan ukuran 1 byte

char receive_sms()
{       
char data;      
        printf("AT+CMGR=1"); //cek memori pesan datang urutan 1
        putchar(0x0D);  //ENTER     
        while(getchar()!=0x0A){}; //menunggu new line
        while(getchar()!=0x0A){}; //menunggu new line
        data=getchar();     //menerima data
        while(getchar()!='K'){};  //menunggu OK
        while(getchar()!=0x0A){}; //menunggu new line

        delay_ms(500);

        printf("AT+CMGD=1"); //hapus memori pesan urutan satu
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};//menunggu OK
        while(getchar()!=0x0A){};//menunggu new line
        delay_ms(500);

        printf("AT+CMGD=2"); //hapus memori pesan urutan dua
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};//menunggu OK
        while(getchar()!=0x0A){};//menunggu new line
        delay_ms(500);

        printf("AT+CMGD=3"); //hapus memori pesan urutan tiga
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};//menunggu OK
        while(getchar()!=0x0A){};//menunggu new line
        delay_ms(500);           

        return(data);//mengembalikan nilai data
}

Mengecek sms masuk

void cek_sms()
{
        while(getchar()!=','){}; //menunggu tanda ',' koma 
        while(getchar()!=0x0A){};//menunggu new line
}

________________________________________________________
Berikut kode lengkap yang saya gunakan untuk mendeteksi ketinggian air di alat pengukur curah hujan berbasis sms.

/*****************************************************
Chip type               : ATmega8535
Program type            : Application
AVR Core Clock frequency: 11.059200 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 128
*****************************************************/

#include
#include
#include 

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include 

#ifndef RXB8
#define RXB8 1
#endif

#ifndef TXB8
#define TXB8 0
#endif

#ifndef UPE
#define UPE 2
#endif

#ifndef DOR
#define DOR 3
#endif

#ifndef FE
#define FE 4
#endif

#ifndef UDRE
#define UDRE 5
#endif

#ifndef RXC
#define RXC 7
#endif

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer[rx_wr_index]=data;
   if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
   if (++rx_counter == RX_BUFFER_SIZE)
      {
      rx_counter=0;
      rx_buffer_overflow=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART Transmitter buffer
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include 

// Declare your global variables here
void sms_init()
{
        printf("ATE0");
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};
        while(getchar()!=0x0A){};
        delay_ms(500);
}

void send_sms(char flash *fmtstr1, char fmtstr2)
{
        printf("AT+CMGF=1");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);           

        printf("AT+CMGS=\"");
        printf(fmtstr1);
        printf("\"");
        putchar(0x0D);//ENTER
        while(getchar()!=0x20){};
        delay_ms(500);          

        putchar(fmtstr2);
        putchar(0x1A);
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);   

        printf("AT+CMGD=1");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=2");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=3");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);
}      

void send_sms_txt(char flash *fmtstr1, char flash *fmtstr2)
{
        printf("AT+CMGF=1");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);           

        printf("AT+CMGS=\"");
        printf(fmtstr1);
        printf("\"");
        putchar(0x0D);//ENTER
        while(getchar()!=0x20){};
        delay_ms(500);          

        printf(fmtstr2);
        putchar(0x1A);
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);   

        printf("AT+CMGD=1");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=2");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=3");
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        delay_ms(500);
}      

char receive_sms()
{
char data;
        printf("AT+CMGR=1");
        putchar(0x0D);
        while(getchar()!=0x0A){};
        while(getchar()!=0x0A){};
        data=getchar();
        while(getchar()!='K'){};
        while(getchar()!=0x0A){}; 

        delay_ms(500);

        printf("AT+CMGD=1");
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};
        while(getchar()!=0x0A){};
        delay_ms(500);

        printf("AT+CMGD=2");
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};
        while(getchar()!=0x0A){};
        delay_ms(500);

        printf("AT+CMGD=3");
        putchar(0x0D);//ENTER
        while(getchar()!='K'){};
        while(getchar()!=0x0A){};
        delay_ms(500);            

        return(data);
}     

void cek_sms()
{
        while(getchar()!=','){};
        while(getchar()!=0x0A){};
}

// Declare your global variables here

#define PULSE PORTA.1
#define ECHO PINA.1
#define ARAH DDRA.1

unsigned char kata[16];

unsigned int ultra()
{
unsigned int count=0,jarak=0;
        ARAH = 1;
        PULSE = 1;
        delay_us(5);
        PULSE = 0;
        ARAH = 0;
        PULSE = 1;
        while(ECHO == 0){};
        while(ECHO == 1){count++;};
        jarak = (float)count/2.5;
        delay_ms(10);
        return(jarak);
}

int    sensor_in_t0, //nilai sensor sebelum
       sensor_in_t1, //nilai sensor sekarang
       del_sensor;   //delta sensor

void baca_sensor_init()
{
        sensor_in_t0 = (int)ultra(); //setting awal
        delay_ms(100);
}

unsigned char baca_curah_hujan()
{
        sensor_in_t1 = (int)ultra();              //baca sensor sekarang
        del_sensor = sensor_in_t0 - sensor_in_t1; //hitung selisih sensor sebelum dikurangi sensor sekarang

        if(del_sensor 300)       //300 mm/menit
        {
                return((unsigned char)3);
        }else if(del_sensor>200) //200 mm/menit
        {
                return((unsigned char)2);
        }else if(del_sensor>100) //100 mm/menit
        {
                return((unsigned char)1);
        }else                   //dibawah 100 mm/menit
        {
                return((unsigned char)0);
        }
}

char kirim_pesan(unsigned char kode)
{
        switch(kode)
        {
                case 0: lcd_gotoxy(0,1);
                        lcd_putsf("AMAN");
                        return('0');
                        break;
                case 1: lcd_gotoxy(0,1);
                        lcd_putsf("SIAGA I");
                        return('1');
                        break;//jika kode 1 kirim pesan siaga I
                case 2: lcd_gotoxy(0,1);
                        lcd_putsf("SIAGA II");
                        return('2');
                        break;//jika kode 1 kirim pesan siaga II
                case 3: lcd_gotoxy(0,1);
                        lcd_putsf("SIAGA III");
                        return('3');
                        break;//jika kode 1 kirim pesan siaga III
        }
}

void delta_waktu(unsigned int del)
{
        delay_ms(del*1000);
}

void main(void)
{
// Declare your local variables here
char data_dev1, data_dev2, data_hasil;
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 115200
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

// Global enable interrupts
#asm("sei")

lcd_clear();
delay_ms(1000);
lcd_gotoxy(0,0);
lcd_putsf("inisialisasi program"); 

baca_sensor_init();
sms_init();    

while (1)
      {
      // Place your code here
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("siap menerima kode");   

        cek_sms();    

        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("ada sms, siap cek kode");   

        data_dev1 = receive_sms() - 48; //normalisasi bilangan, ascii to desimal
        data_dev2 = kirim_pesan(baca_curah_hujan()) - 48; //normalisasi bilangan, ascii to desimal
        data_hasil = data_dev1 + data_dev2;

        switch(data_hasil)
        {
                case 0: lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("AMAN");
                        delay_ms(2000);
                        break;
                case 1: lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("AMAN");
                        delay_ms(2000);
                        break;
                case 2: lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("AMAN");
                        delay_ms(2000);
                        break;
                case 3: send_sms("082121962044",'1');
                        send_sms_txt("082121962033","BADAN PENANGGULANGAN BANJIR: WARNING I"); //OPERATOR
                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("WARNING I");
                        delay_ms(2000);
                        break;
                case 4: send_sms("082121962044",'2');
                        send_sms_txt("082121962033","BADAN PENANGGULANGAN BANJIR: WARNING II"); //OPERATOR
                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("WARNING II");
                        delay_ms(2000);
                        break;
                case 5: send_sms("082121962044",'2');
                        send_sms_txt("082121962033","BADAN PENANGGULANGAN BANJIR: WARNING II"); //OPERATOR
                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("WARNING II");
                        delay_ms(2000);
                        break;
                case 6: send_sms("082121962044",'3');
                        send_sms_txt("082121962033","BADAN PENANGGULANGAN BANJIR: WARNING III"); //OPERATOR
                        lcd_clear();
                        lcd_gotoxy(0,0);
                        lcd_putsf("WARNING II");
                        delay_ms(2000);
                        break;
        }
      };
}

___________________________________________________

UPDATE

Karena versi yg atas masih ada kelemahannya, yaitu pada fungsi send sms nya. Ketika modem memberi feedback error, program mikrokontroler akan terjebak pada looping. Maka, berikut versi perbaikannya dari fungsi send sms yang akan mencoba mengirim sms kembali jika modem memberikan feedback error pada pengiriman sebelumnya.

void send_sms(char flash *fmtstr1, char fmtstr2)
{   
char dat;
awal_sms:           

delay_ms(500);                  
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Kirim SMS"); 

        printf("AT+CMGF=1");         
        putchar(0x0D);//ENTER   
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};  
        delay_ms(500);           

        printf("AT+CMGS=\"");  
        printf(fmtstr1);  
        printf("\"");
        putchar(0x0D);//ENTER  
        while(getchar()!=0x20){}; //spasi
        delay_ms(500);         

        putchar(fmtstr2);
        putchar(0x1A);          

        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS"); 

                                goto awal_sms;
                        }
                }
        };
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS"); 

                                goto awal_sms;
                        }
                }
        };  
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS"); 

                                goto awal_sms;
                        }
                }
        };  
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS"); 

                                goto awal_sms;
                        }
                }
        };       
        delay_ms(500);   

        printf("AT+CMGD=1");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};  
        delay_ms(500);         

        printf("AT+CMGD=2");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=3");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};
        delay_ms(500);
}
void send_sms_txt(char flash *fmtstr1, char flash *fmtstr2)
{
char dat;
awal_sms_txt:    

        delay_ms(500);                  
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Kirim SMS ke-2"); 

        printf("AT+CMGF=1");         
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};  
        delay_ms(500);           

        printf("AT+CMGS=\"");  
        printf(fmtstr1);  
        printf("\"");
        putchar(0x0D);//ENTER  
        while(getchar()!=0x20){};  
        delay_ms(500);          

        printf(fmtstr2);
        putchar(0x1A);  

        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS ke-2"); 

                                goto awal_sms_txt;
                        }
                }
        };  
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS ke-2"); 

                                goto awal_sms_txt;
                        }
                }
        };
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS ke-2"); 

                                goto awal_sms_txt;
                        }
                }
        };
        while((dat=getchar())!=0x0A)
        {
                if (dat=='O')
                {                   
                        if(getchar()=='R')
                        {              
                                getchar();    

                                delay_ms(500);                  
                                lcd_clear();
                                lcd_gotoxy(0,0);
                                lcd_putsf("Gagal kirim SMS ke-2"); 

                                goto awal_sms_txt;
                        }
                }
        };       
        delay_ms(500);   

        printf("AT+CMGD=1");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};  
        delay_ms(500);         

        printf("AT+CMGD=2");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};
        delay_ms(500);         

        printf("AT+CMGD=3");  
        putchar(0x0D);//ENTER
        while(getchar()!=0x0A){};   
        while(getchar()!=0x0A){};
        delay_ms(500);
}

____________________________________
Daftar Pustaka
http://www.omniinstruments.co.uk/radiotel/P_Fastrack_Modem_M1306B_User_Guide.pdf
http://www.developershome.com/sms/sendSmsByAtCommands.asp
http://www.bbdsoft.com/ascii.html
http://www.coster.info/costerit/teleges/doc/gsm822w.pdf
http://www.vedran.jukic.net/rs232.html

55 Responses to Koneksi Mikrokontroler ATmega8535 Dengan Modul GSM Fastrack M1306B

  1. Eddy says:

    mt knal mas…
    kl pke arduino gmna???
    ato mgkn mas pny flowchart dri program ini g??mgkn bsa di share soale sy jg trtarik coba kyk gini…
    tmksh..

    • wangready says:

      klo arduino belum nyoba gan, gk tau…inti dari program saya di atas ada 5 prosedure:
      1.sms_init()->inisialisasi, konfigurasi awal modem.
      AT command: ATE0 untuk set command tanpa echo
      Alur:
      a.Kirim “ATE0” pada serial
      b.kirim ASCII “enter” yaitu 0x0D
      c.looping sampai dapat ASCII huruf “K”
      d.looping sampai dapat ASCII “new line” yaitu 0x0A
      e.delay
      2.send_sms(char flash *fmtstr1, char fmtstr2)
      AT command:
      AT+CMGF=1 untuk set sebagai pesan text
      AT+CMGS=”nomor tujuan”
      Alur:
      a.kirim “AT+CMGF=1” pada serial]
      b.kirim ASCII “enter”
      c.looping sampai dapat ASCII “new line”
      d.looping sampai dapat ASCII “new line”
      e.delay
      f.kirim “AT+CMGS=” ke serial
      g.kirim “nomor hp tujuan” k serial
      h.kirim ASCII “enter”
      i.looping sampai dapat ASCII “spasi”
      j.delay
      k.kirim “pesan” k serial
      l.kirim ASCII “ctrl+z” ke serial 0x1A
      m.cek data yg diterima, apakah ERROR atau OK, jika ERROR kembali ke point a
      n. kosongkan memori pesan 1-3 “AT+CMDG=’nomor memori'”
      3.send_sms_txt(char flash *fmtstr1, char flash *fmtstr2) -> hampir sama dgn nomor 2
      4.receive_sms()
      AT command: AT+CMGR=1 untuk cek memori pesan datang urutan 1
      ALur:
      a.kirim command “AT+CMGR=1”
      b.kirim ASCII “enter”
      c.looping sampai dapat ASCII “new line”
      d.looping sampai dapat ASCII “new line”
      e.terima data sms
      f.looping sampai dapat ASCII “K”
      g.looping sampai dapat ASCII “new line”
      h.kosongkan memori pesan 1-3 “AT+CMDG=’nomor memori'”
      5.cek_sms()
      Alur:
      a.looping sampai dapat ASCII “,”
      b.looping sampai dapat ASCII “new line”
      intinya sama aja kyak kita pake hyperterminal untuk komunikasi k modemnya, biar enak dan tau respon tiap command, agan bisa coba pake hyperterminal dlu…untuk beberapa command seperti “enter” atau “ctrl+z” bisa dilihat di tabel ASCII…terus untuk mananggapi respon balik dari modem seperti OK atau ERROR, saya hanya mengambil dan mengecek beberapa tanda saja, contoh untuk program send_sms saya hanya mengecek huruf “O” dan “R” untuk ERROR atau untuk “OK” saya mengecek ASCII “new line” dua kali. untuk AT command nya bisa dicari d google…

    • riky says:

      permisi mas, saya mau numpang tanya dan request dong, program untuk wavecom menggunakan microcontroler atmega8535, jadi ceritanya saya mau wavecom itu mengirim data ketika saya merequest, jadi ketika wavecom menerima sms dari saya, maka dia akan mereply, demikian mas admin, kalau bisa reply saya lewat email, saya akan sangat berterimaksih.. ☺

      • wangready says:

        klo bayangan saya request command nya bisa pake getchar, misal command itu di set 7 karakter, misal REG1234 berarti tambahin aja di programnya
        char data[10];
        for(i=0;i<7;i++)
        {
        data [i]=getchar();
        }
        nanti pake fungsi strcmp(data,"REG1234") , fungsi ini akan memberikan return 0 jika kalimatnya sama. atau bisa jg pake
        int angka;
        scanf("REG%d",&angka);
        nanti nilai angka tersebut yg dipakai.
        nanti di tinggal tambah program percabangan pake IF atau SWITCH CASE

  2. ferry says:

    salam kenal gan..

    saya tertarik postingan agan ini.

    kalau tanpa menggunakan LCD gmn gan. begini kasusnya gan.

    ane rencananya menggunakan 4 push button di input mikro dan outputnya wavecom.
    jadi ketika salah satu PB(push button) aktif maka sms di krim ke no hp tujuan target. jadi intinya setiap sensor yang aktif, maka sms akan dikirim..

    mohon dengan sangat bantuannya gan

    terima kasih gan…

    • wangready says:

      langsung di copas aja gan fungsi2 nya, kodingan saya pake codevisionAVR, klo lcd nya gk dipake tinggal kasih // (garis miring dua) di depan kode LCD nya…

  3. eddy says:

    ass…
    gan kalo boleh tau fungsi pin 7 dan 8 di sambung byar apa tuh?? thx

    • wangready says:

      7 RTS OUT Request To Send. Raised by DTE when it wishes to send. Expects CTS from DCE.
      8 CTS IN Clear To Send. Raised by DCE in response to RTS from DTE.
      yg dipake di mikro kan cuman tx dan rx, jd untuk pin ini langsung disambungg aja, klo gk disambung ane nyoba gk bisa….

  4. dede says:

    misi agan
    ane mau tanya kalo ngirim data berupa data suhu atau tekanan pada mikon bisa ga gan ke hp
    lewat aplikasi yang agan buat

  5. reiche says:

    Misi gan,

    Pin yang dipake berarti cuma Rx, Tx, Gnd, dan RTS-CTS (disambung) aja kan? thanks

  6. firman says:

    mas koneksi modem wavecom ke hyer terminal berhasil
    tapi knapa waktu ke mikrokontroler sms nya gak mau dikirim ya

    program kirim sms ny gini mas

    printf(“AT+CMGS=1”);
    putchar(13)
    printf(“AT+CMGS=”);
    putchar(‘”‘);
    printf(“+628877722968”);
    putchar(‘”‘);
    putchar(13);
    printf(“test send sms”);
    putchar(26)

    nah mas krang lebih gitu program nya
    padahal baud rate mikro dengan modem nya sdh sama 9600
    mohon pencerahannya mas

    • wangready says:

      coba mas periksa lg baudratenya, klo gk salah dulu saya pake wavecom baudrate default nya 115200, trus pin DB9 ke 7 dan 8 disambungkan, ada di post bagian atas
      atau biar ketahuan error nya dimananya, ditampilkan d LCD aja feedback dari modemnya.

    • jarwadi says:

      project yg anda kerjakan dh bisa lum mas..???
      ini saya juga mengerjakan dengan sourch kode seperti apa yg anda gunkan mas,tp sampae sekarg masih belum bisa.

  7. jarwadi says:

    Assalamualaikum n salam sukses mas….???

    saya mau tanya mas,ini saya sedang mengerjakan project mengirim sms dengan menggunakam modem fastrack m1306b juga mas.
    tp,saya bingung dengan posisi tx,rx,cts,rtsnya mas. di atas di jelaskan kalau posisi tx itu di pin 2, rx pin 3, rts di pin 7, dan cts di pin 8. tapai, pas modem ini saya aktifkan atau saya kasih power dan saya check tegangnnya,tegangan yg muncul itu di pin 3 dengan tegangn sekitar +5v dan di pin 7 dengan teg -5v mas.

    tolong saya minta pencerahnnya mas dengan yg terjadi di atas tersebut.

    terima kasih sebelumnya mas.

    • wangready says:

      untuk memastikan nomor urut pin DB9, bisa dilihat di konektornya gan, disitu ada nomornya kecil2.
      setahu saya, kalo DB9 female pin 2 Rx, pin 3 Tx, dan pin 5 GND. kalo yg male berarti kebalikannya…kalo lebih jelasnya mungkin disini gan https://wangready.wordpress.com/?s=Komunikasi+Serial+Antara+PC-Mikrokontroler+dengan+RS232+Standard
      kalo normalnya pin Tx itu HIGH saat tidak ada data, berarti 5v pada level TTL, tetapi jika sudah dikonversi ke RS232 berarti lebih kecil dari -3V
      mungkin agan bisa cek lagi nomor pinnya, siapa tahu tertukar…
      bisa juga dicek dengan langsung dikoneksikan ke PC pake USB2Serial, pake program hyperterminal coba kirim AT command…

      • jarwadi says:

        Iya gan,
        saya menggunakan db9 female pada mikronya. Untk percobaan ke PC melalui hyperterminal sudah saya coba gan dan alhamdulillah itu bisa. Tapi,pas saya coba saya sambungkan db9 female dari mikro ke db9 female menggunakan koneksi “db9 male to db9 male cross” buatan saya sendiri itu kok malah gak bisa ya..???
        padahal saya sudah mengikuti seperti referensi yang saya dapat termasuk dari web ini.

        La untuk penyambungan yang benar itu harusnya seperti apa ya gan..??

        untuk programnya saya menggunakan kode di bawah ini :

        printf(“AT+CMGS=1″);
        putchar(13)
        printf(“AT+CMGS=”);
        putchar(‘”‘);
        printf(“+628877722968″);
        putchar(‘”‘);
        putchar(13);
        printf(“test send sms”);
        putchar(26)

      • jarwadi says:

        ea tambahan dikit gan.
        “db9 male to db9 male cross” ini saya sambungkan ke modemnya gan.

      • wangready says:

        dari mikronya udah dikonversi ke level RS232 belum gan?
        klo biar yakin mah, di tap aja pake osiloskop, dilihat sinyalnya sampe gk. level tegangannya udah betul blm, bisa jadi IC max232 nya rusak…
        kalo untuk kodingan at command, coba kirim “AT” dulu, kalo ngirim balasan “OK”, berarti udah bisa. tampilkan di LCD mikro biar enak buat tracing program nya…
        kalo kodingan saya, at command nya gk langsung di kirim pake printf sekaligus. tp nunggu respon dari modem nya dulu, baru kirim command berikutnya….

      • jarwadi says:

        Sudah saya konversi menggunakan RS232 gan dan ICnya itu baru kok mas.
        kemarin pas saya coba utk hyperteminal juga bisa.

        ya nanti saya coba tap dg osciloskop mas. untuk yang di tap itu rx dan txnya kan mas..?

      • wangready says:

        iya gan, coba aja lihat apakah level tegangan RS232 nya udah sesuai apa belum, sama cek baudratenya…

      • jarwadi says:

        ok gan…

        baundrate sudah saya ubah dan saya check itu sebesar 9600 gan.

        ea gan,tolong sekalian ane kasih tau sourch kode program C untuk menampilkan balasan “OK” dari “AT” command modem ke LCD dong gan.

      • wangready says:

        waktu itu saya pake 115200 gan…
        yg simpel ngambil data serial string pake scanf gan https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/
        variabel nya langsung kirim ke LCD…

      • jarwadi says:

        kalau baudratenya 9600 gak masalh kan gan..?

      • wangready says:

        gk bisa gan kalo modemnya gk di set segitu….

      • jarwadi says:

        sudah saya set 9600 kok gan..
        berarti intinya modem sama mikro baudratenya harus sama kan mas..??

        ea,tadi saya coba project saya ini tapi masih belum bisa mengirim sms. cuma pas saya coba kirim sms melalui hp saya itu indikator LEDnya nyala mas.

        untuk menampilkan sms itu ke LCD codingnya seperti apa ya gan..??

        matus suwun banget mas…

      • wangready says:

        iya gan, baudrate nya harus sama, kalo enggak nanti karakter yang terbaca salah…
        receive sms ada di postingan…
        biar enak nerima data nya bisa pake scanf, contohnya ada di https://wangready.wordpress.com/2012/12/30/receive-data-uart-menggunakan-scanf-codevisionavr/

  8. Randy Wibowo says:

    permisi om….
    saya lagi dalam pengerjaan tugaas akir…
    sya mau tanya..
    alau untuk mentranfer data sms/isi sms dari hp ke micrkcontroler gmna caranya…?
    menggunakan kabel data
    mohon pencerahannya om….
    kalau boleh balas di email ya om…

    • wangready says:

      gk tau gan kalo pake HP mah, coba pake HP Android tp buat aplikasinya sendiri, sama modul Arduino udah ada librarynya, dulu teman saya pernah nyoba koneksi serial pake itu…

  9. eltro36ro says:

    mas include nya apa aja yg include di tengah2 itu apa

  10. gopil says:

    permisi..
    mas, mau tanya neyh,, gmn cara nya kirim sms ke nomer tujuan yang disimpan di phonebook yaa..??

    • wangready says:

      gk tau gan belum nyoba…klo alternatifnya sih masukin noHP aja di memori mikro nya
      mungkin link ini bisa membantu gan m2msupport.net/m2msupport/sim-phonebook-at-commands/

  11. ikhsan says:

    gan mau nanya, saya pakai atmega 8535,tapi tetep ga ada respon ya?
    > konverter rs232 to ttl
    > fastrack m1206
    > tx rx cross
    > baudrate 115200
    hampir seluruh comment yang di atas sudah saya coba kok respon dari modem ga ada ya?
    bisa liat skematik yang agan?
    mohon bantuannya gan untuk TA, kalo berkenan bisa dikirim ke email gan, terimakasih🙂

    • wangready says:

      skematik nya gk ada gan…
      coba aja dicoba lewat hyperterminal d komputer, kasih “AT” , kalo ok, brarti masalah d mikronya…
      coba cek pake baudrate 9600 gan…

      • ikhsan says:

        kalo langsung ke pc modemny udah “ok” gan, agan ada contoh program buat ngetesny dari mikro?
        agan ada ngelakuin setting ini ga dimodem?
        > AT+IFC=0,0
        > ATE0

        konverter yang agan gunain yang gmn gan?

      • wangready says:

        klo gtu agan coba input dari PC dan output nya ke mikro, trus program di mikro nya buat ditampilin di lcd
        while (1)
        {
        lcd_putchar(getchar());
        }
        setingan awal cuma ATE0 gan…

  12. gan modem gsm ini kalau misal buat ngirim ke web gtu bisa ngak?

  13. kostan says:

    mas mau tanya, gmana caranya megeset bautrate modem agar sama denngan yang diikrokontrol??? tq

  14. kausar says:

    permisi gan,
    ane lgi ngrjain skripsi mengenai pndetksi kbcrn gas brbasis sms mnggunkan modem wavecom..
    ane mau tnya gimana y caranya modem wavecom memberitahukan kalau pulsanya habis ?

    • wangready says:

      klo request jumlah pulsa seperti *888# (USSD Code) klo telkomsel, pake AT Command gan, cuma ane lupa lg command nya apaan. ntar grab datanya pake getchar aja sama kek kodingan di atas…

  15. nasuha says:

    mas saya mau tanya, saya mau ngaktifin led via sms.. tp ga bisa2 yaa? bisa di kasi pencerahan ga?🙂

    printf (AT+CMGF=1″);
    putchar (13);
    printf (“AT+CMGR=1”);
    putchar (13);
    //misal menerima sms hidup
    if (scanf (“hidup”)) {
    PORTB.0=1;
    };
    print (“AT+CMGD=1”);
    putchar (13);

    mohon bantuannya mas🙂

    • wangready says:

      coba gan pake fungsi yg ada di atas. sms_init masukin sebelum while(1).
      cek_sms buat nunggu sampai ada sms masuk baru lanjut ke program selanjutnya.
      terakhir pake receivea_sms buat nerima 1 karakter ASCII, agan coba aja ngirim 1 atau 0 untuk ngontrol led. pastikan dulu semua memori sms di modem kosong.

  16. Rizky Hidayatullah says:

    mas saya mau tanya, klo bisa ngga mengetahui sisa pulsadi modem itu berapa lagi terus dikirimkan ke hp ?

  17. andri says:

    Maaf ganggu gan…mau bertanya…bgaimana caranya itu untuk membaca sms di inbox di lcd??

  18. ahmadtgh says:

    tanya mas, disana kan ada program terima sms, terus apakah ada format khusus sebelum kata yang kita kirim buat nemima sms, atau tinggal mengetik tulisan langsung

  19. fen says:

    gan, boleh minta rangkaian RS232 nya..soalnya saya nyoba ga jadi-jadi..mohon pencerahannya gan..ini email saya : df.fencyta@gmail.com

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s