user37317: My project is a vehicle tracking system. I'm using a NEO-6M for GPS and a SIM900 for GPRS. I want to send the GPS coordinates to a MySQL database. I've tested the GPS and it's working well. I've succeeded to send the data to the online MySQL database by manually typing the AT commands on the Arduino Serial Monitor. Now, I would like to put the sending of coordinates in a loop for Arduino to send the coordinates on the database every 3 seconds. But there's no data entering the database. What do you think is the problem here? Here's my code (by the way it has no errors reported):
sendlatlng.ino:
#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();  //Function to send the coordinates
    }
  }
}

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() {
  Serial.println("Start Send");
  gsm.SimpleWriteln("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=3,1,\"APN\",\"my.apn.com\"");   //APN
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=1,1");
  delay(3000);
  gsm.SimpleWriteln("AT+SAPBR=2,1");
  delay(3000);
  gsm.SimpleWriteln("AT+HTTPINIT");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"CID\",1 ");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php\""); //URL
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPDATA=38,10000");
  delay(500);
  gsm.SimpleWriteln("addlati=");
  Serial.print(previousFlat, 6);
  gsm.SimpleWriteln("&addlongti=");
  Serial.print(previousFlon, 6);
  gsm.SimpleWriteln("\"");
  delay(3000);
  gsm.SimpleWriteln("AT+HTTPACTION=1");
  delay(15000);
  gsm.SimpleWriteln("AT+HTTPTERM");
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=0,1");
  delay(500);
  Serial.println("Finish");
}

And this is my PHP script to save data in the MySQL database:
adddata.php:
<?php 
//Connect to MySQL
include("config.php");

// Perform a query, check for error
if (!mysqli_query($connect,"INSERT INTO track (tr_date, tr_time, latitude, longitude) VALUES ('".$_POST["addday"]."','".$_POST["addhour"]."','".$_POST["addlati"]."','".$_POST["addlongti"]."')")) {
  echo("Error description: " . mysqli_error($connect));
}
?>


user4143: Can you see a slight discrepancy in these lines?
gsm.SimpleWriteln("addlati=");
Serial.print(previousFlat, 6);
gsm.SimpleWriteln("&addlongti=");
Serial.print(previousFlon, 6);

I can.

37317: <p>My project is a vehicle tracking system. I'm using a NEO-6M for GPS and a SIM900 for GPRS. I want to send the GPS coordinates to a MySQL database. I've tested the GPS and it's working well. I've succeeded to send the data to the online MySQL database by manually typing the AT commands on the Arduino Serial Monitor. Now, I would like to put the sending of coordinates in a <code>loop</code> for Arduino to send the coordinates on the database every 3 seconds. But there's no data entering the database. What do you think is the problem here? Here's my code (by the way it has no errors reported):</p>

<p>sendlatlng.ino:</p>

<pre><code>#include &lt;SoftwareSerial.h&gt;
#include "SIM900.h"
#include &lt;TinyGPS.h&gt;
#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 &amp;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 &lt; 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(&amp;flat, &amp;flon, &amp;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(&amp;chars, &amp;sentences, &amp;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();  //Function to send the coordinates
    }
  }
}

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

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

static void print_date(TinyGPS &amp;gps) {
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long age;
  gps.crack_datetime(&amp;year, &amp;month, &amp;day, &amp;hour, &amp;minute, &amp;second, &amp;hundredths, &amp;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&lt;len; ++i) Serial.print(i&lt;slen ? str[i] : ' ');
  smartdelay(0);
}

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

void SendSQL() {
  Serial.println("Start Send");
  gsm.SimpleWriteln("AT+SAPBR=3,1,\"Contype\",\"GPRS\"");
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=3,1,\"APN\",\"my.apn.com\"");   //APN
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=1,1");
  delay(3000);
  gsm.SimpleWriteln("AT+SAPBR=2,1");
  delay(3000);
  gsm.SimpleWriteln("AT+HTTPINIT");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"CID\",1 ");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"URL\",\"http://crbphil-001-site1.1tempurl.com/adddata.php\""); //URL
  delay(500);
  gsm.SimpleWriteln("AT+HTTPPARA=\"CONTENT\",\"application/x-www-form-urlencoded\"");
  delay(500);
  gsm.SimpleWriteln("AT+HTTPDATA=38,10000");
  delay(500);
  gsm.SimpleWriteln("addlati=");
  Serial.print(previousFlat, 6);
  gsm.SimpleWriteln("&amp;addlongti=");
  Serial.print(previousFlon, 6);
  gsm.SimpleWriteln("\"");
  delay(3000);
  gsm.SimpleWriteln("AT+HTTPACTION=1");
  delay(15000);
  gsm.SimpleWriteln("AT+HTTPTERM");
  delay(500);
  gsm.SimpleWriteln("AT+SAPBR=0,1");
  delay(500);
  Serial.println("Finish");
}
</code></pre>

<p>And this is my PHP script to save data in the MySQL database:</p>

<p>adddata.php:</p>

<pre><code>&lt;?php 
//Connect to MySQL
include("config.php");

// Perform a query, check for error
if (!mysqli_query($connect,"INSERT INTO track (tr_date, tr_time, latitude, longitude) VALUES ('".$_POST["addday"]."','".$_POST["addhour"]."','".$_POST["addlati"]."','".$_POST["addlongti"]."')")) {
  echo("Error description: " . mysqli_error($connect));
}
?&gt;
</code></pre>
 4143: <p>Can you see a slight discrepancy in these lines?</p>

<pre><code>gsm.SimpleWriteln("addlati=");
Serial.print(previousFlat, 6);
gsm.SimpleWriteln("&amp;addlongti=");
Serial.print(previousFlon, 6);
</code></pre>

<p>I can.</p>
