TinyGPS++

A *NEW* Full-featured GPS/NMEA Parser for Arduino

TinyGPS++ is a new Arduino library for parsing NMEA data streams provided by GPS modules.

Like its predecessor, TinyGPS, this library provides compact and easy-to-use methods for extracting position, date, time, altitude, speed, and course from consumer GPS devices. 

However, TinyGPS++’s programmer interface is considerably simpler to use than TinyGPS, and the new library can extract arbitrary data from any of the myriad NMEA sentences out there, even proprietary ones.

Download and Installation

To install this library, download here, unzip the archive into the Arduino “libraries” folder, and restart Arduino. You should rename the folder “TinyGPSPlus”.
Download

History

TinyGPS++ is the immediate inheritor of TinyGPS, a popular compact parser that is used in Arduino installations around the world.  TinyGPS++ is not quite as ‘tiny’ as its older sibling, but its powerful and extremely easy-to-use new object model and useful new feature set make it an attractive alternative.

Usage

Let’s say you have an Arduino hooked to an off-the-shelf GPS device and you want to display your altitude.  You would simply create a TinyGPS++ instance like this:

#include "TinyGPS++.h"
TinyGPSPlus gps;

Repeatedly feed it characters from your GPS device:

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

Then query it for the desired information:

if (gps.altitude.isUpdated())
  Serial.println(gps.altitude.meters());

Differences from TinyGPS

Although TinyGPS++ shares much the same compact parsing engine with TinyGPS, its programmer interface is somewhat more intuitive.  As a simple example, here’s how easy it is to print out the current latitude, longitude, and altitude in TinyGPS++:

Serial.print("LAT=");  Serial.println(gps.location.lat(), 6);
Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
Serial.print("ALT=");  Serial.println(gps.altitude.meters());

Both libraries extract basic position, altitude, course, time, and date, etc. from two common NMEA sentences, $GPGGA and $GPRMC. But there are a number of other interesting sentences out there, both NMEA-defined and vendor-proprietary, just waiting to be harvested.

Consider the obscure $GPRMB, for example, which provides “recommended minimum navigation information” if you have a destination waypoint defined.

$GPRMB,A,4.08,L,EGLL,EGLM,5130.02,N,00046.34,W,004.6,213.9,122.9,A*3D

With TinyGPS++ it is now possible to extract just the “L” in the third field (it means “steer Left!”). It’s easy with the new TinyGPSCustom watcher object:

TinyGPSCustom steerDirection(gps, "GPRMB", 3);
...
Serial.print(steerDirection.value()); // prints "L" or "R"

Naturally, this extra functionality comes at some cost.  TinyGPS++ consumes somewhat more memory than TinyGPS, and it’s interface is incompatible.  So how to decide whether to update?  Here’s a guide:

Consider TinyGPS++ over TinyGPS if:

  • Compatibility with existing code (using TinyGPS) isn’t necessary.
  • Your sketch is not close to reaching RAM or flash resource limits.
  • You are running on Due or processor which can take advantage of the higher precision of 64-bit “double” floating-point.
  • You prefer the more intuitive object model.
  • You need to query for NMEA data beyond the basic location, date, time, altitude, course, speed, satellites or hdop.

Feeding the Hungry Object

To get TinyGPS++ to work, you have to repeatedly funnel the characters to it from the GPS module using the encode() method. For example, if your GPS module is attached to pins 4(RX) and 3(TX), you might write code like this:

SoftwareSerial ss(4, 3);
void loop()
{
  while (ss.available() > 0)
    gps.encode(ss.read);
  ...

After the object has been “fed” you can query it to see if any data fields have been updated:

  if (gps.location.isUpdated())
  {
    Serial.print("LAT="); Serial.print(gps.location.lat(), 6);
    Serial.print("LNG="); Serial.println(gps.location.lng(), 6);
  }
} // end loop()

The TinyGPS++ Object Model

The main TinyGPS++ object contains several core sub-objects:

  • location – the latest position fix
  • date – the latest date fix (UT)
  • time – the latest time fix (UT)
  • speed – current ground speed
  • course – current ground course
  • altitude – latest altitude fix
  • satellites – the number of visible, participating satellites
  • hdop – horizontal diminution of precision

Each provides methods to examine its current value, sometimes in multiple formats and units. Here’s a complete list:

Serial.println(gps.location.lat(), 6); // Latitude in degrees (double)
Serial.println(gps.location.lng(), 6); // Longitude in degrees (double)
Serial.print(gps.location.rawLat().negative ? "-" : "+");
Serial.println(gps.location.rawLat().deg); // Raw latitude in whole degrees
Serial.println(gps.location.rawLat().billionths);// ... and billionths (u16/u32)
Serial.print(gps.location.rawLng().negative ? "-" : "+");
Serial.println(gps.location.rawLng().deg); // Raw longitude in whole degrees
Serial.println(gps.location.rawLng().billionths);// ... and billionths (u16/u32)
Serial.println(gps.date.value()); // Raw date in DDMMYY format (u32)
Serial.println(gps.date.year()); // Year (2000+) (u16)
Serial.println(gps.date.month()); // Month (1-12) (u8)
Serial.println(gps.date.day()); // Day (1-31) (u8)
Serial.println(gps.time.value()); // Raw time in HHMMSSCC format (u32)
Serial.println(gps.time.hour()); // Hour (0-23) (u8)
Serial.println(gps.time.minute()); // Minute (0-59) (u8)
Serial.println(gps.time.second()); // Second (0-59) (u8)
Serial.println(gps.time.centisecond()); // 100ths of a second (0-99) (u8)
Serial.println(gps.speed.value()); // Raw speed in 100ths of a knot (i32)
Serial.println(gps.speed.knots()); // Speed in knots (double)
Serial.println(gps.speed.mph()); // Speed in miles per hour (double)
Serial.println(gps.speed.mps()); // Speed in meters per second (double)
Serial.println(gps.speed.kmph()); // Speed in kilometers per hour (double)
Serial.println(gps.course.value()); // Raw course in 100ths of a degree (i32)
Serial.println(gps.course.deg()); // Course in degrees (double)
Serial.println(gps.altitude.value()); // Raw altitude in centimeters (i32)
Serial.println(gps.altitude.meters()); // Altitude in meters (double)
Serial.println(gps.altitude.miles()); // Altitude in miles (double)
Serial.println(gps.altitude.kilometers()); // Altitude in kilometers (double)
Serial.println(gps.altitude.feet()); // Altitude in feet (double)
Serial.println(gps.satellites.value()); // Number of satellites in use (u32)
Serial.println(gps.hdop.value()); // Horizontal Dim. of Precision (100ths-i32)

Validity, Update status, and Age

You can examine an object’s value at any time, but unless TinyGPS++ has recently been fed from the GPS, it should not be considered valid and up-to-date. The isValid() method will tell you whether the object contains any valid data and is safe to query.

Similarly, isUpdated() indicates whether the object’s value has been updated (not necessarily changed) since the last time you queried it.

Lastly, if you want to know how stale an object’s data is, call its age() method, which returns the number of milliseconds since its last update. If this returns a value greater than 1500 or so, it may be a sign of a problem like a lost fix.

Debugging

When a TinyGPS++ sketch fails, it’s usually because the object received an incomplete NMEA stream, or perhaps none at all.

Fortunately, it’s pretty easy to determine what’s going wrong using some built-in diagnostic methods:

  • charsProcessed() – the total number of characters received by the object
  • sentencesWithFix() – the number of $GPRMC or $GPGGA sentences that had a fix
  • failedChecksum() – the number of sentences of all types that failed the checksum test
  • passedChecksum() – the number of sentences of all types that passed the checksum test

If your sketch has been running a while but charsProcessed() is returning 0, you likely have a problem with your wiring or serial connection. (If data never arrives from the GPS unit, it stands to reason it’s not getting to TinyGPS++.) I often insert a little debug clause into my GPS sketches detects this condition then prints out the incoming stream:

// Debug: if we haven't seen lots of data in 5 seconds, something's wrong.
if (millis() > 5000 && gps.charsProcessed() < 10) // uh oh
{
  Serial.println("ERROR: not getting any GPS data!");
  // dump the stream to Serial
  Serial.println("GPS stream dump:");
  while (true) // infinite loop
    if (ss.available() > 0) // any data coming in?
      Serial.write(ss.read());
}

Another common failure is when the sentences sent to TinyGPS++ are incomplete. This usually happens when you retrieve the characters from the GPS so slowly or infrequently that some are lost. The symptom is easy to spot: checksum failure.

Explanation: Every NMEA sentence ends with a numeric field that represents a mathematical summing of all the characters in the sentence. It’s there to ensure data integrity. If this number doesn’t match the actual sum (perhaps because some characters went awry), TinyGPS++ simply discards the entire sentence and increments an internal “checksum failed” counter. You can read this counter with:

Serial.print("Sentences that failed checksum=");
Serial.println(gps.failedChecksum());

// Testing overflow in SoftwareSerial is sometimes useful too.
Serial.print("Soft Serial device overflowed? ");
Serial.println(ss.overflow() ? "YES!" : "No");

If the checksum counter is continually incrementing, you have a problem. (Hint: don’t use delay() in your sketch.)

Custom NMEA Sentence Extraction

One of the great new features of TinyGPS++ is the ability to extract arbitrary data from any NMEA or NMEA-like sentence. Read up on some of the interesting sentences there are out there, then check to make sure that your GPS receiver can generate them.

The idea behind custom extraction is that you tell TinyGPS++ the sentence name and the field number you are interested in, like this:

TinyGPSCustom magneticVariation(gps, "GPRMC", 10)

This instructs TinyGPS++ to keep an eye out for $GPRMC sentences, and extract the 10th comma-separated field each time one flows by. At this point, magneticVariation is a new object just like the built-in ones. You can query it just like the others:

if (magneticVariation.isUpdated())
{
  Serial.print("Magnetic variation is ");
  Serial.println(magneticVariation.value());
}

Establishing a fix

TinyGPS++ objects depend on their host sketch to feed them valid and current NMEA GPS data. To ensure their world-view is continually up-to-date, three things must happen:

  1. You must continually feed the object serial NMEA data with encode().
  2. The NMEA sentences must pass the checksum test.
  3. For built-in (non-custom) objects, the NMEA sentences must self-report themselves as valid. That is, if the $GPRMC sentence reports a validity of “V” (void) instead of “A” (active), or if the $GPGGA sentence reports fix type “0″ (no fix), then the position and altitude information is discarded (though time and date are retained).

It may take several minutes for a device to establish a fix, especially it has traveled some distance or a long time has elapsed since its last use.

Distance and Course

If your application has some notion of a “waypoint” or destination, it is sometimes useful to be able to calculate the distance to that waypoint and the direction, or “course”, you must travel to get there. TinyGPS++ provides two methods to get this information, and a third (cardinal()) to display the course in friendly, human-readable compass directions.

const double EIFFEL_TOWER_LAT = 48.85826;
const double EIFFEL_TOWER_LNG = 2.294516;
double distanceKm =
  TinyGPSPlus.distanceBetween(
    gps.location.lat(),
    gps.location.lng(),
    EIFFEL_TOWER_LAT,
    EIFFEL_TOWER_LNG) / 1000.0;
double courseTo =
  TinyGPSPlus.courseTo(
    gps.location.lat(),
    gps.location.lng(),
    EIFFEL_TOWER_LAT,
    EIFFEL_TOWER_LNG);
Serial.print("Distance (km) to Eiffel Tower: ");
Serial.println(distanceKm);
Serial.print("Course to Eiffel Tower: ");
Serial.println(courseTo);
Serial.print("Human directions: ");
Serial.println(TinyGPSPlus.cardinal(courseTo));

Library Version

You can retrieve the version of the TinyGPS++ library by calling the static member libraryVersion().

Serial.println(TinyGPSPlus::libraryVersion());

Sample Sketches

TinyGPS++ ships with several sample sketch which range from the simple to the more elaborate. Start with BasicExample, which demonstrates library basics without even requiring a GPS device, then move onto FullExample and KitchenSink. Later, see if you can understand how to do custom extractions with some of the other examples.

Acknowledgements

Thanks go out to the many Arduino forum users for outstanding help in testing and popularizing TinyGPS, this library’s predecessor. Thanks especially to Maarten Lamers, who wrote the wiring library that originally gave me the idea of how to organize TinyGPS++.

All input is appreciated.

Mikal Hart

Page last updated on September 28, 2014 at 11:35 am
429 Responses → “TinyGPS++”

  1. Stas Meirovich

    10 years ago

    Hello!
    i’ve decided to try the TinyGPS++ because i had some issues with the old TinyGPS. however, they still persist in this version too.
    i can’t really point the origin of my problem, tried a lot of different code combinations.
    im using skylab skm52 gps along with sparkfun pro micro, through the Hardwareserial connections (RX,TX), and along with i2c lcd screen.
    i get the raw mnea data from the gps receiver via the serial monitor, and it is correct (correct date and fix), however, when i try to extract the data – the values are incorrect, like it didnt read the information at all. any suggestions what i should try?

    thanks!
    Stas.


  2. Mikal

    10 years ago

    @Stas,

    Take a look at the “Debugging” section on this page and tell me what you get for charsProcessed() and failedChecksum() when you examine them repeatedly. In a correctly working program the former increments regularly, but the latter stays at 0 or 1 or 2.

    It might be instructive if you posted about 2 seconds worth of sample NMEA sentences from that receiver. Better yet, take a small sampling of them ($GPRMC and $GPGGGA–about 6) and insert them into the “BasicExample” sketch, replacing the sample sentences you see there. (Don’t forget to add \r\n to the end of each so that they are properly terminated.)


  3. Stas Meirovich

    10 years ago

    Hello again.
    the debugging came out okay, increasing number of sentences and without failed checksum.

    however, i couldn’t get the basicExample to work. its just not showing anything – even in the original code (without my MNEA). i think that is also the reason for the problem on my code… any suggestions ? here’s my NMEA sample: (i know its not connected, but it does have correct time and date, altitude etc. but still it doesn’t show them.

    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,050030.643,V,3153.5415,N,03448.7978,E,0.00,0.00,080913,,,N*79
    $GPGGA,050031.643,3153.5415,N,03448.7978,E,0,0,,133.3,M,16.7,M,,*4C
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $GPGSV,1,1,00*79
    $GPRMC,050031.643,V,3153.5415,N,03448.7978,E,0.00,0.00,080913,,,N*78
    $GPGGA,050032.643,3153.5415,N,03448.7978,E,0,0,,133.3,M,16.7,M,,*4F
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    

  4. alirezza

    10 years ago

    Hi dear mikal,
    you are really great man with great codes,
    Thanks for the TinyGPS and also TinyGPS++,
    I had a question,
    I want to get Location accuracy by using tiyngps++,
    is it possible by using : hdop – horizontal diminution of precision ?

    I’m using Ublox module which sends this sentence :

    $PUBX,00,hhmmss.ss,Latitude,N,Longitude,E,AltRef,NavStat,
      Hacc,Vacc,SOG,COG,Vvel,ageC,
      HDOP,VDOP,TDOP,GU,RU,DR,*cs
    

    Hacc and Vacc are Horizontal and Vertical Accuracy,

    How can I get it ?

    Thanks.


  5. Mikal

    10 years ago

    @stas–

    The reason why your sentences don’t work is TinyGPS++ doesn’t consider them as containing valid data.

    $GPRMC,050032.643,V,3153.5415,N,03448.7978,E,0.00,0.00,080913,,,N*7B
    $GPGGA,050033.643,3153.5415,N,03448.7978,E,0,0,,133.3,M,16.7,M,,*4E

    The problem fields are bolded above. “V” in GPRMC==”invalid” and “0″ in GPGGA==”fix quality invalid”.

    I suspect that once you get a good fix, these data will appear. Check the “goodSentences()” counter to verify that it’s not increasing.

    Meanwhile, if you really need the data before it is marked valid, you can use TinyGPSCustom objects.

    The BasicExample sketch doesn’t display anything at all?


  6. Mikal

    10 years ago

    Thanks, alirezza.

    I don’t claim to know whether you problem can be solved by extracting Hacc and Vacc, but I do know how to get those values:

    TinyGPSCustom hacc(gps, "PUBX", 9);
    TinyGPSCustom vacc(gps, "PUBX", 10);
    ...
    if (hacc.isUpdated())
      Serial.print(hacc.value());
    if (vacc.isUpdated())
      Serial.print(vacc.value());
    

  7. alirezza

    10 years ago

    Thanks dear Mikal for your fast reply,

    I read info on , http://aprs.gids.nl/nmea/#gga
    and found that HDOP is what I want,(you implemented it in your code),
    I just had another question,

    what does value 400 or 600 means for HDOP ?
    Horizontal Dilution of Precision (HDOP) ,Relative accuracy of horizontal position.

    how can we convert it to meter ?

    Thanks again.


  8. Mikal

    10 years ago

    @ailrezza,

    I consulted Wikipedia.

    (Note, however, that gps.hdop.value() returns HDOP in hundredths. In my puzzle box work, I discard position data when HDOP is above 500 (5).)


  9. Stas Meirovich

    10 years ago

    Hi mikal!
    thanks a lot! works like a charm. as soon as i took the gps outside it started updating the LCD.
    however, one weird thing: the LAT and LON that the LCD show is a little different than the one that the raw NMEA data shows on the serial monitor. first two digits are correct, but the other 6 (i use lcd.print(gps.location.lat(), 6) are different.

    any idea why?
    thanks!


  10. Mikal

    10 years ago

    @Stas,

    Yep. Because the NMEA value 7654.3210 doesn’t mean 76.543210 degrees. It means 76 degrees, 54.3210 minutes. The software translates this into the more usable decimal value 76.905350 degrees.


  11. Jose Diaz

    10 years ago

    doesn’t seem to find the gps on the Adafruit GPS shield. I’ve changed the receive/tx pins to 8,7 and baud rate to 9600. Where would I begin to troubleshoot?


  12. Mikal

    10 years ago

    Hi @Jose,

    Have you tried some of the tips in the “Debugging” section of this article? I would try Serial.write(c) for each character read from the GPS. The library itself really is device agnostic and doesn’t know about rx/tx pins or baud rates.


  13. Michael

    10 years ago

    Mr. Hart,

    Many thanks for developing TinyGPS++! It’s just been put into use on a prototype underwater robot now in development (see website), and it solved a “boatload” of problems. Great work!


  14. Mikal

    10 years ago

    @Michael–

    Hey, thanks! I saw the writeup on your website. Nice! Boatload. Heh heh. :)


  15. Clay

    10 years ago

    Mikal,

    Thank you very much for your vast contributions to the open source community.

    I have used the original TinyGPS with excellent results and am excited to try the new and improved version. I’m using an Arduino Mega and Venus638 set at 115200 baud, GPRMC and GGA messages broadcast at 20hz. Upon modifying the code for the higher baud and Serial3.read on the mega i am not receiving messages using TinyGPS++. However, if i re upload with a known good original TinyGPS sketch everything works normal. The new TinyGPS++ sketch goes into the 5 sec diagnostic loop and i can see i am getting about 60 chars per update but no valid sentences. I’ve spent a few hours troubleshooting with no progress so far.

    This is actually my first time ever posting a comment online for help but i have admitted defeat…..Do you have any suggestions for me to pursue

    Code pasted below:

    ///////////////////////////////////////////////////////////////////////////////
    #include "TinyGPSPlus.h"
    /*
       This sample code demonstrates just about every built-in operation of TinyGPS++ (TinyGPSPlus).
       It requires the use of SoftwareSerial, and assumes that you have a
       4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
    */
    static const int RXPin = 4, TXPin = 3;
    static const int GPSBaud = 115200;
    
    // The TinyGPS++ object
    TinyGPSPlus gps;
    
    // The serial connection to the GPS device
    //SoftwareSerial ss(RXPin, TXPin);
    
    // For stats that happen every 5 seconds
    unsigned long last = 0UL;
    
    void setup()
    {
      Serial.begin(115200);
      Serial3.begin(GPSBaud);
    
      Serial.println(F("KitchenSink.ino"));
      Serial.println(F("Demonstrating nearly every feature of TinyGPS++"));
      Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
      Serial.println(F("by Mikal Hart"));
      Serial.println();
    }
    
    void loop()
    {
      // Dispatch incoming characters
      while (Serial3.available() &gt; 0)
        gps.encode(Serial3.read());
      ...
    

  16. Mikal

    10 years ago

    @Clay,

    So you’ve just taken the “KitchenSink” sample and changed the GPS baud rate to 115200, and the GPS port from softserial/3/4 to hardserial/Serial3?

    Wow. 20Hz at 115200 baud is pretty brisk. During the diagnostic phase is the Failed-checksum counter increasing rapidly?

    If so, my strong suspicion is that the sketch is not able to keep up with the input stream. This is probably because KitchenSink generates a LOT of output, which slows things down dramatically. (Applications with lots of output can only work if the serial stream is quite a bit faster than the input stream, which is not the case here.)

    Can you temporarily slow your device down?

    Meanwhile, I think I would try trimming away all of the printed information you are not interested in, or perhaps starting out with a simpler sketch. Does that help? Do the other samples work?


  17. Clay

    10 years ago

    Mikal,

    That was a quick reply! I appreciate your commitment!

    -you are correct
    (I modified “Kitchen Sink” for hardware Serial3 at 115200 baud)

    -The charsprocessed increments about 58-62 each update, goodsentences, failedChecksum, and passedChecksum all stay at zero (I let it run with a valid fix for about 10 minutes)

    -I can reflash the Venus GPS and slow it back down to 1hz 4800baud for troubleshooting. I will try this and some of the other examples this evening. I will keep notes and report to you tomorrow.

    Again, Thanks for your help


  18. Clay

    10 years ago

    Mikal,

    Here is what i learned last night:

    9600 baud RMC sentence @1hz works with “Device Example” and “Kitchen Sink”

    38400 baud RMC sentence @10hz does NOT work with “Device Example” or “Kitchen Sink” (No output on Device Example; Kitchen Sink gets 49chars, 0 good, 0 fail, 0 pass)

    115200 baud RMC sentence @2hz does NOT work with “Device Example” or “Kitchen Sink” (No Device detected check wiring)

    9600 baud RMC sentence @2hz works with “Device Example” and “Kitchen Sink”

    9600 baud RMC sentence @5hz works with “Device Example” and “Kitchen Sink”

    4800 baud RMC sentence @1hz works with “Device Example” and “Kitchen Sink”

    19200 baud RMC sentence @1hz works with “Device Example” and “Kitchen Sink”

    38400 baud RMC sentence @1hz Does NOT “Device Example” and “Kitchen Sink”
    (Device Example says “No GPS Detected” and “Kitchen sink” had 4chars, 0 good, 0 fail, 0 pass)

    19200 baud RMC sentence @20hz works with “Device Example” and “Kitchen Sink”

    19200 baud RMC and GGA sentence @20hz works with “Device Example” and “Kitchen Sink”

    In summary it seems like Tiny GPSPlus has no problems dealing with RMC and GGA data at 20hz. You should have seen the “Kitchen Sink” serial monitor screen with RMC and GGA at 20hz! However, whenever the baud rate from the GPS is raised above 19200 things stop working. I have not isolated the problem to the Arduino not being able to keep up at baud rates above 19200 or the library getting behind. The original TinyGPS works fine at 115200 baud and 20hz if that helps shed any light on the problem. For my current application(car data logger) 19200 baud and RMC/GGA sentences at 20 hz work fine so i am back in business. However if all Venus GPS NEMA sentences are sent via serial at 20hz 115200 baud is automatically selected by the Venus Chip.

    I hope this is some help to you Mikal and anyone else blazing the same trail as me.

    -Cheers


  19. Bernhard K

    10 years ago

    Hi,
    I am working with Leica DGPS Receivers that give accurate results in the cm range. The NMEA sequences are the same as usual, but GGA and RMC have more digits, like

    $GPGGA,102644.00,4813.7943164,N,01621.5693035,E,2,05,2.3,215.472,M,,,0.00,0000*2B

    TinyGPS++ can parse the sequences OK, but the transformation to floats is not accurate to the last significant digit:

    4813.7943164 (NMEA) should Output 48.229905273 (degree)

    TinyGPS++ converts the Latitude to 48.229904174
    I think this Comes with the Int/float conversion that is internally done in TinyGPS++

    The error does not occur with plain vanilla GPS Receivers that are limited in their accuracy anyway.
    Do you have any idea how this could be solved? Unfortunately C/C++ is not my first language so I am more or less at a loss when trying to change the conversion Routines

    Thanks!
    Bernhard


  20. Brian

    10 years ago

    Hi!

    I’m stumped right off the bat! Arduino 1.0.5 does not allow use of either TinyGPS or TinyGPSPlus since it reports that the library name must only be ASCII, etc.

    The installed path is: Arduino\libraries\TinyGPSPlus-0.91\TinyGPS++.cpp (and other files…)

    Am I completely missing something here?

    Thanks!


  21. Mikal

    10 years ago

    @Brian,

    Yeah, an unfortunate artifact of using GitHub to distribute source is that it bundles it into a zip that contains an illegal directory name. In this case, just rename TinyGPSPlus-0.91 to TinyGPSPlus.


  22. Brian

    10 years ago

    Ah, got it… Compiles OK now, but there’s another issue (which also happens with the Adafruit library)…

    I have a uBlox NEO-6m module runnning at 38,400 baud and 5Hz. The module works perfectly when connected to an FTDI and using VisualGPS or uCenter, TeraTerm also shows the NMEA strings (as well as some “garbage” uBlox data between each set)

    Does softserial work at 38,400?

    Thanks.


  23. Brian

    10 years ago

    To follow-up, I set the NEO-6m to NMEA only, 9600 baud and the softserial still has problems getting data, it’s probably 50-75% gibberish and the rest valid NMEA sentences. Tired three different Arduino boards, no difference.

    I tried the Adafruit GPS librabry with the GPS on hardware serial #1 and it works flawlessly.

    Does TinyGPS support hardware serial, or conversely, is it possible to use softserial as the -output- path?

    Thanks.


  24. Mikal

    10 years ago

    @Clay,

    Thank you for the great summary. It’s really encouraging to see that Kitchen Sink works at 19.2K/20Hz.

    However, it’s a little premature to say that TinyGPS is better at a certain speed, or vice-versa, because a lot of the performance depends on factors in the user’s sketch beyond control of the library.

    For example, if your sketch is doing a lot of I/O to a slow serial connection, you may bog your system down so that it can’t keep up.

    Also keep in mind that no application works at a software serial link of 115,200 baud with an ATmega328p-class processor. The bits just come too fast.

    I think it would be instructive to see if TinyGPS++ can keep up with some of the faster connections like 38.4K/10Hz when you disable all the I/O.

    For example, could you add this little bit of code to “Kitchen Sink” to prevent it from doing anything for the first 60 seconds except process data?

    // Dispatch incoming characters
    while (ss.available() > 0)
      gps.encode(ss.read());
    
    if (millis() < 60000) // add this
      return;
    

    Based on your other post, I can guess that TinyGPS++ really can’t keep up at 115.2K, no matter what!


  25. Mikal

    10 years ago

    @Brian,

    TinyGPS and TinyGPS++ are completely agnostic as to where the data comes from. It could be a teletype machine. As long as you feed the encode() method with valid data, it will work, regardless of where that data came from.

    How do you know you’re seeing “gibberish” from the software serial port? Are you printing the stream out as it arrives. If it is corrupted at those high rates at only 9600 baud (relatively slow connection), then I have to guess you have a wiring issue. Is your serial device’s ground connected to Arduino Ground?


  26. Mikal

    10 years ago

    @Bernhard,

    Could you send me a link to somewhere that sells those Leica receivers? This is an interesting problem. Thanks for asking the question.

    The inaccuracy is partly due to the TinyGPS[++] parsing algorithms, which ignore all but the first four digits to the right of the decimal point. You are quite right that all the “plain vanilla” receivers don’t report any more than 4 digits, which is why the parsing routine was originally written this way. Still, I would like to try to support these more precise receivers.

    One thing to think about though, is that we are right at the limit of 32-bit floating point precision. Enhancing the parsing algorithm will only go so far on an AVR-type micro. If you really want the greater precision, you might consider migrating to the Due, whose processor supports 64-bit doubles.

    I’ll think about this a bit. Thanks for the note.


  27. Bernhard K

    10 years ago

    Hi,
    you are right, the arduino float is inaccurate after the 4th/5th digit and cannot be relied upon when it comes to accuracy in that region. Your parsing code is sane, but even if it is pimped up by increasing the number of digits (increase Multi constant etc.) things go haywire as soon as a float lat/lng value is calculated.
    If anybody has some 64bit float/double implementation (a library:-) that runs on the arduino mega/uno please post here!
    Using the Due is no way due to the 3.3V IOs
    Maybe doing everything with ints/longs right to the end is a solution. I found Mikals approach in the TinyGPS library to keep everything integer as long as possible quite ingenious!

    As for the dGPS Receivers, they are built by all major GPS companies (Leica, Trimble, Sokkia, Raytheon etc…) and are widely used for geodetic work:
    Those devices are rather costly (my pair of Leica SR530´s cost some €2500 on eBay, a new Leica GRX1200 (http://www.leica-geosystems.com/en/Leica-GRX1200-Series_5547.htm) comes at about €15000 apiece:-( – the dream machine for every geocacher and a further argument to combine them with low cost arduinos:-)

    Regards,
    Bernhard


  28. Bernhard K

    10 years ago

    Mikal,

    if you want to further dig into this here is some more NMEA code emitted from a Leica SR530 for reference.
    If you are interested in used gear, have a look here: http://www.geoaxxis.de/home.php?lang=de&sec=sec6

    Regards and many thanks for your work!
    Bernhard

    $GPRMC,102642.00,A,4813.7943074,N,01621.5693093,E,0.008,156.6705,020713,0.0000,W,D*2B
    $GPZDA,102643.00,02,07,2013,-01,00*4D $GPGGA,102643.00,4813.7943195,N,01621.5692755,E,2,05,2.3,215.481,M,,,0.00,0000*2E
    $GPGLL,4813.7943195,N,01621.5692755,E,102643.00,A,D*6F $GPVTG,319.5482,T,319.5482,M,0.012,N,0.022,K,D*25 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,47*74 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,49,18,14,278,*7D $GPGSV,3,3,14,22,11,308,,24,67,302,49,25,01,242,,26,18,161,44*75 $GPRMC,102643.00,A,4813.7943195,N,01621.5692755,E,0.012,319.5482,020713,0.0000,W,D*25
    $GPZDA,102644.00,02,07,2013,-01,00*4A $GPGGA,102644.00,4813.7943164,N,01621.5693035,E,2,05,2.3,215.472,M,,,0.00,0000*2B
    $GPGLL,4813.7943164,N,01621.5693035,E,102644.00,A,D*66 $GPVTG,31.2001,T,31.2001,M,0.006,N,0.011,K,D*20 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,46*75 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,49,18,14,278,*7D $GPGSV,3,3,14,22,11,308,,24,67,302,49,25,01,242,,26,18,161,43*72 $GPRMC,102644.00,A,4813.7943164,N,01621.5693035,E,0.006,31.2001,020713,0.0000,W,D*18
    $GPZDA,102645.00,02,07,2013,-01,00*4B $GPGGA,102645.00,4813.7943237,N,01621.5692858,E,2,05,2.3,215.408,M,,,0.00,0000*20
    $GPGLL,4813.7943237,N,01621.5692858,E,102645.00,A,D*60 $GPVTG,314.7933,T,314.7933,M,0.005,N,0.010,K,D*22 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,46*75 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,48,18,14,278,*7C $GPGSV,3,3,14,22,11,308,,24,67,302,49,25,01,242,,26,18,161,42*73 $GPRMC,102645.00,A,4813.7943237,N,01621.5692858,E,0.005,314.7933,020713,0.0000,W,D*24
    $GPZDA,102646.00,02,07,2013,-01,00*48 $GPGGA,102646.00,4813.7943069,N,01621.5693089,E,2,05,2.3,215.510,M,,,0.00,0000*27
    $GPGLL,4813.7943069,N,01621.5693089,E,102646.00,A,D*6F $GPVTG,149.6586,T,149.6586,M,0.024,N,0.044,K,D*20 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,45*76 $GPGSV,3,2,14,14,06,322,,15,51,203,48,17,44,071,47,18,14,278,*72 $GPGSV,3,3,14,22,11,308,,24,67,302,47,25,01,242,,26,18,161,42*7D $GPRMC,102646.00,A,4813.7943069,N,01621.5693089,E,0.024,149.6586,020713,0.0000,W,D*21
    $GPZDA,102647.00,02,07,2013,-01,00*49 $GPGGA,102647.00,4813.7943076,N,01621.5692998,E,2,05,2.3,215.513,M,,,0.00,0000*23
    $GPGLL,4813.7943076,N,01621.5692998,E,102647.00,A,D*68 $GPVTG,208.6662,T,208.6662,M,0.012,N,0.023,K,D*24 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,46*75 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,49,18,14,278,*7D $GPGSV,3,3,14,22,11,308,,24,67,302,49,25,01,242,,26,18,161,42*73 $GPRMC,102647.00,A,4813.7943076,N,01621.5692998,E,0.012,208.6662,020713,0.0000,W,D*2C
    $GPZDA,102648.00,02,07,2013,-01,00*46 $GPGGA,102648.00,4813.7943063,N,01621.5693122,E,2,05,2.3,215.568,M,,,0.00,0000*2C
    $GPGLL,4813.7943063,N,01621.5693122,E,102648.00,A,D*6B $GPVTG,27.6798,T,27.6798,M,0.007,N,0.012,K,D*22 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,46*75 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,47,18,14,278,*73 $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,43*73 $GPRMC,102648.00,A,4813.7943063,N,01621.5693122,E,0.007,27.6798,020713,0.0000,W,D*10
    $GPZDA,102649.00,02,07,2013,-01,00*47 $GPGGA,102649.00,4813.7943201,N,01621.5692874,E,2,05,2.3,215.464,M,,,0.00,0000*2D
    $GPGLL,4813.7943201,N,01621.5692874,E,102649.00,A,D*67 $GPVTG,304.8993,T,304.8993,M,0.010,N,0.018,K,D*2E $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,40,242,46*75 $GPGSV,3,2,14,14,06,322,,15,51,203,50,17,44,071,48,18,14,278,*74 $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,43*73 $GPRMC,102649.00,A,4813.7943201,N,01621.5692874,E,0.010,304.8993,020713,0.0000,W,D*23
    $GPZDA,102650.00,02,07,2013,-01,00*4F $GPGGA,102650.00,4813.7943160,N,01621.5692867,E,2,05,2.3,215.484,M,,,0.00,0000*2D
    $GPGLL,4813.7943160,N,01621.5692867,E,102650.00,A,D*69 $GPVTG,172.6498,T,172.6498,M,0.012,N,0.022,K,D*25 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,41,242,46*74 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,48,18,14,278,*7C $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,43*73 $GPRMC,102650.00,A,4813.7943160,N,01621.5692867,E,0.012,172.6498,020713,0.0000,W,D*24
    $GPZDA,102651.00,02,07,2013,-01,00*4E $GPGGA,102651.00,4813.7943127,N,01621.5692753,E,2,05,2.3,215.500,M,,,0.00,0000*2A
    $GPGLL,4813.7943127,N,01621.5692753,E,102651.00,A,D*63 $GPVTG,72.7684,T,72.7684,M,0.002,N,0.005,K,D*21 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,41,242,46*74 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,48,18,14,278,*7C $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,42*72 $GPRMC,102651.00,A,4813.7943127,N,01621.5692753,E,0.002,72.7684,020713,0.0000,W,D*10
    $GPZDA,102652.00,02,07,2013,-01,00*4D $GPGGA,102652.00,4813.7943210,N,01621.5692787,E,2,05,2.3,215.481,M,,,0.00,0000*2F
    $GPGLL,4813.7943210,N,01621.5692787,E,102652.00,A,D*6E $GPVTG,185.9413,T,185.9413,M,0.001,N,0.002,K,D*25 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,41,242,45*77 $GPGSV,3,2,14,14,06,322,,15,51,203,48,17,44,071,47,18,14,278,*72 $GPGSV,3,3,14,22,11,308,,24,67,302,47,25,01,242,,26,18,161,41*7E $GPRMC,102652.00,A,4813.7943210,N,01621.5692787,E,0.001,185.9413,020713,0.0000,W,D*25
    $GPZDA,102653.00,02,07,2013,-01,00*4C $GPGGA,102653.00,4813.7942967,N,01621.5692876,E,2,05,2.3,215.551,M,,,0.00,0000*29
    $GPGLL,4813.7942967,N,01621.5692876,E,102653.00,A,D*64 $GPVTG,157.6941,T,157.6941,M,0.025,N,0.047,K,D*22 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,41,242,46*74 $GPGSV,3,2,14,14,06,322,,15,51,203,48,17,44,071,47,18,14,278,*72 $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,42*72 $GPRMC,102653.00,A,4813.7942967,N,01621.5692876,E,0.025,157.6941,020713,0.0000,W,D*23
    $GPZDA,102654.00,02,07,2013,-01,00*4B $GPGGA,102654.00,4813.7943086,N,01621.5692754,E,2,05,2.3,215.496,M,,,0.00,0000*2C
    $GPGLL,4813.7943086,N,01621.5692754,E,102654.00,A,D*6B $GPVTG,335.1416,T,335.1416,M,0.008,N,0.016,K,D*29 $GPGSV,3,1,14,01,02,017,,04,00,116,,09,72,313,,12,41,242,46*74 $GPGSV,3,2,14,14,06,322,,15,51,203,49,17,44,071,48,18,14,278,*7C $GPGSV,3,3,14,22,11,308,,24,67,302,48,25,01,242,,26,18,161,42*72 $GPRMC,102654.00,A,4813.7943086,N,01621.5692754,E,0.008,335.1416,020713,0.0000,W,D*2D


  29. Mikal

    10 years ago

    @Bernhard,

    Thank you for your message. Today I completely rewrote the way the degrees/minutes parsing algorithm works, and I’m pleased to say that version 0.92 now supports your nice Leica receiver at the maximum accuracy your processor can support.


  30. Beat

    10 years ago

    Wow, this is exactly what I searched for… one year ago ;-)
    I had the pain to parse a ultrasonic wind sensor from the beginning.
    Maybe for the next update i will rewrite the code to use TinyGPS++ as parser.
    Seems to be much less complex to use.

    $IIMWV,097.0,R,003.6,M,A*35
    Wind angle 000.0° to 359.0°
    Relative reference
    Wind speed unit N = knots, M= m/s, K=km/h
    Status A : available, V=Alarm

    $WIXDR,C,022.0,C,,*52
    Temperature of wind
    Unit of measure C = Celsius, F= Fahrenheit

    Sensor Manufacturer: http://www.lcjcapteurs.com/?lang=en


  31. Mikal

    10 years ago

    @Beat,

    Yeah, that would have been pretty easy with TinyGPS++. :) Sorry I didn’t build it earlier.


  32. Mikal

    10 years ago

    @Bernhard,

    I’m happy to report that TinyGPS++ v0.92 perfectly solves this problem!


  33. Luis

    10 years ago

    Hello Mikal

    Thanks to share your library with us!
    I’m new using GPS with Arduino and I am lost using it.

    Can you give me one easy example of using TinyGPS++ to acquire only Latitude and Longitude?

    Thanks


  34. Mikal

    10 years ago

    Hi @Luis, and welcome to the pleasant world of GPS!

    Take a look at the “DeviceExample” sample sketch that comes with the library (File/Examples/TinyGPSPlus/DeviceExample). I think this will be just what you need.


  35. Daniel

    10 years ago

    Hi Mikal.

    Your library runs on my Arduino Uno perfectly.
    But unfortunately I have a problem. I´ve loaded the code on an Attiny85.
    Most of it works. Only the speed value. I dont get any speed values out of the GPS Modul. But all other stuff like satellites or altitude works fine!

    Do you have an idea?

    Thanks


  36. Mikal

    10 years ago

    @Daniel, are you using exactly the same GPS device in both cases? Assuming so, I can only guess that you are dropping the GPRMC sentence (which contains the speed value) and not the GPGGA sentence. This would suggest that you are not processing the incoming characters fast enough anymore. Check the statistics counters. Are you getting checksum errors?


  37. Luis Ignacio

    10 years ago

    Mikal!

    Thanks for the library! Now, I have a problem that I think you can resolve.

    Recently I bought a ublox neo 6m gps module, I connected it and when I run the DeviceExample , changing the gps baud form 4800 to 9600(if I keep the 4800 the serial monitor doesnt show anything), the output is:
    Location: INVALID Date/Time: 0/0/2000 00:00:00.00

    all the time. So, what can be the problem? Thanks.

    PD: sorry for my english.


  38. Mikal

    10 years ago

    Luis,

    Could you please dump the raw NMEA data coming from the GPS? Change

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

    to

      while (ss.available() > 0)
      {
        char c = ss.read();
        Serial.write(c);
        if (gps.encode(c))
          displayInfo();
      }
    

  39. Mikal

    10 years ago

    @Luis,

    One more thought. I think you must not be getting a valid fix? Is your module outdoors with a clear sky view? Did you wait several minutes?


  40. Onire

    10 years ago

    Hi,
    I have a mediatek 3329 connected to my arduino uno by pin Rx 2 and TX 3,
    if I use the example test_with_gps_device of the TinyGPS it works fine, but with TinyGPS++ I recive this message “No GPS detected”.
    Why?
    Thank you


  41. Mikal

    10 years ago

    @Onire,

    I have no idea how that could be. Under identical circumstances, those two should behave the same. Which example TinyGPS++ program are you running? Could you print out the character stream as it arrives from the soft serial port? Did you change the rx and tx pins in the example?


  42. Onire

    10 years ago

    Hi Mikal,
    I found the problem, if I use this code doesn’t work:
    static const int RXPin = 2, TXPin = 3;
    static const int GPSBaud = 38400;

    // The TinyGPS++ object
    TinyGPSPlus gps;

    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);

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

    but if I change into ss.begin(38400), it works!
    Why?


  43. Mikal

    10 years ago

    @Onire,

    Ah! Yes. The problem is that for many Arduino devices the maximum “int” value is 16383. If you select 38400, it’s too big and silently overflows. I should change the example to

    static const unsigned long GPSBaud = XXXX;

    Thanks for figuring that out.


  44. Martin

    10 years ago

    Mikal,

    Thanks so much for the great library – it’s proving useful. Needless to say, I have a question for you.

    I’m tight on program space, and I need to record lat/lon to an SD card. What method would you recommend to translate the double containing each measurement into a sting to be written to the card? As an alternative, I guess I could convert the billionths, but they would need to be zero-filled to make them the correct length.

    Thanks again,

    Martin


  45. Mikal

    10 years ago

    Thanks Martin.

    Yes, it’s quite the pain that you can’t simply sprintf a double/float in the AVR version of gcc.

    What I do to solve exactly the problem you are up against is to use my own PString library. PString is an object that acts like an output device, but is actually just a character buffer. That way you can buf.println() stuff and it ends up in the character buffer. Example, taken from my balloon tracking code, which does just what you describe: logs lat and long to SD:

    char buf[40]; // output buffer
    PString strbuf(buf, sizeof(buf)); // create the PString object to wrap buf
    strbuf.print(latitude, 5); // print latitude to 5 digits' precision
    strbuf.print(",");
    strbuf.print(longitude, 5);
    

    Now you should be able to write buf to SD. Clear?


  46. Martin

    10 years ago

    Hi Mikal,

    The PString library is great – very economical. Thanks for the steer. It just shows how massively wasteful some string converters are.

    Just one more question. Will the TinyGPSPlus object manage more than one device? I have the Adafruit board working really well as a TinyGPSPlus object, but I need also to receive NMEA data from a laser rangefinder. As soon as I declare a second TinyGPSPlus object, things seem to go awry, and I can no longer receive data from any NMEA object.

    Thanks again,

    Martin


  47. Sam

    10 years ago

    TinyGPS++ v0.94 returns v0.92
    Sam


  48. Sam

    10 years ago

    TingGPS++ 0.94b gives the following errors. The member names are in the KEYWORDS list but the sketch will not compile. Also the version is still 0.92. Sketch worked under 0.92

    BuddyTFTplus.ino: In function ‘void parseGPS(TinyGPSPlus&, char*)’:
    BuddyTFTplus:116: error: ‘struct TinyGPSLocation’ has no member named ‘rawLatDegrees’
    BuddyTFTplus:118: error: ‘struct TinyGPSLocation’ has no member named ‘rawLatBillionths’
    BuddyTFTplus:121: error: ‘struct TinyGPSLocation’ has no member named ‘rawLatBillionths’
    BuddyTFTplus:123: error: ‘struct TinyGPSLocation’ has no member named ‘rawLngDegrees’
    BuddyTFTplus:125: error: ‘struct TinyGPSLocation’ has no member named ‘rawLngBillionths’
    BuddyTFTplus:128: error: ‘struct TinyGPSLocation’ has no member named ‘rawLngBillionths’

    Sam


  49. Mikal

    10 years ago

    @Sam,

    Yes, unfortunately we had to make a small change in the API to fix a bug. See KitchenSink for examples. Use instead of what you have there:

    rawLat().deg
    rawLat().billionths

    And if

    rawLat().negative

    is true, then the entire expression should be considered negative.

    Sorry for inconvenience.


  50. Mikal

    10 years ago

    Yes, sorry, another oversight. Thanks.

29 Trackbacks For This Post
  1. TinyGPS++ to the Rescue | Stainless Steelhead

    [...] to the brains behind Arduiniana, Mikal Hart, Poolbot has moved to the brand-new GPS library set, TinyGPS++.  This saved enormous time in developing custom code to process and check the validity of NMEA [...]

  2. Antenna tracker, first steps | kolin's

    [...] or none, I made simple arduino program for parsing NMEA crap and encoding it in LTM packets. I used TinyGPS++ library for parsing NMEA and few lines from TauLabs [...]

  3. GPS Ublox Neo-6M cu Arduino Uno | ArduHobby

    [...] Descarcati biblioteca tinyGPS sau tinyGPS++. [...]

  4. GPS-Logger | Pascal's Königreich

    [...] Card Breakout Board gibt’s bei Adafruit, um mit dem GPS Modul zu sprechen wurde die Library TinyGPS++ [...]

  5. GPS Distance Calculator (for golf) -Use Arduino for Projects

    [...] Tiny GPS++ [...]

  6. Arduino GPS with OLED Display | Home of Benty

    [...] OLED from Adafruit. It’s still a work in progress just squishing together code from the TinyGPS++ library and using the Adafruit GFX [...]

  7. SpainLabs - Mantener tus proyectos en hora

    [...] Con Arduino puedes usar la librería tyniGPS++. [...]

  8. Prototype 1 – GPS Module | A Mean Center

    [...] something useful with it. This isn’t due to any competence on my part, but because of  the TinyGPS++ library by Mikal Hart which is just amazing. There are many examples included with the library, so it is [...]

  9. Unexpected behavior of sprintf with i32/u32 | CL-UAT

    [...] trying to build a string of characters from several elements given by the TinyGPS++ library with the use of [...]

  10. Connecting u-blox NEO-6M GPS to Arduino | Big Dan the Blogging Man

    [...] http://arduiniana.org/libraries/tinygpsplus/ [...]

  11. LatLong to XY | Rocket Project

    [...] the same. latlon2xy is the doc with the Arduino code. Since I last looked at GPS, Mikal Hart has an updated GPS library that computes distanceBetween() and courseTo(). It might be worth pursuing. Share [...]

  12. با برد آردوینو و شیلد GPRS دستگاه ردیاب کوچک و کارآمد بسازید | رایانش نیوز

    [...] این کتابخانه را برای استفاده از برد GPS دانلود کنید. سپس کدهای [...]

  13. Shield GPS Ublox NEO-6M – Programación con Arduino MEGA 2560 – Tecno-fly C.A

    [...] http://arduiniana.org/libraries/tinygpsplus/ [...]

  14. Leyendo datos del GPS – OCEANO ABIERTO

    [...] Arduino que nos permite convertir esas cadenas de caracteres en valores fácilmente interpretables: TinyGPSplus. Tendremos que descargar el archivo .zip de la última versión e instalarlo manualmente en nuestro [...]

  15. Lightweight Module for Collecting Stratospheric Microbes | HENRY-1 HAB MISSION

    [...] RBBB was programmed with Arduino’s IDE and includes both the TinyGPS++ and Arduino Servo libraries. The TinyGPS library is very effective at parsing NMEA GPS data [...]

  16. How to make a GPS Speedometer? – DFRobot

    [...] following library ‘s in your Arduino Library Folder. U8glib – For the oled display. TinyGps++ – For the GPS. The code is “printing” the speed, course, number of satellites, [...]

  17. IoT WiFi Boat Monitor | Mechinations

    [...] Next, grab the starting source code. You will also need to install the TinyGPS++ library. [...]

  18. Adding Location to Microcontroller Projects: GPS Tutorial | Teach Me Micro

    [...] levels hence a voltage divider is needed to step down the voltage from the Arduino.You can use the TinyGPS++ library for easier Arduino GPS interfacing. Here's an example sketch from the library (modified to fit [...]

  19. Using Seeeduino LoRaWAN with GPS and Loriot.io – Squix – TechBlog

    [...] temperature and humidity we have to install two libraries. Download the TinyGpsPlus library from http://arduiniana.org/libraries/tinygpsplus/ Then install also the DHT library from Adafruit from the library manager in the Sketch > [...]

  20. GPS CLOCK with M5STACK | macsbug

    [...]  TinyGPS++ [...]

  21. Guide to NEO-6M GPS Module Arduino | Random Nerd Tutorials

    [...] to get information on location in a format that is useful and easy to understand. You can click here for more information about the TinyGPS++ [...]

  22. GPS With Arduino Tutorial | How To Interface GPS With Arduino using tiny gps++

    [...] Tiny GPS Library Download Table of Contents1 How to Interface GPS with Arduino Uno2 GPS  Arduino Code Display on Serial Monitor3 How to Display Longitude and Latitude on LCD3.1 16×2 LCD and Arduino Connection4 Arduino GPS LCD Code5 GPS Arduino Projects [...]

  23. GPS Tutorial–Sending GPS Coordinates over GSM | alselectro

    [...] http://arduiniana.org/libraries/tinygpsplus/ [...]

  24. GY-NEO6MV2 GPS Module – Mr. Robotrick

    [...] tiny GPS Module can connect to 4 Sattelite and it is pretty accurate. The library I use to interact with this module makes getting coordinates very easy., just add it to your [...]

  25. GPS Neo-6M com Arduino - Aprenda a usar - Blog Eletrogate

    [...] Biblioteca TinyGPS++ Avaliações: 5.0. de 1 voto. Por favor, aguarde…{"item":{"entity":"posts","name":"post","id":3185,"item_id":74,"nonce":"60e8e7599d"},"render":{"args":{"echo":false,"entity":"posts","name":"post","item_id":null,"id":3185,"method":"stars-rating","series":null},"method":{"disable_rating":false,"allow_super_admin":true,"allow_user_roles":["administrator","editor","author","contributor","subscriber"],"allow_visitor":true,"allow_author":false,"template":"default","alignment":"center","responsive":true,"distribution":"normalized","rating":"average","style_type":"font","style_name":"star","style_size":30,"font_color_empty":"#cccccc","font_color_current":"#ffcb05","font_color_active":"#ffd016","style_class":"","labels":["Pu00e9ssimo","Ruim","Bom","u00d3timo","Excelente"]}},"stars":{"max":5,"resolution":100,"responsive":true,"current":100,"char":"s","name":"star","size":30,"type":"font"},"labels":["Pu00e9ssimo","Ruim","Bom","u00d3timo","Excelente"]} [...]

  26. Wio LTEで遊んでみる(その5:3軸デジタル加速度センサーとGPS) | IT技術情報局

    [...] が、これだけだと読みにくい。 なので、上記のサイトをそのまま参考にTinyGPS++」を使用して読みやすくする。 [...]

  27. Cara Menggunakan GPS Ublox Neo 6M + Arduino – Coretan Aja

    [...] http://arduiniana.org/libraries/tinygpsplus/ http://geekistuff.blogspot.com/2014/06/advance-u-blox-neo-6m-gps-module.html Bagikan ini:TwitterFacebookGoogleSukai ini:Suka Memuat… [...]

  28. Using the GT-U7 GPS module based on u-blox 7th generation GPS chip – Pseudo Random

    [...] http://arduiniana.org/libraries/tinygpsplus/ [...]

  29. In-Depth: Interface ublox NEO-6M GPS Module with Arduino

    [...] to Mikal Hart for his great contribution. His website Arduiniana.org has a full overview of all of the capabilities of the TinyGPS++ [...]

Leave a Reply