Difference between revisions of "SDGPSLogger"
Line 4: | Line 4: | ||
Here is the source code: | Here is the source code: | ||
− | < | + | <code> |
/* | /* | ||
SD gps datalogger | SD gps datalogger | ||
Line 203: | Line 203: | ||
− | </ | + | </code> |
Revision as of 08:55, 6 May 2011
The SD GPS logger will take data from a GPS and log it into a file on an SD card every 5 seconds.
It is based on the Arduino with an SD card shield and an attached GPS.
Here is the source code:
/*
SD gps datalogger
This will log locations to a file on an SD card.
Known bugs:
If the code writes to the SD card at the same time you power down, it
can corrupt the file system on the SD card.
Pins:
SD MOSI - pin 11
SD CLK - pin 13
SD CS - pin 8
GPS serial out - pin 7
GPS serial in - pin 6 (not needed)
SD Shield:
http://www.sparkfun.com/products/9802
GPS:
http://www.byonics.com/tinytrak/gps.php (GPS2)
Required Libraries:
NewSoftSerial - http://arduiniana.org/libraries/newsoftserial/
TinyGPS - http://arduiniana.org/libraries/tinygps/
Copyright (C) 2011 Jay Sissom
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2
of the License. THIS SOFTWARE IS RELEASED UNDER THE TERMS OF
VERSION 2 OF THE GPL LICENSE ONLY.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
http://www.gnu.org/licenses/gpl-2.0.html
Jay Sissom jsissom@gmail.com
*/
- include <SD.h>
- include <NewSoftSerial.h>
- include <TinyGPS.h>
// GPS and serial objects
TinyGPS gps;
NewSoftSerial nss(7,6,true);
// GPS data (global so we don't need to pass them around)
long lat, lon;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age, date, time, chars, speed;
bool moving = true;
// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 8;
void setup() {
Serial.begin(9600);
Serial.print("Initializing SD card...");
// make sure that the default chip select pin is set to
// output, even if you don't use it:
pinMode(10, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
Serial.println("card initialized.");
nss.begin(4800);
Serial.println("GPS initialized.");
}
void loop() {
bool newdata = false;
unsigned long start = millis();
// Every 5 seconds we write an update (if we are moving)
while (millis() - start < 5000) {
if ( feedgps() ) {
newdata = true;
}
}
if (newdata) {
speed = gps.speed();
gps.get_position(&lat, &lon, &age);
feedgps();
gps.get_datetime(&date, &time, &age);
feedgps();
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
feedgps();
// Only write data if we are moving
if ( moving ) {
writeData();
}
moving = ( speed > 85 );
} else {
Serial.println("No GPS data during the last 5 seconds");
}
}
bool feedgps() {
while (nss.available()) {
if (gps.encode(nss.read()))
return true;
}
return false;
}
void writeData() {
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
feedgps();
dataFile.print(lat);
dataFile.print("\t");
dataFile.print(lon);
dataFile.print("\t");
dataFile.print(gps.altitude());
dataFile.print("\t");
feedgps();
dataFile.print(year);
dataFile.print("\t");
dataFile.print(static_cast<int>(month));
dataFile.print("\t");
dataFile.print(static_cast<int>(day));
dataFile.print("\t");
dataFile.print(static_cast<int>(hour));
feedgps();
dataFile.print("\t");
dataFile.print(static_cast<int>(minute));
dataFile.print("\t");
dataFile.print(static_cast<int>(second));
dataFile.print("\t");
dataFile.print(gps.course());
dataFile.print("\t");
dataFile.print(speed);
dataFile.print("\t");
dataFile.println(age);
feedgps();
dataFile.close();
} else {
Serial.println("error opening datalog.txt");
}
// print to the serial port too:
feedgps();
Serial.print(lat);
Serial.print("\t");
Serial.print(lon);
Serial.print("\t");
Serial.print(gps.altitude());
Serial.print("\t");
feedgps();
Serial.print(year);
Serial.print("\t");
Serial.print(static_cast<int>(month));
Serial.print("\t");
Serial.print(static_cast<int>(day));
Serial.print("\t");
Serial.print(static_cast<int>(hour));
feedgps();
Serial.print("\t");
Serial.print(static_cast<int>(minute));
Serial.print("\t");
Serial.print(static_cast<int>(second));
Serial.print("\t");
Serial.print(gps.course());
Serial.print("\t");
Serial.print(gps.speed());
Serial.print("\t");
Serial.println(age);
feedgps();
}