[Update] Parsing data GPS berdasarkan karakter dan mengirim via sms dengan Atmega 128

Posted on
Halo sobat Nunutjoe.. ini saya mau berbagi kembali mengenai parsing gps. yang pada postingan lalu sudah pernah saya posting dengan metode parsingnya dengan menghitung koma. Di postingan ini berisi program parsing berdasar menghitung karakter. sehingga ketika gps belum mendapatkan data maka data yang akan ditampilkan adalah data kacau. Data keluaran GPGGA lebih dari 50 karakter. hitungan 0 dimulai dengan $ dan G adalah hitungan ke 1. Berikut hasil tampilan ketika gps belum mendapatkan data
Tampilan ketika gps belum menerima data
Berikut tampilan ketika gps memperoleh data

Tampilan ketika gps mendapatkan data

tampilan gps diatas adalah berformat google maps sehinga tinggal dimasukan saja ke maps.google.com atau ke google earth. pada data latitude dan longitude bertipe float karena data tersebut mengandung desimal. untuk megaktifkan data float perlu dilakukan sedikit seting di code vision yaitu

Tools >> configure terus set seperti yang saya beri tanda panah
seting mengaktifkan float di code vision avr
nah… berikut dalah list program yang mungkin bisa dipahami sendiri lebih lanjut
#include <mega128.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#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)

#define PB1     PINB.0
#define PB2     PINB.1
#define PB3     PINB.2
#define PB4     PINB.3
#define PB5     PINB.4
#define PB6     PINB.5

unsigned char bouncing1=0xff, bouncing2=0xFF, bouncing5=0xFF;

#define USART0 0
#define USART1 1
unsigned char poutput;
//unsigned int counter=3000;
//float des=0.77;
//unsigned char halo[10]= {“halo”};
unsigned char lcd_buff[20];
unsigned char lcd_buff1[20];
unsigned char lcd_buff2[20];
unsigned char lcd_buff3[20] ;
unsigned char lcd_buff4[20]  ;

/*deklarasi variabel gps*/
unsigned char ind[10];
unsigned char longitude[15],latitude[15];
unsigned char cLintang[10],cBujur[10],linmen[10],bujmen[10];
unsigned char jam[15],satelite[10];
unsigned int iLintang,iBujur;
unsigned int Lintang=0,Bujur=0;
float fLintang, fBujur, lintGMAPS, bujurGMAPS;

// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0 <= 256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;
#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;
unsigned char buffgps[100];
unsigned int countgps=0;
unsigned char i;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;

if(data==’$’)
    {
        countgps=0;
    }            
   
    buffgps[countgps]=data;
    countgps++;
    if(buffgps[countgps-1]==’*’)
   
    {
        if(buffgps[0]==’$’ && buffgps[1]==’G’ && buffgps[2]==’P’ && buffgps[3]==’G’ && buffgps[4]==’G’ && buffgps[5]==’A’)
            {
                for(i=7;i<13;i++)
                {
                    jam[0]=buffgps[7];
                    jam[1]=buffgps[8];
                    jam[2]=’:’;
                    jam[3]=buffgps[9];
                    jam[4]=buffgps[10];
                    jam[5]=’:’;
                    jam[6]=buffgps[11];
                    jam[7]=buffgps[12];          
                }
             
            for(i=18;i<=26;i++)
                {
                  latitude[i-18]=buffgps[i];
                                     
                    if(i<20){
                        cLintang[i-18]=buffgps[i];
                        if(i==19)
                        iLintang=atoi(cLintang);
                    }
                    else{
                        linmen[i-20]=buffgps[i];
                    }
                   
                    if(i==26){    
                        fLintang=atof(linmen)/60;
                        lintGMAPS=iLintang+fLintang;
                        Lintang=lintGMAPS*1000000;
                    }
                }
                i++;            
            for(i=30;i<=39;i++)
                {
                 longitude[i-30]=buffgps[i];                  
                    if(i<33){
                        cBujur[i-30]=buffgps[i];
                        if(i==32)iBujur=atoi(cBujur);
                    }
                    else{
                        bujmen[i-33]=buffgps[i];          
                    }
                   
                    if(i==39){    
                        fBujur=atof(bujmen)/60;
                        bujurGMAPS=iBujur+fBujur;
                        Bujur=bujurGMAPS*1000000;
                    }                  
                }
                i++;
                for(i=43;i<44;i++){
                 ind[0]=buffgps[43];// detekssi fix satelit            
                 }
               
                 for(i=45;i<47;i++){
                    satelite[0]=buffgps[45];
                    satelite[1]=buffgps[46];
                    }
                countgps=0;
            }
    }

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0++]=data;
#if RX_BUFFER_SIZE0 == 256
   // special case for receiver buffer size=256
   if (++rx_counter0 == 0)
      {
#else
   if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
#endif
      rx_buffer_overflow0=1;
      }
   }
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0++];
#if RX_BUFFER_SIZE0 != 256
if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#endif
#asm(“cli”)
–rx_counter0;
#asm(“sei”)
return data;
}
#pragma used-
#endif

// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0 <= 256
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif

// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if (tx_counter0)
   {
   –tx_counter0;
   UDR0=tx_buffer0[tx_rd_index0++];
#if TX_BUFFER_SIZE0 != 256
   if (tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
#endif
   }
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART0 Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm(“cli”)
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer0[tx_wr_index0++]=c;
#if TX_BUFFER_SIZE0 != 256
   if (tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
#endif
   ++tx_counter0;
   }
else
   UDR0=c;
#asm(“sei”)

switch (poutput)
{
    case USART0: // the output will be directed to USART0
    while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
    UDR0=c;
    break;

    case USART1: // the output will be directed to USART1
    while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
    UDR1=c;
    break;
};

}
#pragma used-
#endif

// Get a character from the USART1 Receiver
#pragma used+
char getchar1(void)
{
char status,data;
while (1)
      {
      while (((status=UCSR1A) & RX_COMPLETE)==0);
      data=UDR1;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
         return data;
      }
}
#pragma used-

// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void cekpushbutton(void)
{
        poutput=USART1;
        lcd_clear();
/***DebouncingPushButton***/
bouncing1 = (bouncing1 << 1) | PB1;
        if(bouncing1==0b00001111)      
        {          
            delay_ms(500);
            printf(“AT”);
            putchar1(13);
            delay_ms(500);
            lcd_gotoxy(0,0);
            lcd_putsf(“Kirim SMS ke “);
            lcd_gotoxy(0,1);
            lcd_putsf(“081232939391”) ;
            printf(“AT+CMGS=”);
            putchar1(34);
            printf(“081232939391”);
            putchar1(34);
            putchar1(13);
            delay_ms(1000);
            printf(” Informasi GPS :  r”);
            printf(“#%s#-%f#%f#%s#%sr”,jam,lintGMAPS,bujurGMAPS,ind,satelite);
            printf(” Bakhtiyar_Sierad :)n”);
            putchar1(13);
            delay_ms(1000);
            putchar1(26);
            delay_ms(1000);
            lcd_gotoxy(0,3);
            lcd_putsf(“Mengirim …”);
            delay_ms(1000);
        }
        else{
          lcd_gotoxy(20,3);
          lcd_putsf(“X”);
       
        }
       
        bouncing5 = (bouncing5 << 1) | PB5;
        if(bouncing5==0b00001111)      
        {          
            delay_ms(500);
            printf(“AT”);
            putchar1(13);
            delay_ms(500);
            lcd_gotoxy(0,0);
            lcd_putsf(“Kirim ke “);
            lcd_gotoxy(0,1);
            lcd_putsf(“085649406184”) ;
            printf(“AT+CMGS=”);
            putchar1(34);
            printf(“085649406184”);
         
            putchar1(34);
            putchar1(13);
            delay_ms(1000);
            printf(” Informasi GPS :  r”);
            printf(“#%s#-%f#%f#%s#%sr”,jam,lintGMAPS,bujurGMAPS,ind,satelite);
            printf(” Bakhtiyar_Sierad :)n”);
            putchar1(13);
            delay_ms(1000);
            putchar1(26);
            delay_ms(1000);
            lcd_gotoxy(0,3);
            lcd_putsf(“Mengirim …”);
            delay_ms(1000);
        }
        else{
          lcd_gotoxy(20,3);
          lcd_putsf(“X”);
       
        }
}

void main(void)
{
// Declare your local variables here

// 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=P State6=P State5=P State4=P State3=P State2=P State1=P State0=P
PORTB=0xFF;
DDRB=0x00;

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x47;

// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud Rate: 9600
UCSR1A=0x00;
UCSR1B=0x18;
UCSR1C=0x06;
UBRR1H=0x00;
UBRR1L=0x47;

// Alphanumeric LCD initialization
// Characters/line: 20
lcd_init(20);

// Global enable interrupts
#asm(“sei”)

while (1)
      {
       
         cekpushbutton();  
         lcd_clear();
         poutput=USART1;
             
         sprintf(lcd_buff,”%s”,jam);  
         lcd_gotoxy(0,0);
         lcd_putsf(“Jam :”);
         lcd_puts(lcd_buff);
       
         sprintf(lcd_buff1,”-%f”,lintGMAPS);  
         lcd_gotoxy(0,1);
         lcd_putsf(“Lat :”);
         lcd_puts(lcd_buff1);      
       
         sprintf(lcd_buff2,”%f”,bujurGMAPS);  
         lcd_gotoxy(0,2);
         lcd_putsf(“Lon :”);
         lcd_puts(lcd_buff2);
                                                     
         sprintf(lcd_buff3,”%s”,ind);  
         lcd_gotoxy(0,3);          
         lcd_putsf(“Fix :”);
         lcd_puts(lcd_buff3);
       
         sprintf(lcd_buff4,”%s”,satelite);  
         lcd_gotoxy(10,3);
         lcd_putsf(“Sat :”);
         lcd_puts(lcd_buff4);
               
         //printf(“#%s##%s##%s##%s##%sr”,jam,latitude,longitude,ind,satelite); //data asli dari gps
         printf(“#%s#-%f#%f#%s#%sr”,jam,lintGMAPS,bujurGMAPS,ind,satelite); // data format google maps

      }
}

dari program yang saya buat memiliki fitur parsing data gps, kirim data via sms. disini saya menggunakan modem GSM Wavecom FastTrack M1306B. cara kerja disini setelah data gps diterima dengan menekan push button yang di set pada PINB.0 langsung mengirimkan data tersebut via sms dengan sebelumnya kita set terlebih dahulu nomor tujuannya. 
Nah,… semoga informasi ini membantu teman-teman  jika ada masalah silahkan bertanya dan akan saya bantu sebisa saya…
o iya program parsing tersebut bisa di download disini  atau project elektronika lainnya disini

     

8 thoughts on “[Update] Parsing data GPS berdasarkan karakter dan mengirim via sms dengan Atmega 128

Leave a Reply

Your email address will not be published. Required fields are marked *