0

I'm having a problem about my Arduino code. I'm trying to send my gathered GPS location to my web server, but instead of numbers the web server displays it as a string.

Here's my Arduino GPS code:

#include <TinyGPS++.h>
#include <SoftwareSerial.h>

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;


TinyGPSPlus gps;


SoftwareSerial ss(RXPin, TXPin);

void setup()
{
    Serial.begin(115200);
    ss.begin(GPSBaud);

}

void loop()
{

    while (ss.available() > 0)
        if (gps.encode(ss.read()))
            displayInfo();

    if (millis() > 5000 && gps.charsProcessed() < 10)
    {
        Serial.println(F("No GPS detected: check wiring."));
        while (true);
    }
}

void displayInfo()
{
    Serial.print(F("Location: "));
    if (gps.location.isValid())
    {
        Serial.print(gps.location.lat(), 6);
        Serial.print(F(","));
        Serial.print(gps.location.lng(), 6);
    }
    else
    {
        Serial.print(F("INVALID"));
    }

    Serial.println();
}

I want to convert that "gps.location.lat" and "gps.location.lng" into char so that my web server can display numbers instead of strings. Maybe my logic is wrong?

Here's the raw code of my HTTP request:

#include <SoftwareSerial.h>
SoftwareSerial GSM(7, 8); // RX, TX

enum _parseState {
 PS_DETECT_MSG_TYPE,

 PS_IGNORING_COMMAND_ECHO,

 PS_HTTPACTION_TYPE,
 PS_HTTPACTION_RESULT,
 PS_HTTPACTION_LENGTH,

 PS_HTTPREAD_LENGTH,
 PS_HTTPREAD_CONTENT
};

enum _actionState {
AS_IDLE,
AS_WAITING_FOR_RESPONSE
};

byte actionState = AS_IDLE;
unsigned long lastActionTime = 0;

 byte parseState = PS_DETECT_MSG_TYPE;
 char buffer[80];
 byte pos = 0;

 int contentLength = 0;

 void resetBuffer() {
 memset(buffer, 0, sizeof(buffer));
  pos = 0;
 }

 void sendGSM(const char* msg, int waitMs = 500) {
 GSM.println(msg);
 while(GSM.available()) {
   parseATText(GSM.read());
 }
 delay(waitMs);
 }

 void setup()
  {
  GSM.begin(9600);
  Serial.begin(9600);

 sendGSM("AT+SAPBR=3,1,\"APN\",\"vodafone\"");  
 sendGSM("AT+SAPBR=1,1",3000);
 sendGSM("AT+HTTPINIT");  
 sendGSM("AT+HTTPPARA=\"CID\",1");

 }

void loop()
 { 
 unsigned long now = millis();

 if ( actionState == AS_IDLE ) {
  if ( now > lastActionTime + 5000 ) {
  sendGSM("AT+HTTPPARA=\"URL\",\"http://www.iforce2d.net/test.php\"");
  sendGSM("AT+HTTPACTION=0");
  lastActionTime = now;
  actionState = AS_WAITING_FOR_RESPONSE;
  }
 }

 while(GSM.available()) {
  lastActionTime = now;
  parseATText(GSM.read());
 }
 }

 void parseATText(byte b) {

 buffer[pos++] = b;

  if ( pos >= sizeof(buffer) )
  resetBuffer(); // just to be safe

 switch (parseState) {
 case PS_DETECT_MSG_TYPE: 
   {
  if ( b == '\n' )
    resetBuffer();
  else {        
    if ( pos == 3 && strcmp(buffer, "AT+") == 0 ) {
      parseState = PS_IGNORING_COMMAND_ECHO;
    }
    else if ( b == ':' ) {
      //Serial.print("Checking message type: ");
      //Serial.println(buffer);

      if ( strcmp(buffer, "+HTTPACTION:") == 0 ) {
        Serial.println("Received HTTPACTION");
        parseState = PS_HTTPACTION_TYPE;
      }
      else if ( strcmp(buffer, "+HTTPREAD:") == 0 ) {
        Serial.println("Received HTTPREAD");            
        parseState = PS_HTTPREAD_LENGTH;
      }
      resetBuffer();
    }
    }
   }
   break;

  case PS_IGNORING_COMMAND_ECHO:
   {
    if ( b == '\n' ) {
    Serial.print("Ignoring echo: ");
    Serial.println(buffer);
    parseState = PS_DETECT_MSG_TYPE;
     resetBuffer();
    }
  }
   break;

   case PS_HTTPACTION_TYPE:
   {
    if ( b == ',' ) {
    Serial.print("HTTPACTION type is ");
    Serial.println(buffer);
    parseState = PS_HTTPACTION_RESULT;
    resetBuffer();
    }
   }
   break;

  case PS_HTTPACTION_RESULT:
  {
    if ( b == ',' ) {
    Serial.print("HTTPACTION result is ");
    Serial.println(buffer);
    parseState = PS_HTTPACTION_LENGTH;
    resetBuffer();
    }
   }
   break;

   case PS_HTTPACTION_LENGTH:
   {
  if ( b == '\n' ) {
    Serial.print("HTTPACTION length is ");
    Serial.println(buffer);

    // now request content
    GSM.print("AT+HTTPREAD=0,");
    GSM.println(buffer);

    parseState = PS_DETECT_MSG_TYPE;
    resetBuffer();
  }
   }
  break;

  case PS_HTTPREAD_LENGTH:
   {
     if ( b == '\n' ) {
     contentLength = atoi(buffer);
    Serial.print("HTTPREAD length is ");
    Serial.println(contentLength);

    Serial.print("HTTPREAD content: ");

    parseState = PS_HTTPREAD_CONTENT;
    resetBuffer();
  }
}
break;

  case PS_HTTPREAD_CONTENT:
   {

  Serial.write(b);

  contentLength--;

  if ( contentLength <= 0 ) {

    // all content bytes have now been read

    parseState = PS_DETECT_MSG_TYPE;
    resetBuffer();

    Serial.print("\n\n\n");

    actionState = AS_IDLE;
  }
}
break;
  }
  }
halfer
  • 19,824
  • 17
  • 99
  • 186
MerjMc
  • 1
  • 2
  • what do you mean "into chars so that my web server can display numbers instead of strings"? Do you mean you want to send them as binary data? – Gusman Feb 03 '17 at 15:41
  • Then: What does `F()` do? What does `Serial.print()` do? what types do gps.location.lat() and lng() return? – Fildor Feb 03 '17 at 15:41
  • what's wrong with that sir?..enlighten me...i think that statement will tell if the arduino will not detect the GPS antenna...correct me if I'm wrong.. – MerjMc Feb 03 '17 at 15:42
  • Yes, it will - and then go into an endless loop with 100% CPU. – Fildor Feb 03 '17 at 15:42
  • What's the return type of the `gps.location.lat()` expression ? – clickMe Feb 03 '17 at 15:43
  • my web server will display this instead of numbers as a location.. DEVICE ID: abcd1234 LATITUDE: gps.location.lat LONGITUDE: gps.location.lng i don't know how to pass it to the web server as number... – MerjMc Feb 03 '17 at 15:46
  • double gps.location.lat double gps.location.lng – MerjMc Feb 03 '17 at 15:47
  • while(true) - nevermind. Seems to be something specific to Arduino. – Fildor Feb 03 '17 at 15:50

0 Answers0