How to send GPS coordinates to a web server using SIM900 GPRS

Can you figure this out? I have a project which is Vehicle Tracking System, I'm using Arduino Mega 2560 with NEO GPS6MV2 and SIM900 for my Vehicle GPS tracker. one of my specific objective is to save the GPS coordinates on an online MySQL database. The GPS is working. I successfully save the coordinates to the database by manually typing the AT commands and the parameters on the Arduino serial monitor. But my problem is I cannot save the coordinates on the database using this code. This is what I have on the Arduino serial monitor:

7 129 14.759555 120.986236 915 10/24/2017 21:55:35 92 44.40 0.00 0.19 N 10723 327.57 NNW 744 3 1
Start Send
AT+SAPBR=3,1,"Contype","GPRS"
AT+SAPBR=3,1,"APN","http.globe.com.ph123"
AT+SAPBR=1,1
AT+SAPBR=2,1
AT+HTTPINIT
AT+HTTPPARA="CID",1
AT+HTTPPARA="URL","http://crbphil-001-site1.1tempurl.com/adddata.php?"
AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"
AT+HTTPDATA=38,10000
addlati=
14.759555&addlongti=
120.986236"
AT+HTTPACTION=1
AT+HTTPTERM
AT+SAPBR=0,1

Finish

While on the database, there's no data added. There's nothing happening on the database. There are no errors on my PHP script. It is actually working when I manually type the URL on a web browser. Here's the code:

#include <SoftwareSerial.h>
    #include "SIM900.h"
    #include <TinyGPS.h>
    
    #define pinPowerSIM900 14
    TinyGPS gps;
    SoftwareSerial ss(10, 11);
    
    uint16_t startAddr = 0x0000;
    uint16_t lastAddr;
    uint16_t TimeIsSet = 0xaa55;
    
    int currentDay = 0;
    int currentMonth = 0;
    int currentYear = 0;
    int currentHour = 0;
    int currentMinute = 0;
    
    float flat, flon;
    float previousFlat = 0.0;
    float previousFlon = 0.0;
    static void smartdelay(unsigned long ms);
    static void print_float(float val, float invalid, int len, int prec);
    static void print_int(unsigned long val, unsigned long invalid, int len);
    static void print_date(TinyGPS &gps);
    static void print_str(const char *str, int len);
    
    void setup()
    {
    
      pinMode (pinPowerSIM900, OUTPUT); digitalWrite (pinPowerSIM900, LOW);
    
      powerUpOrDown();
    
      Serial.begin(115200);
    
      Serial.print("Testing TinyGPS library v. ");
      Serial.println(TinyGPS::library_version());
      Serial.println("");
      Serial.println();
      Serial.println("Stats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
      Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
      Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");
    
      ss.begin(9600);
    }
    
    void loop()
    {
      bool newData = false;
    
      for (unsigned long start = millis(); millis() - start < 1000;)
      {
        while (ss.available())
        {
          char c = ss.read();
          //Serial.write(c);  /*uncomment this line if you want to see GPS data*/
          if (gps.encode(c))
            newData = true;
        }
      }
    
      if (newData)
      {
        float flat, flon;
        unsigned long age, date, time, chars = 0;
        unsigned short sentences = 0, failed = 0;
        static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
    
        print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
        print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
        gps.f_get_position(&flat, &flon, &age);  /*latitude, longitude, age*/
        print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);  /*print lat */
        print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);  /*print long */
        print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
        print_date(gps);                                          /* print date */
        print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2); /* print altitude */
        print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
        print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
        print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
        print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
        print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
        print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
    
        gps.stats(&chars, &sentences, &failed);
        print_int(chars, 0xFFFFFFFF, 6);
        print_int(sentences, 0xFFFFFFFF, 10);
        print_int(failed, 0xFFFFFFFF, 9);
        Serial.println();
    
        smartdelay(3000);
    
        if ((flat != previousFlat) || (flon != previousFlon))
        {
          previousFlat = flat;
          previousFlon = flon;
          SendSQL();
        }
      }
    
    }
    
    static void smartdelay(unsigned long ms)
    {
      unsigned long start = millis();
      do
      {
        while (ss.available())
          gps.encode(ss.read());
      } while (millis() - start < ms);
    }
    
    static void print_float(float val, float invalid, int len, int prec)
    {
      if (val == invalid)
      {
        while (len-- > 1)
          Serial.print('*');
        Serial.print(' ');
      }
      else
      {
        Serial.print(val, prec);
        int vi = abs((int)val);
        int flen = prec + (val < 0.0 ? 2 : 1); // . and -
        flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
        for (int i = flen; i < len; ++i)
          Serial.print(' ');
      }
      smartdelay(0);
    }
    
    static void print_int(unsigned long val, unsigned long invalid, int len)
    {
      char sz[32];
      if (val == invalid)
        strcpy(sz, "*******");
      else
        sprintf(sz, "%ld", val);
      sz[len] = 0;
      for (int i = strlen(sz); i < len; ++i)
        sz[i] = ' ';
      if (len > 0)
        sz[len - 1] = ' ';
      Serial.print(sz);
      smartdelay(0);
    }
    
    static void print_date(TinyGPS &gps)
    {
      int year;
      byte month, day, hour, minute, second, hundredths;
      unsigned long age;
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
      if (age == TinyGPS::GPS_INVALID_AGE)
        Serial.print("********** ******** ");
      else
      {
        char sz[32];
        sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
                month, day, year, hour, minute, second);
        Serial.print(sz);
      }
      print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
      smartdelay(0);
    }
    
    static void print_str(const char *str, int len)
    {
      int slen = strlen(str);
      for (int i = 0; i < len; ++i)
        Serial.print(i < slen ? str[i] : ' ');
      smartdelay(0);
    }
    
    void powerUpOrDown()
    {
      digitalWrite(pinPowerSIM900, HIGH);
      delay(2000);
      digitalWrite(pinPowerSIM900, LOW);
      delay(3000);
    }
    
    void SendSQL()  //To send the GPS coordinates on the MySQL
    {
      Serial.println("Start Send");
      Serial.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
      delay(500);
      Serial.println("AT+SAPBR=3,1,\"APN\",\"http.globe.com.ph123\"");   //APN
      delay(500);
      Serial.println("AT+SAPBR=1,1");
      delay(3000);
      Serial.println("AT+SAPBR=2,1");
      delay(3000);
      Serial.println("AT+HTTPINIT");
      delay(500);
      Serial.println("AT+HTTPPARA=\"CID\",1 ");
      delay(500);
      Serial.println("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php?\""); //URL
      delay(500);
      Serial.println("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
      delay(500);
      Serial.println("AT+HTTPDATA=38,10000");
      delay(500);
      Serial.print("addlati=");   //latitude to send
      Serial.print(previousFlat, 6);
      Serial.print("&addlongti="); // longitude to send
      Serial.print(previousFlon, 6);
      Serial.println("\"");
      delay(3000);
      Serial.println("AT+HTTPACTION=1");  //syntax for POST method
      delay(15000);
      Serial.println("AT+HTTPTERM");
      delay(500);
      Serial.println("AT+SAPBR=0,1");
      delay(500);
      Serial.println("Finish");
    }

You appear to be trying to talk to the GPRS device AND the serial monitor through the same pins? I can't imagine that working well. Are you using an Uno? If so consider upgrading to a Mega, four hardware serial ports.

sorry, I forgot to include that I'm using Arduino Mega 2560 with NEO GPS6MV2 and SIM900 for my Vehicle GPS tracker.

So why are you using SoftwareSerial when you have perfectly good hardware ports?

And you have edited your first post which makes my reply look silly. Please read the post at the top of each section 'How to use this forum - please read'.

orry, I forgot to include that I'm using Arduino Mega 2560 with NEO GPS6MV2 and SIM900 for my Vehicle GPS tracker.

So, why ARE you using SoftwareSerial? Stop that crap.

        smartdelay(3000);

You misspelled stupiddelay.

      Serial.println("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php?\""); //URL

So, your URL is http://crbphil-001-site1.1tempurl.com/adddata.php?. Do you have a clue what is supposed to go after the '?'? The data for the PHP script to deal with, maybe?

PaulS:
So, why ARE you using SoftwareSerial? Stop that crap.

        smartdelay(3000);

You misspelled stupiddelay.

      Serial.println("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php?\""); //URL

So, your URL is http://crbphil-001-site1.1tempurl.com/adddata.php?. Do you have a clue what is supposed to go after the '?'? The data for the PHP script to deal with, maybe?

I'm using the SoftwareSerial to just test the process of sending the coordinates. I'm quite new to this. Should I don't use SoftwareSerial?

And the data that supposed to go with the '?' of

  Serial.println("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php?\""); //URL

is the latitude and longitude. With this, my PHP script can read the value of the parameters in the URL. For example:

 http://crbphil-001-site1.1tempurl.com/adddata.php?addlati=14.920132&addlongti=120.992064

On this case example, my PHP script can read the coordinates (14.920132 & 120.992064) and will save it on the MySQL database.

Should I don't use SoftwareSerial?

Yes. You should not use SoftwareSerial on the Mega.

And the data that supposed to go with the '?' of ... is the latitude and longitude.

That's what I thought.

You can't inject more data into your hardcoded statement. You have to build the URL separately, and then send it along with the other parts of the AT command.

float latitude = 14.920132;
float longitude = 120.992064;

char latStg[12];
char lonStg[12];
dtostrf(latitude, 11, 6, latStg);
dtostrf(longitude, 11, 6, lonStg);

char URL[120];
strcpy(URL, "http://crbphil-001-site1.1tempurl.com/adddata.php?addlati=");
strcat(URL, latStg);
strcat(URL, "&addlongti=");
strcat(URL, lonStg);

Serial.print("AT+HTTPPARA=\"URL\",\"");
Serial.print(URL);
Serial.println("\"");

Of course, you want to use the latitude and longitude values that you get from the GPS, but this shows how to send the AT command with some latitude and longitude values.

That is assuming that latitude and longitude are actually floats, not strings. If they ARE strings, then the dtostrf() calls are not needed, and you'd replace latStg and lonStg in the strcat() calls with latitude and longitude.

@PaulS
I tried what you recommended to me, both Arduino Mega and SIM900 are connected on a 5v 2A powerbank. I uploaded this code to the board:

#include <SoftwareSerial.h>
#include "SIM900.h"
#include <TinyGPS.h>
/*#include <Wire.h>
#include <DS1307new.h>*/
#define pinPowerSIM900 14
TinyGPS gps;
SoftwareSerial ss(10, 11);

uint16_t startAddr = 0x0000;
uint16_t lastAddr;
uint16_t TimeIsSet = 0xaa55;

int currentDay = 0;
int currentMonth = 0;
int currentYear = 0;
int currentHour = 0;
int currentMinute = 0;

float flat, flon;
float previousFlat = 0.0;
float previousFlon = 0.0;
static void smartdelay(unsigned long ms);
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);

void setup()
{

  pinMode (pinPowerSIM900, OUTPUT); digitalWrite (pinPowerSIM900, LOW);

  powerUpOrDown();
  
  Serial.begin(115200);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("");
  Serial.println();
  Serial.println("Stats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);
  Serial3.begin(9600);
}

void loop()
{

 bool newData = false;

  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
        char c = ss.read();
        //Serial.write(c);  /*uncomment this line if you want to see GPS data*/
        if (gps.encode(c))
        newData = true;
      }
    }
  
  if (newData)
  {
      float flat, flon;
      unsigned long age, date, time, chars = 0;
      unsigned short sentences = 0, failed = 0;
      static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
      print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
      print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
      gps.f_get_position(&flat, &flon, &age);  /*latitude, longitude, age*/
      print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);  /*print lat */
      print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);  /*print long */
      print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
      print_date(gps);                                          /* print date */
      print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2); /* print altitude */
      print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
      print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
      print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
      print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
      print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
      print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

      gps.stats(&chars, &sentences, &failed);
      print_int(chars, 0xFFFFFFFF, 6);
      print_int(sentences, 0xFFFFFFFF, 10);
      print_int(failed, 0xFFFFFFFF, 9);
      Serial.println();
  
      smartdelay(3000);

      if ((flat != previousFlat) || (flon != previousFlon))
      {
        previousFlat = flat;
        previousFlon = flon;
        SendSQL();
        }    
    }
    
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    //while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void print_float(float val, float invalid, int len, int prec)
{
  if (val == invalid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0) 
    sz[len-1] = ' ';
  Serial.print(sz);
  smartdelay(0);
}

static void print_date(TinyGPS &gps)
{
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  if (age == TinyGPS::GPS_INVALID_AGE)
    Serial.print("********** ******** ");
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
        month, day, year, hour, minute, second);
    Serial.print(sz);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}

void powerUpOrDown()
{
  digitalWrite(pinPowerSIM900, HIGH);
  delay(2000);
  digitalWrite(pinPowerSIM900, LOW);
  delay(3000);
  }

void SendSQL()
{
 Serial3.println("Start Send");
 Serial3.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
 delay(500);
 Serial3.println("AT+SAPBR=3,1,\"APN\",\"http.globe.com.ph123\"");   //APN
 delay(500);
 Serial3.println("AT+SAPBR=1,1");
 delay(3000);
 Serial3.println("AT+SAPBR=2,1");
 delay(3000);
 Serial3.println("AT+HTTPINIT");
 delay(500);
 Serial3.println("AT+HTTPPARA=\"CID\",1 ");
 delay(500);
float latitude = previousFlat;
float longitude = previousFlon;

char latStg[12];
char lonStg[12];
dtostrf(latitude, 11, 6, latStg);
dtostrf(longitude, 11, 6, lonStg);

char URL[120];
strcpy(URL, "http://crbphil-001-site1.1tempurl.com/adddata.php?addlati=");
strcat(URL, latStg);
strcat(URL, "&addlongti=");
strcat(URL, lonStg);
 
 Serial3.print("AT+HTTPPARA=\"URL\",\"");
 Serial3.print(URL);
 Serial3.println("\"");
 delay(500);
 Serial3.println("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
 delay(500);
 Serial3.println("AT+HTTPDATA=38,10000");
 delay(500);
 
 Serial3.println("AT+HTTPACTION=1");
 delay(15000);
 Serial3.println("AT+HTTPTERM");
 delay(500);
 Serial3.println("AT+SAPBR=0,1");
 delay(500);
 Serial3.println((char)26);// ASCII code of CTRL+Z
 Serial3.println("Finish");
  }

I waited some time, because the LED of my GPS module is not working, but the module itself is working. There's still nothing on the database Please help me to figure out what's wrong on my code?