Home › Forums › Microcontrollers › PIC Microcontroller › PIC16F877A with GPS and GSM for tracking purpose › Reply To: PIC16F877A with GPS and GSM for tracking purpose
March 9, 2015 at 9:20 pm
#11011
Participant
hi,
this is the code written to dispaly and snd msg to gsm with the gps data..
I use software uart for recieving gps data..is there any problem?
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB2_bit;\
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
// END LCD
// GPS
char Gpsdata,gps,error; // for incoming serial data
unsigned int finish =0; // indicate end of message
unsigned int pos_cnt=0; // position counter
unsigned int lat_cnt=0; // latitude data counter
unsigned int log_cnt=0; // longitude data counter
unsigned int time_cnt=0;
unsigned int flg=0; // GPS flag
unsigned int com_cnt=0; // comma counter
char time[20];
char lat[20],lat1[20],lat2[20]; // latitude array
char lg[20],lg1[20],lg2[20]; // longitude array
//GSM
void Receive_GPS_Data();
void GSM_Initialisation();
void GSM_Write();
void GSM_Read();
void main()
{
Soft_Uart_init(&PORTD,1,2,9600,0);
do
{
int t;
finish = 0;pos_cnt = 0;
Receive_GPS_Data();
Lcd_Init(); // Initialize LCD connected to PORTB
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1,"log"); // Print text to LCD, 1st row, 1st column
Lcd_Chr_Cp(lg);
Lcd_Out(2, 1,"lat"); // Print text to LCD, 2nd row, 1st column
Lcd_Chr_Cp(lat);
for(t=10;t>=0;t--)
{
Delay_ms(200);
if((lat1==lat)&&(lg1==lg))
{
lat2[20]=lat1[20];
lg2[20]=lg1[20];
}
if((lat2!=lat1)&&(lg2!=lg1))
{
GSM_Initialisation();
GSM_Write();
}
}
while(UART1_Data_Ready()==1)
{
GSM_Initialisation();
GSM_Read();
GSM_Write();
}
}
while(1);
}
void Receive_GPS_Data()
{
do
Gpsdata = Soft_UART_Read(&error);
while (error);
while(finish==0)
{
Gpsdata = Soft_Uart_Read(&error);
flg = 1;
if( Gpsdata=='$' && pos_cnt == 0) // finding GPRMC header
pos_cnt=1;
if( Gpsdata=='G' && pos_cnt == 1)
pos_cnt=2;
if( Gpsdata=='P' && pos_cnt == 2)
pos_cnt=3;
if( Gpsdata=='R' && pos_cnt == 3)
pos_cnt=4;
if( Gpsdata=='M' && pos_cnt == 4)
pos_cnt=5;
if( Gpsdata=='C' && pos_cnt==5 )
pos_cnt=6;
if(pos_cnt==6 && Gpsdata ==',')
{
// count commas in message
com_cnt++;
flg=0;
}
if(com_cnt==3 && flg==1)
{
lat[lat_cnt++] = Gpsdata; // latitude
flg=0;
}
if(com_cnt==5 && flg==1)
{
lg[log_cnt++] = Gpsdata; // Longitude
flg=0;
}
lat1[20]=lat[20];
lg1[20] = lg[20];
if( Gpsdata == '*' && com_cnt >= 5)
{
com_cnt = 0; // end of GPRMC message
lat_cnt = 0;
log_cnt = 0;
flg = 0;
finish = 1;
}
}
}
void GSM_Initialisation()
{
UART1_Init(9600);
Delay_ms(1000);
UART1_Write_Text("AT");
UART1_Write(10);
UART1_Write(13);
delay_ms(500);
UART1_Write_Text("ATE0");
UART1_Write(10);
UART1_Write(13);
delay_ms(500);
UART1_Write_Text("AT+CMGF=1");
UART1_Write(10);
UART1_Write(13);
delay_ms(500);
}
void GSM_Write()
{
UART1_Write_Text("AT+CMGS=\"+919946977684\"");
UART1_Write(10);
UART1_Write(13);
delay_ms(500);
UART1_Write_Text("THEFT ALERT");
UART1_Write(lat);
UART1_Write(lg);
UART1_Write(0x1A);
Delay_ms(1000);
UART1_Write_Text("ATD=9946977684");
UART1_Write(10);
UART1_Write(13);
delay_ms(500);
}
void GSM_Read()
{
int i,w=0;
char msg[55];
UART1_Write_Text("AT+CMGL=\"REC UNREAD\"\r");
UART1_Write(10);
UART1_Write(13);
Delay_ms(5000);
UART1_Write_Text("AT+CMGR=1\r");
for(i=0;i<75;i++)
{
if(UART1_Data_Ready())
{
msg[w] = UART1_Read();
++w;
}
}
msg[55] = '';
}
