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

Committer:
SamClarke
Date:
Tue Oct 09 18:48:48 2012 +0000
Revision:
9:bec6e8f731f2
Parent:
8:d4773b6449c5
Child:
10:059cde049cd6
cleaned up :)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SamClarke 0:5b4bcbd69509 1 #include "mbed.h"
SamClarke 0:5b4bcbd69509 2 #include "GPS.h"
SamClarke 0:5b4bcbd69509 3 #include "rtos.h"
SamClarke 0:5b4bcbd69509 4 #include "MODSERIAL.h"
SamClarke 0:5b4bcbd69509 5 #include <string>
SamClarke 0:5b4bcbd69509 6
SamClarke 0:5b4bcbd69509 7 using namespace std;
SamClarke 0:5b4bcbd69509 8
SamClarke 9:bec6e8f731f2 9 const string GoogleChunk = "https://maps.google.com.au/maps?q=";
SamClarke 0:5b4bcbd69509 10 const string GoogleExtras = "&z=20";
SamClarke 0:5b4bcbd69509 11 char GPRSbuffer[512];
SamClarke 7:db9226b9b037 12 char NUMBER[11];
SamClarke 7:db9226b9b037 13 char MESSAGE[5];
SamClarke 0:5b4bcbd69509 14 int index;
SamClarke 7:db9226b9b037 15 long int number;
SamClarke 0:5b4bcbd69509 16 int i = 0;
SamClarke 0:5b4bcbd69509 17
SamClarke 0:5b4bcbd69509 18 GPS gps(p9,p10);
SamClarke 0:5b4bcbd69509 19 MODSERIAL GPRS(p13,p14); // MODSERIAL for rxBufferFlush()
SamClarke 0:5b4bcbd69509 20 MODSERIAL pc(USBTX,USBRX);
SamClarke 0:5b4bcbd69509 21
SamClarke 0:5b4bcbd69509 22 DigitalOut myled1(LED1);
SamClarke 0:5b4bcbd69509 23 DigitalOut myled2(LED2);
SamClarke 0:5b4bcbd69509 24 DigitalOut myled3(LED3);
SamClarke 0:5b4bcbd69509 25 DigitalOut myled4(LED4);
SamClarke 0:5b4bcbd69509 26
SamClarke 0:5b4bcbd69509 27 void led_thread(void const *argument) // Some light jazz in a thread
SamClarke 0:5b4bcbd69509 28 {
SamClarke 0:5b4bcbd69509 29 while (true) {
SamClarke 0:5b4bcbd69509 30 DigitalOut leds[4] = {myled1, myled2, myled3, myled4};
SamClarke 0:5b4bcbd69509 31 int pattern[6][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}};
SamClarke 0:5b4bcbd69509 32 int i=0;
SamClarke 0:5b4bcbd69509 33 while(1) {
SamClarke 0:5b4bcbd69509 34 leds[0] = pattern[i][0];
SamClarke 0:5b4bcbd69509 35 leds[1] = pattern[i][1];
SamClarke 0:5b4bcbd69509 36 leds[2] = pattern[i][2];
SamClarke 0:5b4bcbd69509 37 leds[3] = pattern[i][3];
SamClarke 0:5b4bcbd69509 38 wait(0.2);
SamClarke 0:5b4bcbd69509 39 i++;
SamClarke 0:5b4bcbd69509 40 i == 6? i=0:0;
SamClarke 0:5b4bcbd69509 41 }
SamClarke 0:5b4bcbd69509 42 }
SamClarke 0:5b4bcbd69509 43 }
SamClarke 0:5b4bcbd69509 44
SamClarke 0:5b4bcbd69509 45 void sendSms()
SamClarke 0:5b4bcbd69509 46 {
SamClarke 0:5b4bcbd69509 47 // Set message mode to ASCII
SamClarke 0:5b4bcbd69509 48 GPRS.printf("AT+CMGF=1\r\n");
SamClarke 0:5b4bcbd69509 49 wait(1);
SamClarke 0:5b4bcbd69509 50 // Set the phone number
SamClarke 7:db9226b9b037 51 GPRS.printf("AT+CMGS=\"+%s\"\r\n", NUMBER);
SamClarke 0:5b4bcbd69509 52 wait(1);
SamClarke 0:5b4bcbd69509 53 // Write out the GPS data in a message
SamClarke 9:bec6e8f731f2 54 GPRS.printf("Time: %4.2f \nAltitude: %3.2fm\nSpeed: %3.2f Kn\nHeading: %3.2f Deg\nValidity: %c\nSatellites: %d\nFix code: %d \nFix: ", gps.time, gps.altitude, gps.speed, gps.heading, gps.validity, gps.satellites, gps.fixtype);
SamClarke 9:bec6e8f731f2 55 if(gps.fixtype == 1) {
SamClarke 9:bec6e8f731f2 56 GPRS.printf("Positive");
SamClarke 9:bec6e8f731f2 57 }
SamClarke 9:bec6e8f731f2 58 if(gps.fixtype == 2) {
SamClarke 9:bec6e8f731f2 59 GPRS.printf("Differential");
SamClarke 9:bec6e8f731f2 60 }
SamClarke 0:5b4bcbd69509 61 wait(1);
SamClarke 0:5b4bcbd69509 62 // Send it...
SamClarke 0:5b4bcbd69509 63 GPRS.putc(0x1A);
SamClarke 0:5b4bcbd69509 64 wait(3);
SamClarke 0:5b4bcbd69509 65 GPRS.printf("AT+CMGF=1\r\n");
SamClarke 0:5b4bcbd69509 66 wait(1);
SamClarke 7:db9226b9b037 67 GPRS.printf("AT+CMGS=\"+%s\"\r\n", NUMBER);
SamClarke 0:5b4bcbd69509 68 wait(1);
SamClarke 0:5b4bcbd69509 69 GPRS.printf("Find me at....\n %s%f,%f%s", GoogleChunk, gps.latitude, gps.longitude, GoogleExtras);
SamClarke 0:5b4bcbd69509 70 wait(1);
SamClarke 0:5b4bcbd69509 71 GPRS.putc(0x1A);
SamClarke 3:a5df4bd224ad 72 wait(1);
SamClarke 0:5b4bcbd69509 73 }
SamClarke 0:5b4bcbd69509 74
SamClarke 0:5b4bcbd69509 75 void parseSms()
SamClarke 0:5b4bcbd69509 76 {
SamClarke 0:5b4bcbd69509 77 // If theres a char waiting in the MODSERIAL buffer
SamClarke 0:5b4bcbd69509 78 while (GPRS.readable()) {
SamClarke 0:5b4bcbd69509 79 // Assign it to 'c'
SamClarke 0:5b4bcbd69509 80 char c = GPRS.getc();
SamClarke 0:5b4bcbd69509 81 // Replace all returns and or line endings with money!
SamClarke 0:5b4bcbd69509 82 if (c == '\r' || c == '\n') c = '$';
SamClarke 0:5b4bcbd69509 83 // Put it in the array
SamClarke 0:5b4bcbd69509 84 GPRSbuffer[i] = c;
SamClarke 0:5b4bcbd69509 85 // Repeat if possible
SamClarke 0:5b4bcbd69509 86 i++;
SamClarke 0:5b4bcbd69509 87 }
SamClarke 0:5b4bcbd69509 88 // Uncomment the following to debug
SamClarke 9:bec6e8f731f2 89 pc.printf("\nbuffer = %s", GPRSbuffer);
SamClarke 0:5b4bcbd69509 90
SamClarke 0:5b4bcbd69509 91 // If we get an SMS notification....
SamClarke 0:5b4bcbd69509 92 if (sscanf(GPRSbuffer, "$$+CMTI: \"SM\",%d", &index)>0) {
SamClarke 1:00c7dc0c1761 93 pc.printf("\nSMS recieved @ index [%d]", index);
SamClarke 7:db9226b9b037 94 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 95 i = 0;
SamClarke 7:db9226b9b037 96 GPRS.printf("AT+CMGR=%d\r\n", index);
SamClarke 7:db9226b9b037 97 wait(1);
SamClarke 7:db9226b9b037 98 }
SamClarke 7:db9226b9b037 99
SamClarke 7:db9226b9b037 100 if (strncmp(GPRSbuffer, "$$+CMGR",7) == 0 ) {
SamClarke 9:bec6e8f731f2 101 for (int k = 24; k < 35; k++) {
SamClarke 7:db9226b9b037 102 NUMBER[k-24] = GPRSbuffer[k];
SamClarke 7:db9226b9b037 103 }
SamClarke 7:db9226b9b037 104 for (int k = 64; k < 68; k++) {
SamClarke 7:db9226b9b037 105 MESSAGE[k-64] = GPRSbuffer[k];
SamClarke 7:db9226b9b037 106 }
SamClarke 0:5b4bcbd69509 107 sendSms();
SamClarke 0:5b4bcbd69509 108 // Reset the GPRS buffer
SamClarke 0:5b4bcbd69509 109 memset(GPRSbuffer, '0', 512);
SamClarke 0:5b4bcbd69509 110 // Reset the char counter
SamClarke 0:5b4bcbd69509 111 i = 0;
SamClarke 7:db9226b9b037 112 }
SamClarke 7:db9226b9b037 113
SamClarke 7:db9226b9b037 114 if (strncmp(GPRSbuffer, "$$+CMGS",7) == 0) {
SamClarke 7:db9226b9b037 115 // Reset the GPRS buffer
SamClarke 7:db9226b9b037 116 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 117 // Reset the char counter
SamClarke 7:db9226b9b037 118 i = 0;
SamClarke 7:db9226b9b037 119 }
SamClarke 7:db9226b9b037 120
SamClarke 7:db9226b9b037 121 if (strncmp(GPRSbuffer, "$$RING",6) == 0) {
SamClarke 9:bec6e8f731f2 122 GPRS.printf("ATH0\r\n");
SamClarke 5:3a42b208ac4e 123 // Flush any incoming rings in the MODSERIAL buffer
SamClarke 3:a5df4bd224ad 124 GPRS.rxBufferFlush();
SamClarke 3:a5df4bd224ad 125 pc.printf("\nCall recieved");
SamClarke 3:a5df4bd224ad 126 // Do the send SMS routine...
SamClarke 3:a5df4bd224ad 127 sendSms();
SamClarke 3:a5df4bd224ad 128 // Flush out any left in the serial buffer
SamClarke 4:0e55a4620f5e 129 GPRS.rxBufferFlush();
SamClarke 3:a5df4bd224ad 130 // Reset the GPRS buffer
SamClarke 4:0e55a4620f5e 131 memset(GPRSbuffer, '0', 512);
SamClarke 3:a5df4bd224ad 132 // Reset the char counter
SamClarke 4:0e55a4620f5e 133 i = 0;
SamClarke 1:00c7dc0c1761 134 }
SamClarke 9:bec6e8f731f2 135 pc.printf("\nWaiting for SMS or call...\n");
SamClarke 9:bec6e8f731f2 136 pc.printf("\nThe last number was :+%s", NUMBER);
SamClarke 9:bec6e8f731f2 137 pc.printf("\nThe last message was :%s", MESSAGE);
SamClarke 7:db9226b9b037 138 // Reset the GPRS buffer
SamClarke 7:db9226b9b037 139 memset(GPRSbuffer, '0', 512);
SamClarke 7:db9226b9b037 140 // Reset the char counter
SamClarke 7:db9226b9b037 141 i = 0;
SamClarke 0:5b4bcbd69509 142 }
SamClarke 0:5b4bcbd69509 143
SamClarke 0:5b4bcbd69509 144 int main()
SamClarke 0:5b4bcbd69509 145 {
SamClarke 0:5b4bcbd69509 146 pc.baud(115200);
SamClarke 0:5b4bcbd69509 147 GPRS.baud(19200);
SamClarke 0:5b4bcbd69509 148 Thread thread(led_thread);
SamClarke 5:3a42b208ac4e 149 memset(GPRSbuffer, '0', 512);
SamClarke 9:bec6e8f731f2 150 pc.printf("\nI'm Alive...\n");
SamClarke 0:5b4bcbd69509 151 // Setup the GPS
SamClarke 0:5b4bcbd69509 152 gps.Init();
SamClarke 0:5b4bcbd69509 153 // Set the GPRS AT echo off
SamClarke 0:5b4bcbd69509 154 GPRS.printf("ATE0\r\n");
SamClarke 9:bec6e8f731f2 155 pc.printf("\nGPRS echo [OFF]\n");
SamClarke 0:5b4bcbd69509 156 wait(1);
SamClarke 0:5b4bcbd69509 157 // Delete all messages on the sim card
SamClarke 0:5b4bcbd69509 158 GPRS.printf("AT+CMGDA=\"DEL ALL\"\r\n");
SamClarke 0:5b4bcbd69509 159 wait(1);
SamClarke 9:bec6e8f731f2 160 pc.printf("\nMessages Cleared...\n");
SamClarke 0:5b4bcbd69509 161 wait(1);
SamClarke 0:5b4bcbd69509 162 // Flush out any \r\nOK\r\n's
SamClarke 0:5b4bcbd69509 163 GPRS.rxBufferFlush();
SamClarke 0:5b4bcbd69509 164 // Get in a while loop
SamClarke 0:5b4bcbd69509 165 while (1) {
SamClarke 0:5b4bcbd69509 166 // Process any recieved data
SamClarke 0:5b4bcbd69509 167 parseSms();
SamClarke 0:5b4bcbd69509 168 // Process / check GPS data
SamClarke 3:a5df4bd224ad 169 gps.parseData();
SamClarke 0:5b4bcbd69509 170 }
SamClarke 0:5b4bcbd69509 171 }