Voor wie de sketch van een gps tracker eens wil proberen, plaats ik die hieronder.
Ik kreeg 'm hiermee aan de praat. Er zijn meerdere soorten gsm-shields voor een arduino en meerdere gps-shields.
Ik gebruikte de onderstaande gecombineerd met een UNO (ongeveer $7).
Er zullen ongetwijfeld betere sketches zijn want ik vermoed dat ik links en rechts wel een variabele o.i.d. onbenut heb en dus overbodig is.
Dat beperkt de werking overigens niet.
GSM-shield:
http://www.ebay.com/itm/SIM900-Quad-ban ... 337f205e38
GPS-shield:
http://www.ebay.com/itm/Skylab-GPS-Modu ... 4610912fe1
Van het GSM-shield zijn ook versies die niet werken met DTMF en die kosten ongeveer $31.
In totaal waren mijn kosten ongeveer € 45 en de afmetingen zijn excl. gsmantenne en gpsantenne 7x5 x3.
Het is allemaal open source dus ik vermeld hier dat de oorspronkelijke auteur boraciner is, actief op o.a. GitHub.com. Bij mij werkte zijn sketch niet dus die heb ik aangepast. Voorts gebruikte hij voor functies en variabelen Turkse woorden en daardoor kon ik alleen met Google Translate begrijpen wat hij bedoelde.
Er zijn drie telefoonnummers (ik heb 06 nummers gebruikt maar vaste zijn ook mogelijk als je maar met nummerherkenning belt) geauthoriseerd die je eventueel uit kunt breiden. Met het nummer van een thuisblijver bijvoorbeeld die in noodgevallen kan zien waar je bent.
Belt er dus iemand met een ander nummer dan gaat de telefoon wel over maar er wordt niets verstuurd.
Als één van de drie nummers belt dan stuurt de arduino alléén naar dat nummer de coördinaten en de snelheid.
De telefoon hoeft maar één keer over te gaan om de arduino te activeren. Laat je 'm met een geauthoriseerd nummer twee keer overgaan dan krijg je 2 sms'n. Daar moet ik tzt nog eens iets aan doen.
Het GSM shield verbruikt nogal wat bij actieve dienst, er is daarom een voeding nodig die 2 ampère kan leveren.
De compiler van arduino kun je hier gratis downloaden:
http://arduino.cc/en/Main/Software#toc2
Als je verbeteringen ontdekt o.i.d., ik hou me altijd aanbevolen.
Ik hoop niet dat dit alles teveel capaciteit vraagt van het forum, anders kan het misschien op een andere manier.
Voor je van alles aan gaat schaffen: hou regel 10 van het forum in gedachten!
Onderstaande sketch kun je kopiëren en in de arduino compiler plakken. Niet overtypen dus!
#include <TimerOne.h> // deze # includes kun je downloaden op internet: googlen.
#include <TinyGPS.h>
#include <SoftwareSerial.h>
TinyGPS gps;
SoftwareSerial gsmSerial(2, 3);
SoftwareSerial ss(4,5);
String inData = "";
boolean inputAvailable = false;
String Opvraag_Telefoon_Nummer_1 = "+31612345678"; // het aantal nummers is onbeperkt uit te breiden.
String Opvraag_Telefoon_Nummer_2 = "+31687654321"; // maar pas dan de funktie aan: int Authorisatie()
String Opvraag_Telefoon_Nummer_3 = "+31622334455";
String oproepNummer = "";
String totaalNummer = "";
int callback_counter=0;
int indexofMsgStr = 0;
float flat, flon, fkmph;
unsigned long age;
char leesKarakters = '*';
float flat_store = 0.0;
float flon_store = 0.0;
void setup() {delay(5000);
Serial.begin(115200);
SIMpower();
ss.begin(9600);
gsmSerial.begin(9600);
Timer1.initialize(8388480);
Timer1.attachInterrupt(callback);
delay(2000);
gsmSerial.listen();
Serial.println("opstarten");
gsmSerial.println("AT+CLIP=1");
delay(1000);
gsmSerial.println("ATE=0");
delay(1000);
gsmSerial.listen();}
void loop() {while(gsmSerial.available())
{inputAvailable = true;
leesKarakters = (char) gsmSerial.read();
inData += leesKarakters;
if(leesKarakters == ',')
{break;}}
if(inputAvailable)
{inputAvailable=false;
processData();
inData="";}}
void GPSData() {Serial.println("GPSData");
gps.f_get_position(&flat, &flon, &age);
if( flat > 0.0 )
flat_store = flat;
if( flon > 0.0 )
flon_store = flon;
fkmph = gps.f_speed_kmph();}
void GPSBepalen(){Serial.println("---->GPSBepalen");
boolean gps_valid = false;
ss.listen();
delay(1000);
for(int i =0 ; i < 200 ; i++)
{if(!gps_valid)
{while (ss.available())
{char c = ss.read();
if (gps.encode(c))
{GPSData();
gps_valid = true;
break;}}
delay(5);}}
gsmSerial.listen();
delay(1000);
Serial.println("<----GPSBepalen");}
void processData(){Serial.println("processData");
Serial.println(inData);
if(OproepToon())
{indexofMsgStr = inData.indexOf("+31");
oproepNummer = inData.substring(indexofMsgStr , indexofMsgStr+12);
Serial.println(oproepNummer);
if(Authorisatie())
{GPSBepalen();
smsDePlaats();}}}
void smsDePlaats(){Serial.println("sms De Plaats");
gsmSerial.println("AT+CMGF=1");
delay(2000);
totaalNummer = "AT+CMGS=\"";
totaalNummer+=oproepNummer;
totaalNummer+= "\"";
gsmSerial.println(totaalNummer);
delay(1000);
gsmSerial.println(flat_store,7);
gsmSerial.println(flon_store,7);
gsmSerial.print(fkmph);
gsmSerial.println(" km/hr");
gsmSerial.write(26);}
int OproepToon() {Serial.println("OproepToon?");
if (inData.indexOf("CLIP:") >= 0 )
{return 1;}
else
{return 0;}}
int Authorisatie(){Serial.println("Geauthoriseerd?");
if(Opvraag_Telefoon_Nummer_1 == oproepNummer)
{return 1;}
else if(Opvraag_Telefoon_Nummer_2 == oproepNummer)
{return 1;}
else if(Opvraag_Telefoon_Nummer_3 == oproepNummer)
{return 1;}
return 0;}
void callback() {callback_counter++;
if(callback_counter >= 80)
{callback_counter = 0;
GPSBepalen();}}
void SIMpower() {digitalWrite(8, HIGH); // start het gsm-shield op
delay(1000);
digitalWrite(8, LOW);
delay(2000);}
Aanvulling: niets belet je om in de sketch een digitalWrite op te nemen waarmee een relais geactiveerd wordt. Als dat gebeurt zou je een brandstofafsluiter zijn werk kunnen laten doen. Een belletje geeft dan de positie waar hij ongeveer tot stilstand is gekomen.