An SMS based GPS tracker using the Adafruit Ultimate GPS module http://www.adafruit.com/products/746 and the Seeed Studio GPRS shield (Sim900 chipset) http://www.seeedstudio.com/depot/gprs-shield-p-779.html?cPath=132_134

Dependencies:   GPS MODSERIAL mbed-rtos mbed

SMS based GPS tracker

This is an SMS based GPS tracker using using the Adafruit Ultimate GPS module and the Seeed studio GPRS arduino shield [SIM900 chipset]. The idea of this project is to leverage the free SMS between Virgin mobile prepaid SIM cards in Australia for long distance communication.

Currently the GPRS shield is switched on manually, and should be done about 10 seconds before powering the mbed/GPS in order to disable echo properly during start up. This could easily be fixed by switching the GPRS shield with the mbed at start up, waiting the 10 seconds, set the echo then flush the buffer.

The mbed can read all 160 ASCII chars sent in a message for control.

http://i47.tinypic.com/35alpue.png http://i48.tinypic.com/2mi3y0z.png http://i45.tinypic.com/jkeyvt.png

The Seeed GPRS shield http://www.seeedstudio.com/depot/gprs-shield-p-779.html?cPath=132_134

The Adafruit Ultimate GPS http://www.adafruit.com/products/746

Files at this revision

API Documentation at this revision

Comitter:
SamClarke
Date:
Sat Oct 13 02:09:33 2012 +0000
Parent:
11:fad4b451bec8
Child:
13:d8ee6b45bd0a
Commit message:
Now has the ability to receive 160 chars for control

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Oct 12 04:58:17 2012 +0000
+++ b/main.cpp	Sat Oct 13 02:09:33 2012 +0000
@@ -1,3 +1,34 @@
+/******************************************************
+* This is an SMS based GPS tracker using using the    *
+* Adafruit Ultimate GPS module and the Seeed studio   *
+* GPRS arduino shield [SIM900 chipset].               *
+*                                                     *
+* The idea of this project is to leverage the free    *
+* SMS between Virgin mobile prepaid SIM cards in      *
+* Australia for long distance communication.          *
+*                                                     *
+* NOTE: sendSms() sends the GPS 'extra' data          *
+* (eg. speed, heading etc) in one message, and your   *
+* location as a google maps URL in another message.   *
+* If you are an Iphone user, you can replace the      *
+* "https" in the URL with "http" and remove the ".au" *
+* to get the URL to open in the native maps app.      *
+* however I have found this to be less accurate by    *
+* the fact that it doesn't drop a marker on the       *
+* real locataion, but looks for the nearest address.  *
+* it seems that the internal GPS is the only object   *
+* able to be placed unrestricted on the map.          *
+*                                                     *  
+* October 2012                 Written by: Sam Clarke *
+******************************************************/
+/******************************************************
+* HelloCylon                                          *
+* By Leo Febey Oct 18 2011                            *
+* Displays a looping pattern on the built in LEDs on  *
+* the mbed which looks somewhat like a Cylon eye      *
+* scanner pattern.                                    *
+******************************************************/
+
 #include "mbed.h"
 #include "GPS.h"
 #include "rtos.h"
@@ -6,16 +37,16 @@
 
 using namespace std;
 
-const string GoogleChunk = "https://maps.google.com.au/maps?q=";
-const string GoogleExtras = "&z=20";
-char GPRSbuffer[513];
-char NUMBER[13];
-char MESSAGE[5];
+const string GoogleChunk = "https://maps.google.com.au/maps?q=";   // URL constant
+const string GoogleExtras = "&z=20";                               // Zoom Level (0-20)
+char GPRSbuffer[512];
+char NUMBER[13];    
+string MESSAGE;
 int index;
 int i = 0;
 
 GPS gps(p9,p10);
-MODSERIAL GPRS(p13,p14);                                      
+MODSERIAL GPRS(p13,p14);
 MODSERIAL pc(USBTX,USBRX);
 
 DigitalOut myled1(LED1);
@@ -23,7 +54,7 @@
 DigitalOut myled3(LED3);
 DigitalOut myled4(LED4);
 
-void led_thread(void const *argument)                         // Some light jazz in a thread
+void led_thread(void const *argument)                                  
 {
     while (true) {
         DigitalOut leds[4] = {myled1, myled2, myled3, myled4};
@@ -50,7 +81,8 @@
     GPRS.printf("AT+CMGS=\"%s\"\r\n", NUMBER);
     wait(1);
     // Write out the GPS data in a message
-    GPRS.printf("UTC Time: %4.2f \nAltitude: %3.2fm\nSpeed: %3.2f Kn\nHeading: %3.2f Deg\nGPS data grade: [%c]\nSatellites in use: [%d]\nSatFix code: [%d] \nFix type: ", gps.time, gps.altitude, gps.speed, gps.heading, gps.validity, gps.satellites, gps.fixtype);
+    GPRS.printf("UTC Time: %4.2f \nAltitude: %3.2fm\nSpeed: %3.2f Kn\nHeading: %3.2f Deg\nGPS data grade: [%c]\nSatellites in use: [%d]\nSatFix code: [%d] \nFix type: ",
+                gps.time, gps.altitude, gps.speed, gps.heading, gps.validity, gps.satellites, gps.fixtype);
     if(gps.fixtype == 1) {
         GPRS.printf("Positive");
     }
@@ -90,10 +122,11 @@
     // If we get an SMS notification....
     if (sscanf(GPRSbuffer, "$$+CMTI: \"SM\",%d", &index)>0) {
         pc.printf("\nSMS recieved @ index [%d]", index);
-        memset(GPRSbuffer, '0', 512);
+        memset(GPRSbuffer, '0', 511);
         i = 0;
+        pc.printf("\nOpening message...");
+        // ask GPRS to read the message
         GPRS.printf("AT+CMGR=%d\r\n", index);
-        //wait(1);
     }
 
     if (strncmp(GPRSbuffer, "$$+CMGR",7) == 0 ) {
@@ -101,30 +134,33 @@
         char *n = strstr(GPRSbuffer,"+6");
         strncpy(NUMBER, n, 12);
         // Get the message out
-        char *m = strstr(GPRSbuffer,"\"$$")+3;     
-        strncpy(MESSAGE, m, 4);
+        char * pch;
+        pch = strtok (GPRSbuffer, "$$");
+        pch = strtok (NULL, "$$");
+        MESSAGE = pch;
+        pc.printf("\nDone! ");
         // Send the location
         sendSms();
         // Reset the GPRS buffer
-        memset(GPRSbuffer, '0', 512);
+        memset(GPRSbuffer, '0', 511);
         // Reset the char counter
         i = 0;
     }
 
     if (strncmp(GPRSbuffer, "$$+CMGS",7) == 0) {
         // Reset the GPRS buffer
-        memset(GPRSbuffer, '0', 512);
+        memset(GPRSbuffer, '0', 511);
         // Reset the char counter
         i = 0;
     }
 
     if (strncmp(GPRSbuffer, "$$RING",6) == 0) {
         GPRS.printf("ATH0\r\n");
-        pc.printf("\nCall recieved");
+        pc.printf("\nCall bounced!...");
         // Do the send SMS routine...
         sendSms();
         // Reset the GPRS buffer
-        memset(GPRSbuffer, '0', 512);
+        memset(GPRSbuffer, '0', 511);
         // Reset the char counter
         i = 0;
     }
@@ -132,7 +168,7 @@
     pc.printf("\nThe last number was : %s", NUMBER);
     pc.printf("\nThe last message was : %s", MESSAGE);
     // Reset the GPRS buffer
-    memset(GPRSbuffer, '0', 512);
+    memset(GPRSbuffer, '0', 511);
     // Reset the char counter
     i = 0;
 }
@@ -142,7 +178,7 @@
     pc.baud(115200);
     GPRS.baud(19200);
     Thread thread(led_thread);
-    memset(GPRSbuffer, '0', 512);
+    memset(GPRSbuffer, '0', 511);
     pc.printf("\nI'm Alive...\n");
     // Setup the GPS
     gps.Init();