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 06:37:57 2012 +0000
Revision:
8:d4773b6449c5
Parent:
7:db9226b9b037
Child:
9:bec6e8f731f2

        

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