Stap 2: Software uitgelegd
De code voor de Arduino is vrij eenvoudig. Met behulp van een paar van de Bibliotheken, de GPS en GPRS schild worden eenvoudig in het gebruik van objecten. Dit scheelt een hoop tijd GPS tekenreeksen parseren en componeren lange AT + opdrachtreeksen voor de modem. Hier is de code zonder enige pluis. Nalezen op voor een overzicht van wat het allemaal doet.
#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 message[160]; char phone[16]; char datetime[24]; char latitude[12]; char longitude[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() { while (Serial.available() > 0) { gps.encode(Serial.read());} messageIndex = gsm.isSMSunread(); if (messageIndex > 0) { gsm.readSMS(messageIndex, message, 160, phone, datetime); gsm.deleteSMS(messageIndex); if (String(message) == "xyzzy") { if (gps.location.isValid()) { strcpy(message, "http://www.bing.com/maps?"); strcat(message, "lvl=17&style=r&sp=point."); dtostrf(gps.location.lat(), 1, 6, latitude); strcat(message,latitude); strcat(message,"_"); dtostrf(gps.location.lng(), 1, 6, longitude); strcat(message,longitude); strcat(message,"_Golf+Cart_"); strcat(message,datetime);} else { strcpy(message, "I'm sorry, Dave, I'm afraid I can't do that.");} gsm.sendSMS(phone,message);}}}
Als u niet hoe om toe te voegen een bibliotheek voor de Arduino programmeer gereedschap weet, is de beste documentatie te vinden op de Arduino website op http://www.arduino.cc/en/guide/libraries#toc4
De TinyGPS ++ bibliotheek kan gevonden worden op http://arduiniana.org/libraries/tinygpsplus/.
De GPRS Shield-bibliotheek kan gevonden worden op https://github.com/Seeed-Studio/GPRS_SIM900.
U moet ervoor zorgen dat de GPS gegevens draden worden verwijderd uit de Arduino voordat u uploadt uw schets. Nadat het programma is geüpload, uitgeschakeld en de draden van de GPS gegevens vervangen.
In het belang van de geheugen opslaan, ik heb niet elke pin declareren als een variabele met een mooie naam, maar zet de waarden rechtstreeks in de code. Als u gebruik wilt maken verschillende pennen voor uw GPRS-apparaat, bijvoorbeeld, zou u de pinnen op het punt in de code waar de GPRS-object is gemaakt. Hier is het toneelstuk door spelen.
Eerst, declareren we onze bibliotheken en globale variabelen:
#include <TinyGPS++.h>#include <APRS_Shield_Arduino.h>#include <Wire.h>#include <SoftwareSerial.h>
Maak vervolgens een exemplaar van tinygps ++ 'gps' genoemd.
TinyGPSPlus gps;
Maak vervolgens een GPRS-object genaamd 'gsm' op de seriële poort software op pennen 7 & 8 9600 bps
GPRS gsm(7,8,9600);
Tot slot verklaren alle indexen en strijkers
int messageIndex = 0; char message[160]; char phone[16]; char datetime[24]; char latitude[12]; char longitude[12];
De setup-lus is vrij schaars, vooral de seriële poort van de hardware voor de GPS initialiseren en vervolgens draaien op de GSM-schild door tijdelijk pulserende pin 9. Ik hoop dat u niet vergeten om te solderen de jumper pad. Tenslotte, mij zwenking vandoor de onboard LED op pin 13 opslaan van SAP en potentieel gebruiken om aan te geven van een fout op een bepaald punt in de toekomst.
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);}
De loop is ook vrij directe. Het gebruik van de bibliotheek TinyGPS ++ spaart een boatload van codering, behandeling van alle GPS gegevens parseren met slechts twee lijnen van code.
void loop() { while (Serial.available() > 0) { gps.encode(Serial.read());}
Na dat roepen wij de bibliotheek van de GPRS_SIM9000 te nemen van al het werk uit het zoeken van ongelezen berichten door te lezen en verwijderen van de eerste we met slechts vier regels code vinden. De readSMS() functie laadt ook onze globale variabelen voor later gebruik. Als er meer dan één bericht te wachten, zal elk geparseerd krijgen op latere iteraties van de loop.
messageIndex = gsm.isSMSunread(); if (messageIndex > 0) { gsm.readSMS(messageIndex, message, 160, phone, datetime); gsm.deleteSMS(messageIndex);
Met het bericht geparseerd en geladen globals, wordt de binnenkomende tekst vervolgens vergeleken met een bepaalde tekenreeks, blijven alleen op exact gelijk is aan onze toverwoord. Zonder een match, we teruggaan naar de bovenkant van de lijn en beginnen het GPS-object met de nieuwe gegevens opnieuw laden. Wijzig de tekst binnen de aanhalingstekens als u wenst te gebruiken een ander magisch woord.
if (String(message) == "xyzzy") {
Als er een match is, maken we een andere één lijn bellen naar onze GPS-object om te bepalen of er een goede correctie over ons standpunt.
if (gps.location.isValid()) {
Als zo, we met antwoorden maps een URL naar Bing. Ik zou liever gebruik maken van Google, maar ik heb niet bepaald hoe plaats ik een pin op de kaart met alleen een URL. Hoe dan ook, het creëren van de URL is waarschijnlijk de lelijkste code in de lus. Er moet worden sommige type jongleren om het getal met dubbele precisie geretourneerd door de GPS-object in een string, vandaar de dtostrf() functie. Dan is het gewoon brute kracht aaneenschakeling van tekenreeksen.
De strcpy() -functie stelt u de variabele bericht naar het begin van de URL, dan blijft de strcat() bits aan de dezelfde variabele bericht toevoegen totdat we klaar. Dit is het blok te wijzigen als u wilt gebruiken een verschillende kaartservice op internet of uw antwoord op een andere manier opmaken.
strcpy(message, "http://www.bing.com/maps?"); strcat(message, "lvl=17&style=r&sp=point."); dtostrf(gps.location.lat(), 1, 6, latitude); strcat(message,latitude); strcat(message,"_"); dtostrf(gps.location.lng(), 1, 6, longitude); strcat(message,longitude);
De tekst tussen aanhalingstekens is het label dat wordt weergegeven op uw kaartobject. Het moet de omliggende onderstrepingsteken en het "+" teken gebruiken in plaats van spaties. De volgende regel wordt de tijdstempel van de eerste aanvraag toegevoegd.
strcat(message,"_Golf+Cart_"); strcat(message,datetime);}
Als we niet een oplossing hebben, wij de inhoud van de variabele bericht ingesteld op iets anders en stuur het langs naar hetzelfde nummer die de aanvraag heeft ingediend en sluiten uit de accolades.
else { strcpy(message, "I'm sorry, Dave, I'm afraid I can't do that.");} gsm.sendSMS(phone,message);}}}
Thats it. Ga terug naar de top van de loop en helemaal over beginnen.
Ik hoop dat dit verklaart de code goed genoeg dat iemand nieuw voor de Arduinosphere kan begrijpen en het aan hun behoeften wijzigen. Volgende, installatie...