arduino tracking system

hi there

iam building a tracking system as my final year project and iam using arduino uno, sparkfun em406 GPS, sim900 v1.4 GPRS, i tried running the GPS and it’s giving me the coordinates and the GPRS shield is connecting to the site through HTTP request but when i combine them together, the GPS don’t generate any data and stuck at the “waiting for lock” message and none of the GPRS outputs appear on the screen

this the code i use, where did i go wrong and what can i do?

#include <cmath>
#include <SoftwareSerial.h>
#include "Arduino.h"
#include <TinyGPS.h>

#define RXPIN 9
#define TXPIN 10
SoftwareSerial mySerial(7, 8);

#define TERMBAUD  19200
#define GPSBAUD  4800
TinyGPS gps;
SoftwareSerial uart_gps(RXPIN, TXPIN);
void getgps(TinyGPS &gps);
void SubmitHttpRequest(long lat, long lng);

void setup()
{
 
  // Sets baud rate of your terminal program
  Serial.begin(TERMBAUD);
  // Sets baud rate of your GPS
  uart_gps.begin(GPSBAUD);
  mySerial.println("AT+CSQ");
  delay(100);
 
  ShowSerialData();// this code is to show the data from gprs shield, in order to easily see the process of how the gprs shield submit a http request, and the following is for this purpose too.
 
  mySerial.println("AT+CGATT?");
  delay(100);
 
  ShowSerialData();
 
  mySerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the SAPBR, the connection type is using gprs
  delay(1000);
 
  ShowSerialData();
 
  mySerial.println("AT+SAPBR=3,1,\"viva.bh\",\"CMNET\"");//setting the APN, the second need you fill in your local apn server
  delay(4000);
 
  ShowSerialData();
 
  mySerial.println("AT+SAPBR=1,1");//setting the SAPBR, for detail you can refer to the AT command mamual
  delay(2000);
 
  ShowSerialData();
  mySerial.begin(19200);               // the GPRS baud rate   
  
  
  Serial.println("");
  Serial.println("GPS Shield QuickStart Example Sketch v12");
  Serial.println("       ...waiting for lock...           ");
  Serial.println("");
}

// This is the main loop of the code. All it does is check for data on 
// the RX pin of the ardiuno, makes sure the data is valid NMEA sentences, 
// then jumps to the getgps() function.
void loop()
{
  float lat,lon;
	while(uart_gps.available())     // While there is data on the RX pin...
	{
		int c = uart_gps.read();    // load the data into a variable...
		if(gps.encode(c))      // if there is a new valid sentence...
		{
			getgps(gps,lat,lon);         // then grab the data.
			Serial.println(lat);
			Serial.println(lon);
			SubmitHttpRequest(lat, lng)
		}
	}
  }
void SubmitHttpRequest(long lat, long lng)
{
 
  mySerial.println("AT+HTTPINIT"); //init the HTTP request
 
  delay(2000); 
  ShowSerialData();
 
  mySerial.print("AT+HTTPPARA=\"URL\",\"http://www.mysite.com/data.php");// setting the httppara, the second parameter is the website you want to access
  mySerial.print("?lat=");
  mySerial.print(lat);
  mySerial.print("&lng=");
  mySerial.print(lng);
  mySerial.println("\"");
  delay(1000);
 
  ShowSerialData();
 
  mySerial.println("AT+HTTPACTION=0");//submit the request 
  delay(10000);//the delay is very important, the delay time is base on the return from the website, if the return datas are very large, the time required longer.
  //while(!mySerial.available());
 
  ShowSerialData();
 
  mySerial.println("AT+HTTPREAD");// read the data from the website you access
  delay(300);
 
  ShowSerialData();
 
  mySerial.println("");
  delay(100);
}

// The getgps function will get and print the values we want.
void getgps(TinyGPS &gps,float &lat2,float &lon2)
{
  // To get all of the data into varialbes that you can use in your code, 
  // all you need to do is define variables and query the object for the 
  // data. To see the complete list of functions see keywords.txt file in 
  // the TinyGPS and SoftwareSerial libs.
  
  // Define the variables that will be used
  float latitude, longitude;
  // Then call this function
  gps.f_get_position(&latitude, &longitude);
  lat2=latitude;
  lon2=longitude;
  // You can now print variables latitude and longitude
  Serial.print("Lat/Long: "); 
  Serial.print(latitude,5); 
  Serial.print(", "); 
  Serial.println(longitude,5);
  
  // Same goes for date and time
  int year;
  byte month, day, hour, minute, second, hundredths;
  gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
  // Print data and time
  Serial.print("Date: "); Serial.print(month, DEC); Serial.print("/"); 
  Serial.print(day, DEC); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(hour, DEC); Serial.print(":"); 
  Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); 
  Serial.print("."); Serial.println(hundredths, DEC);
  //Since month, day, hour, minute, second, and hundr
  
  // Here you can print the altitude and course values directly since 
  // there is only one value for the function
  Serial.print("Altitude (meters): "); Serial.println(gps.f_altitude());  
  // Same goes for course
  Serial.print("Course (degrees): "); Serial.println(gps.f_course()); 
  // And same goes for speed
  Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
  //Serial.println();
  
  // Here you can print statistics on the sentences.
  unsigned long chars;
  unsigned short sentences, failed_checksum;
  gps.stats(&chars, &sentences, &failed_checksum);
  //Serial.print("Failed Checksums: ");Serial.print(failed_checksum);
  //Serial.println(); Serial.println();
  
  // Here you can print the number of satellites in view
  Serial.print("Satellites: ");
  Serial.println(gps.satellites());
 }

void ShowSerialData()
{
  while(gprsSerial.available()!=0)
    Serial.write(gprsSerial.read());
}

thanks :slight_smile:

Seems to me like you are getting stuck at:

void loop()
{
  float lat,lon;
   while(uart_gps.available())     // While there is data on the RX pin...
   {
      int c = uart_gps.read();    // load the data into a variable...
      if(gps.encode(c))      // if there is a new valid sentence...
      {
         getgps(gps,lat,lon);         // then grab the data.
         Serial.println(lat);
         Serial.println(lon);
         SubmitHttpRequest(lat, lng)
      }
   }
  }

Since this:

  Serial.println("");
  Serial.println("GPS Shield QuickStart Example Sketch v12");
  Serial.println("       ...waiting for lock...           ");
  Serial.println("");
}

…is getting printed to the monitor. So there is only one reason, it’s the first bit of code I posted.

Basically, it never runs this if

if(gps.encode(c)) // if there is a new valid sentence...

So that tells me that you are not getting a valid sentence. Post links to the hardware you have and how you hooked them up. If more than one sensor is trying to use the RX and TX pins, you are not going to get anything on those pins.

this is the GPS i use

https://www.sparkfun.com/tutorials/173

and this is my GPRS

http://www.seeedstudio.com/wiki/GPRS_Shield_V1.0

i even tried doing this

while(uart_gps.available()&&num==2)     // While there is data on the RX pin...
	{
		int c = uart_gps.read();    // load the data into a variable...
		if(gps.encode(c))      // if there is a new valid sentence...
		{
			getgps(gps,lat,lon);         // then grab the data.
			Serial.println(lat);
			Serial.println(lon);
                        num=1;
		}
	}
if(num==1){
SubmitHttpRequest(lat, lng);
num=2;
}

mohd9011:
this is the GPS i use

https://www.sparkfun.com/tutorials/173

That is just a tutorial for a shield. Not the product page.

and this is my GPRS

http://www.seeedstudio.com/wiki/GPRS_Shield_V1.0

i even tried doing this

while(uart_gps.available()&&num==2)     // While there is data on the RX pin...
{
	int c = uart_gps.read();    // load the data into a variable...
	if(gps.encode(c))      // if there is a new valid sentence...
	{
		getgps(gps,lat,lon);         // then grab the data.
		Serial.println(lat);
		Serial.println(lon);
                    num=1;
	}
}

if(num==1){
SubmitHttpRequest(lat, lng);
num=2;
}

Since I still don’t know what GPS module you are using, it’s likely that it’s using Serial comms as well. There is a conflict on the Serial line. You need to hack one of the sensors to use the Software Serial library so you can communicate with both of them.

But first, try searching Google and see if anyone else had this problem. They may have posted an easy solution.

this is the GPS module

https://www.sparkfun.com/datasheets/GPS … Guide1.pdf