First version (beta) of a GPS application for the QW GPS shield that does its own NMEA parsing. It sends out gps data in the TD_GEOLOCATION format, but replaces the first byte with the temperature. Note that some features of the NMEA library are untested.

Dependencies:   QW_NMEA QW_Sensors mbed


This program starts the GPS on the TD1204 in continuous navigating mode using the following AT-command:


A NMEA message parser decodes the data coming from the UBX G7020 GPS-receiver inside the TD1204. A timer sends the latests gps fix and temperature every 15 minutes to the SIGFOX backend or whenever a button is pressed.

Sending 'a' through the virtual com port, sends a TD_GEOLOCATION packet without modifications (so without temperature). The command sent to the TD1204 is: AT$GSND

  • LED0 toggles every second.
  • LED2 burns when a GPS position is sent without a position fix.
  • LED3 burns when a GPS position is sent with a valid fix.

The GPS packet is a modified version of a standard TD_GEOLOCATION packet. This allows a the temperature to be sent along with the GPS position.

How to decode a TD_GEOLOCATION GPS frame

Here is how to decode the data contained into this frame:

frame example: 1701010005bb688ddd602590

  • [0x17] byte 1: temperature in °C, stored as a signed char. In this example this is 0x17 which corresponds to 23°C.
    A negative temperature example: 0xE9 represents -23°C. Only in this modified TD_GEOLOCATION frame
  • [0x0] nibble 3: reserved for future use.
  • [0x1010] nibble 4-7: This part tells you this is a GPS frame encoded according to GPS_DATA_XYZ_SV_HDOP.
  • [0x005bb688ddd6] nibble 8-19: This part contains the position and should be decoded like this:
    0x005bb688ddd6 = 393904446934 (decimal) => 00°39.390' 44°46.934' (longitude ; latitude)
  • [0x025] 12 bits for the altitude x 2 meters. In this case 0x025 = 37*2= 74 meters.
  • [0x90] = 10010000 in binary.
    - 1 bit for longitude sign ( 0 = positive, 1 = negative) => 1 => -00°39.390'
    - 1 bit for latitude sign ( 0 = positive, 1 = negative) => 0 => +44°46.934'
    - 1 bit for altitude sign ( 0 =positive, 1 = negative) => 0 => +74 meters
    - 3 bits for satellites in view => 4
    - 2 bits for overall horizontal dilution of precision going from 0 (very good) to 3 (bad).

Settings in the SIGFOX backend

Create a new device-type and set display typte to Geolocation > Telecom Design.


Assign your development kit to this device-type and the decoding will happen automatically:


Data if no GPS fix was found!

Note: The data looks like this if your device didn't get a valid fix before the transmission of a SIGFOX packet.


You can follow the NMEA messages of the GPS if you open up a terminal and connect to the virtual com-port of the QW shield. More info about NMEA messages can be found HERE.


GPS data is displayed in different message formats over a serial interface. There are standard and non-standard (proprietary) message formats. Nearly all GPS receivers output NMEA data. The NMEA standard is formatted in lines of data called sentences. Each sentence contains various bits of data organized in comma delimited format (i.e. data separated by commas). Here’s example NMEA sentences from a GPS receiver with satellite lock (4+ satellites, accurate position):


For example, the GPGGA sentence above contains the following:

  • Time: 235317.000 is 23:53 and 17.000 seconds in Greenwich mean time
  • Longitude: 4003.9040,N is latitude in degrees.decimal minutes, north
  • Latitude: 10512.5792,W is longitude in degrees.decimal minutes, west
  • Number of satellites seen: 08
  • Altitude: 1577 meters

More information about the NMEA sentences coming from the TD1204 can be found in the following datasheet of the u-blox 7 series: Link.

You can even open up a track of your device:



More information and other example code can be found on the component page by clicking the link below:

Files at this revision

API Documentation at this revision

Wed May 18 18:57:09 2016 +0000
Commit message:
Changed default timing to 15 minutes between packets.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed May 18 14:53:38 2016 +0000
+++ b/main.cpp	Wed May 18 18:57:09 2016 +0000
@@ -1,7 +1,7 @@
 #include "mbed.h"
 #include "GPS.h"
 #include "LinearTempSensor.h"
-#define updateinterval  30
+#define updateinterval  900
 DigitalOut LED_0 (PB_6);
 DigitalOut LED_1 (PA_7);