Solar Driv GPS vandring Logger (1 / 5 steg)
Steg 1: Arduino och kod
Jag har en CAN-BUS sköld (från när min bil var med motor problem och jag försökte göra min egen diagnostik) och märkte det har en EM-406-uttaget och koppla in en vanlig GPS-modul. Jag beställde en GPS-modul från ebay (alla GPS moduler EM-406 socket verkar vara samma) och pluggade i ett micro SD-kort i SD-uttaget på skölden.
Att göra GPS loggning lätt hittade jag en mest utmärkt bibliotek som kallas TinyGPS ++ vilket innebär att jag inte behöver ägna min tid att förstå de paket som skickas från GPS-modulen!
Att använda linux-verktyg som GPS babel eller online-verktyg såsom GPS Visualizer data kan omvandlas mellan de flesta vanliga format, så jag tänkte att jag skulle hålla med SKV så att jag kunde öppna upp excel eller matlab, men kan ändå lätt konvertera till kml Visa i Google Earth.
Jag har inkluderat källkoden jag använde nedan, jag har kvar den seriella dumpning grejer i för felsökning ändamål (så du kan se din plats från din bärbara dator omedelbart).
Lysdioder inbyggda i skölden används för att indikera när styrelsen loggar, och den andra för när GPS är låst.
#include < SPI.h >
#include < SD.h >
#include < TinyGPS ++ .h >
#include < SoftwareSerial.h >
CONST int LED1 = 7.
CONST int LED2 = 8.
CONST int chipSelect = 9;
CONST int RXPin = 4;
CONST int TXPin = 5;
int GPSBaud = 4800;
TinyGPSPlus gps;
SoftwareSerial gpsSerial (RXPin, TXPin);
void setup()
{
Serial.BEGIN(9600);
gpsSerial.begin(GPSBaud);
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (chipSelect, produktionen);
IF (!. SD.begin(chipSelect)) digitalWrite (LED1, låg);
annat
{
Serial.println ("SD-kort Setup");
digitalWrite (LED1, hög);
}
}
void loop()
{
samtidigt (gpsSerial.available() > 0)
{
om (gps.encode(gpsSerial.read()))
{
om (gps.location.isValid() & & gps.time.isValid() & & gps.date.isValid()) digitalWrite (LED2, hög);
annat digitalWrite (LED2, låg);
logInfo();
displayInfo();
}
}
}
void logInfo()
{
om (gps.location.isValid() & &
gps.time.isValid() & &
gps.date.isValid())
{
Fil dataFile = SD.open ("gpslog.txt", FILE_WRITE);
om (dataFile)
{
digitalWrite (LED1, hög);
dataFile.print(gps.date.day());
dataFile.print(F("/"));
dataFile.print(gps.date.month());
dataFile.print(F("/"));
dataFile.print(gps.date.year());
dataFile.print(F(","));
om (gps.time.hour() < 10) dataFile.print(F("0"));
dataFile.print(gps.time.hour());
dataFile.print(F(":"));
om (gps.time.minute() < 10) dataFile.print(F("0"));
dataFile.print(gps.time.minute());
dataFile.print(F(":"));
om (gps.time.second() < 10) dataFile.print(F("0"));
dataFile.print(gps.time.second());
dataFile.print(F("."));
om (gps.time.centisecond() < 10) dataFile.print(F("0"));
dataFile.print(gps.time.centisecond());
dataFile.print(F(","));
dataFile.print(gps.location.lat(), 6);
dataFile.print(F(","));
dataFile.print(gps.location.lng(), 6);
dataFile.println();
dataFile.close();
}
om filen inte är öppen, dyker upp ett felmeddelande:
annat
{
digitalWrite (LED1, hög);
Serial.println ("fel öppna datalog.txt");
}
}
}
void displayInfo()
{
Serial.Print (F ("plats:"));
om (gps.location.isValid())
{
Serial.Print(GPS.location.lat(), 6);
Serial.Print(F(","));
Serial.Print(GPS.location.LNG(), 6);
}
annat
{
Serial.Print(F("Invalid"));
}
Serial.Print (F ("datum och tid:"));
om (gps.date.isValid())
{
Serial.Print(GPS.Date.Day());
Serial.Print(F("/"));
Serial.Print(GPS.Date.month());
Serial.Print(F("/"));
Serial.Print(GPS.Date.Year());
}
annat
{
Serial.Print(F("Invalid"));
}
Serial.Print (F(""));
om (gps.time.isValid())
{
om (gps.time.hour() < 10) Serial.print(F("0"));
Serial.Print(GPS.Time.Hour());
Serial.Print(F(":"));
om (gps.time.minute() < 10) Serial.print(F("0"));
Serial.Print(GPS.Time.Minute());
Serial.Print(F(":"));
om (gps.time.second() < 10) Serial.print(F("0"));
Serial.Print(GPS.Time.Second());
Serial.Print(F("."));
om (gps.time.centisecond() < 10) Serial.print(F("0"));
Serial.Print(GPS.Time.centisecond());
}
annat
{
Serial.Print(F("Invalid"));
}
Serial.println();
}