Arduino GPS/GSM Tracker (2 / 5 steg)
Steg 2: Programvara förklarade
Koden för Arduino är ganska enkel. Genom att använda ett par bibliotek, blir GPS och GPRS sköld enkel att använda objekt. Detta sparar mycket tid parsning GPS strängar och komponera lång AT + kommandosträngar för modem. Här är koden utan någon fluff. Läs vidare efteråt för en uppdelning av vad allt betyder.
#include < TinyGPS ++ .h >
#include < GPRS_Shield_Arduino.h >
#include < Wire.h >
#include < SoftwareSerial.h >
TinyGPSPlus gps;
GPRS-gsm(7,8,9600);
int messageIndex = 0;
char meddelande [160];
char telefon [16].
char datetime [24].
char latitude [12].
char longitud [12].
void setup() {
Serial.BEGIN(9600);
pinMode (9, OUTPUT);
digitalWrite(9,LOW);
Delay(100);
digitalWrite(9,HIGH);
Delay(500);
digitalWrite(9,LOW);
Delay(100);
pinMode (13, OUTPUT);
digitalWrite(13,LOW);}
void loop() {
medan (Serial.available() > 0) {
GPS.encode(Serial.Read());}
messageIndex = gsm.isSMSunread();
om (messageIndex > 0) {
gsm.readSMS (messageIndex, budskap, 160, telefon, datetime);
gsm.deleteSMS(messageIndex);
om (String(message) == "xyzzy") {
om (gps.location.isValid()) {
strcpy (meddelande, "http://www.bing.com/maps?");
strcat (budskap, "lvl = 17 & stil = r & sp = point.");
dtostrf(GPS.location.lat(), 1, 6, latitude);
strcat(Message,Latitude);
strcat(Message,"_");
dtostrf(GPS.location.LNG(), 1, 6, longitud);
strcat(Message,Longitude);
strcat(Message,"_Golf+Cart_");
strcat(Message,DateTime);}
annat {
strcpy (meddelande, "Tyvärr, Dave, jag är rädd jag inte göra.");}
gsm.sendSMS(phone,message) ;}}}
Om du inte vet hur du lägger till ett bibliotek för din Arduino programmeringsverktyg, finns den bästa dokumentationen på webbplatsen Arduino på http://www.arduino.cc/en/guide/libraries#toc4
TinyGPS ++ biblioteket finns på http://arduiniana.org/libraries/tinygpsplus/.
GPRS-Shield biblioteket finns på https://github.com/Seeed-Studio/GPRS_SIM900.
Du måste kontrollera GPS dataledningar tas bort från Arduino innan du lägger upp din skiss. När programmet har lagts upp, stänga och ersätta dataledningar GPS.
I spara minne, jag förklarar inte varje stift som en variabel med ett fantasinamn, men sätta värdena direkt i koden. Om du vill använda olika pins för enheten GPRS, till exempel, skulle du ändra stiften vid punkten i koden där GPRS-objektet skapas. Här är en pjäs av lek.
Det första förklara vi våra bibliotek och globala variabler:
#include < TinyGPS ++ .h >
#include < APRS_Shield_Arduino.h >
#include < Wire.h >
#include < SoftwareSerial.h >
Skapa sedan en instans av tinygps ++ kallas "gps".
TinyGPSPlus gps;
Skapa sedan ett GPRS objekt kallas "gsm" programvara seriella porten på stift 7 & 8 på 9600 bps
GPRS-gsm(7,8,9600);
Slutligen, förklara alla index och strängar
int messageIndex = 0;
char meddelande [160];
char telefon [16].
char datetime [24].
char latitude [12].
char longitud [12].
Setup slingan är ganska gles, främst initiera serieporten hårdvara för GPS och sedan vrida på GSM skölden med ögonblickligt pulserande pin 9. Jag hoppas du kom ihåg att löda jumper pad. Slutligen, jag stänga av ombord LED på stift 13 spara juice och använda för att ange ett fel någon gång i framtiden.
void setup() {
Serial.BEGIN(9600);
pinMode (9, OUTPUT);
digitalWrite(9,LOW);
Delay(100);
digitalWrite(9,HIGH);
Delay(500);
digitalWrite(9,LOW);
Delay(100);
pinMode (13, OUTPUT);
digitalWrite(13,LOW);}
Loop() är också ganska direkt. Med hjälp av TinyGPS ++ biblioteket sparar en boatload av kodning, hanterar alla GPS data parsing med endast två rader kod.
void loop() {
medan (Serial.available() > 0) {
GPS.encode(Serial.Read());}
Efter det uppmanar vi GPRS_SIM9000 biblioteket att ta allt arbete av kontroll för olästa meddelanden genom att läsa och ta bort den första hittar vi med bara fyra rader kod. Funktionen readSMS() laddar även upp våra globala variabler för senare användning. Om det finns fler än ett meddelande väntar, kommer var och en få analyserad på efterföljande upprepningar av loop().
messageIndex = gsm.isSMSunread();
om (messageIndex > 0) {
gsm.readSMS (messageIndex, budskap, 160, telefon, datetime);
gsm.deleteSMS(messageIndex);
Med meddelande analyseras och globals laddad, jämförs den inkommande texten sedan med en sträng, fortsätter endast på en exakt matchning med våra magiska ordet. Utan en match, vi gå tillbaka till början av slingan och börja ladda GPS objektet med nya data igen. Ändrar du texten innanför citationstecken om du vill använda ett annat magiska ord.
om (String(message) == "xyzzy") {
Om det är en match, gör vi en annan rad ring till vår GPS objekt att avgöra om vi har en bra fix på vår ståndpunkt.
om (gps.location.isValid()) {
Om så, vi svara med kartor en URL till Bing. Jag vill hellre använda Google, men jag har inte bestämt hur du placerar ett stift på kartan med bara en URL. Hur som helst, skapa URL är förmodligen fulaste koden i slingan. Det måste finnas vissa typ jonglering för att få en dubbel precision återvände från GPS-objektet till en sträng, därmed funktionen dtostrf() . Då är det bara råstyrka sammanfogning av strängar.
Funktionen strcpy() anger variabeln meddelande till början av URL: en och strcat() fortsätter att lägga bitar till variabeln samma meddelande tills vi är klara. Detta är blocket att ändra om du vill använda en annan mappning tjänst eller formatera ditt svar på ett annat sätt.
strcpy (meddelande, "http://www.bing.com/maps?");
strcat (budskap, "lvl = 17 & stil = r & sp = point.");
dtostrf(GPS.location.lat(), 1, 6, latitude);
strcat(Message,Latitude);
strcat(Message,"_");
dtostrf(GPS.location.LNG(), 1, 6, longitud);
strcat(Message,Longitude);
Texten i citat är den etikett som visas på din kartobjekt. Det måste ha omgivande understreck och använda tecknet "+" i stället för mellanslag. Nästa rad läggs till den ursprungliga begäran tidsstämpel.
strcat(Message,"_Golf+Cart_");
strcat(Message,DateTime);}
Om vi inte har en fix, vi satte innehållet i variabeln meddelande till något annat och skicka det tillsammans till samma nummer som gjort begäran och stänga ute alla klammerparenteserna.
annat {
strcpy (meddelande, "Tyvärr, Dave, jag är rädd jag inte göra.");}
gsm.sendSMS(phone,message) ;}}}
Det var allt. Gå tillbaka till toppen av loop() och börja om.
Jag hoppas detta förklarar koden väl nog att någon ny till Arduinosphere kan förstå och ändra det till deras behov. Nästa, installation...