Examplecode for GPS functionality on the QW-GPS-DEVKIT.

Dependencies:   mbed

Fork of HelloWorld - QW Development kit by Quicksand micro-electronics

Firmware

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

AT$GPS=1,16,0,65535,1,1

A timer sends the latests gps fix every 30 seconds or 10 minutes to the SIGFOX backend using the following command:

AT$GSND

LED3 burns if a 30 second interval is set. LED4 burns if a 10 minute interval is set. Switching between intervals can be done using button 1.

Button 2 instantly sends the latests fix to the SIGFOX cloud.

Settings in the SIGFOX backend

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

/media/uploads/quicksand/gpsdecode.jpg

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

/media/uploads/quicksand/gpsdecoded.jpg

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.

/media/uploads/quicksand/nofix.jpg

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.

/media/uploads/quicksand/nmea.jpg

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):

$GPRMC,235316.000,A,4003.9040,N,10512.5792,W,0.09,144.75,141112,,*19
$GPGGA,235317.000,4003.9039,N,10512.5793,W,1,08,1.6,1577.9,M,-20.7,M,,0000*5F
$GPGSA,A,3,22,18,21,06,03,09,24,15,,,,,2.5,1.6,1.9*3E

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

Note, every 30 seconds an "OK" will appear after sending the SIGFOX message.

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:

/media/uploads/quicksand/track.jpg

/media/uploads/quicksand/trackmap.jpg

main.cpp

Committer:
quicksand
Date:
2015-10-30
Revision:
0:49858c4c3500
Child:
1:18afd4c75c6e

File content as of revision 0:49858c4c3500:

#include "mbed.h"

DigitalOut LED_0 (PB_6);
DigitalOut LED_1 (PA_7);
DigitalOut LED_2 (PA_6);
DigitalOut LED_3 (PA_5);
InterruptIn SW1(PB_10);
InterruptIn SW2(PA_8);

Ticker hartbeat;

typedef struct{
   bool busy;
   char button;
} TX_BUTTON;

TX_BUTTON Button_tx;

void beat() {
    LED_0 = !LED_0;
}
 
//Virtual serial port over USB
Serial pc(USBTX, USBRX);
Serial modem(PA_9, PA_10);

void sw1interrupt(){
        pc.printf("Button 1 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0)\n");
        modem.printf("AT$SF=42 55 54 54 4f 4e 20 31 00 00 00 00,2,0\n");
        LED_1 = 0;
        wait(0.25);
        // Flush the echo of the command:
        while(modem.readable()) modem.getc();
        Button_tx.busy = true;
        Button_tx.button = 1;
} 

void sw2interrupt(){
        pc.printf("Button 2 pressed, sending sigfox message (command is AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0)\n");
        modem.printf("AT$SF=42 55 54 54 4f 4e 20 32 00 00 00 00,2,0\n");
        LED_2 = 0;
        wait(0.25);
        // Flush the echo of the command:
        while(modem.readable()) modem.getc();
        Button_tx.busy = true;
        Button_tx.button = 2;           
} 

int main() {
    
    LED_0 = 1;
    LED_1 = 1;
    LED_2 = 1;
    LED_3 = 1;
    hartbeat.attach(&beat, 0.5);
    Button_tx.busy = false;
    Button_tx.button = 0;    
    SW2.fall(&sw1interrupt);
    SW1.fall(&sw2interrupt);
    char responsebuffer[2];
    char c; 
    while(1) {   
        if(pc.readable()) {
            modem.putc(pc.getc());
        }
        
        if(modem.readable()) {
            c = modem.getc();
            responsebuffer[0] = responsebuffer[1];
            responsebuffer[1] = c;
            if(Button_tx.busy)
            {
                if(responsebuffer[0] == 'O' && responsebuffer[1] == 'K' )
                {
                    // Everything went fine, turn off the LED
                    Button_tx.busy = false;
                    if(Button_tx.button == 1) LED_1 = 1;
                    if(Button_tx.button == 2) LED_2 = 1;
                }    
            }    
            pc.putc(c);
        }
    }
}