TinyGPS and Spark Core

I know that @mohit and @Dave have both done a bunch of Asset Tracker projects with mapping onto Google Maps and might be able to clear this up.

1 Like

That does not qualify as a proper test, since the search engines might do some "translation" for you - they are quite good in guessing what you meant even if you didn't spell it absolutely correct, but APIs are less forgiving :wink:

1 Like

Sometimes libraries will give you “degrees minutes seconds” style outputs, but what you really want is decimal degrees. There are ways to convert this, but I think you can just ask TinyGPS for float / decimal degree coordinates:

#
# from:  http://arduiniana.org/libraries/tinygps/
#
// returns +/- latitude/longitude in degrees
gps.f_get_position(&flat, &flon, &fix_age);
float falt = gps.f_altitude(); // +/- altitude in meters
float fc = gps.f_course(); // course in degrees
float fk = gps.f_speed_knots(); // speed in knots
float fmph = gps.f_speed_mph(); // speed in miles/hr
float fmps = gps.f_speed_mps(); // speed in m/sec
float fkmph = gps.f_speed_kmph(); // speed in km/hr

I hope that helps!

Thanks,
David

The format that I’m getting is DD MM.SSSS, is there a way to convert that to decimal?

I googled the formula, but it doesn’t work.See the pictures below its about 10 miles off.

Decimal value = Degrees + (Minutes/60) + (Seconds/3600)

If you put +28 38.5417’,-81 56.3664’ in to google you get the following decimal:

28.6483,-819435

The correct formula is DD + (MM.SSSS/60), If DD is negative then multiply by -1.

I believe you have a sign issue. The formula is DD + (MM.SSSS/60) but for all positive values, with the sign corrected afterwards. So 81 + (56.3664 / 60) = 81 + 0.93944 = 81.939944, then make it negative.
28.64236,-81.93994

3 Likes

Oh…yeah…I always forget the darn sign! Thanks for the catching that!

1 Like

Hi
I have, like some others, a problem with TinyGPS giving me only 0,0,0,0 return.
For information, I use a Ublox M8N ( with only NMEA output done in U-center) and try to use TinyGPS on my Particle Photon 0.5.3.

As you could see, I very slighlty change the Gps.ino in the Web IDE, inorder to debug .( see my gps.ino)
I also found a good NMEA sentences ( I think ) , but I have still 0,0,0,0 for the “szInfo” ( see “putty.log” serial results )

I suspect a problem in the gps.encode in the TinyGPS.cpp that only return a gps.encode©= False, but I can’t find the solution .
Thanks, if you could help me .

I want to thank whomever got the tinyGPS.h include file and library working on the Photon / Spark Core. Probably @peekay123. I was having a terrible time getting the Grove Seeedstudio GPS working. There main information page was not very useful.

http://wiki.seeed.cc/Grove-GPS/

The only thing I learnt was to switch the board TX to Photon RX and vice versa.

TinyGPS library worked out of the box. I made a few changes to add altitude, km per hour, and direction (North = 0 East=90)

Here is my (not very pretty) code:

// This #include statement was automatically added by the Particle IDE.
#include <TinyGPS.h>




TinyGPS gps;


float lat, lon;
unsigned long age;




char szInfo[64];
// Every 15 minutes 
//int sleep = 15 * 60 * 1000;

void setup(){
    Serial1.begin(9600);
       Particle.publish("Startup may take a few minutes", " Try going outside ");
}

void loop(){
    bool isValidGPS = false;
    
    for (unsigned long start = millis(); millis() - start < 1000;){
        // Check GPS data is available
        while (Serial1.available()){
            char c = Serial1.read();
            
            // parse GPS data
            if (gps.encode(c))
                isValidGPS = true;
        }
    }

    // If we have a valid GPS location then publish it
    if (isValidGPS){
    
        gps.f_get_position(&lat, &lon, &age);
        
        
        
       Particle.publish("altitude in meters =", String(gps.f_altitude(), 0));
       
       
       Particle.publish("Direction N=0 E=90", String(gps.f_course(), 0));
       
       
       Particle.publish("Km per hour", String(gps.f_speed_kmph(), 2));
       delay(1000);
        
        
        
        lat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : lat;
        lon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : lon;
        Particle.publish("Longitude =", String(lon));
        delay(10);
        Particle.publish("Lattiude =", String(lat));
        delay(10);
        
        
       
        

       
       
       // sprintf(szInfo, "%.6f,%.6f", (lat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : lat), (lon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : lon));
    }
    else{
        // Not a vlid GPS location, jsut pass 0.0,0.0
        // This is not correct because 0.0,0.0 is a valid GPS location, we have to pass a invalid GPS location
        // and check it at the client side
       // sprintf(szInfo, "0.0,0.0");
    }
    
    //Spark.publish("gpsloc", szInfo);
    delay(1000);
   Particle.publish("Put into Google Maps", String(String(lat) +  ", " + String(lon)) );
   Particle.publish("- ", "- ");
    // Sleep for some time
    delay(5000);
}

So I then drove around with my photon using my cell phone hotspot and got live driving data that in the console looks sort of like:

1 Like

If you like TinyGPS, you may like TinyGPS++ library even more
https://build.particle.io/libs/TinyGPS++/0.9.4

2 Likes

Anyone know what the default altitude is with TinyGPS. I just assumed meters but my values don’t make a lot of sense. Anyone have any idea? The TinyGPS.cpp file shows this code. Which divides the unknown measurement by 100

float TinyGPS::f_altitude()    
{
  return _altitude == GPS_INVALID_ALTITUDE ? GPS_INVALID_F_ALTITUDE : _altitude / 100.0;
}

I just tried google maps altitude and it looks like meters is the correct value (with about ±5m of error) So I guess the raw value is cm.

Just found out that

Particle.publish("Hi","Goodbye");

defaults to PUBLIC so for testing purposes probably better to use

Particle.publish("hi","Goodbye", 60, PRIVATE); 

for all Particle.publish commands unlike the code I pasted above.

1 Like