Created
March 7, 2013 03:50
-
-
Save macintoxic/5105464 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SoftwareSerial.h> | |
#include <TinyGPS.h> | |
#include <SD.h> | |
const int chipSelect = 10; | |
File dataFile; | |
/* This sample code demonstrates the normal use of a TinyGPS object. | |
It requires the use of SoftwareSerial, and assumes that you have a | |
4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx). | |
*/ | |
TinyGPS gps; | |
SoftwareSerial nss(4, 3); | |
static void gpsdump(TinyGPS &gps); | |
static bool feedgps(); | |
static void print_float(float val, float invalid, int len, int prec); | |
static void print_int(unsigned long val, unsigned long invalid, int len); | |
static void print_date(TinyGPS &gps); | |
static void print_str(const char *str, int len); | |
void setup() | |
{ | |
Serial.begin(115200); | |
nss.begin(4800); | |
while (!Serial) { | |
; // wait for serial port to connect. Needed for Leonardo only | |
} | |
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(SS, 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: | |
while (1) ; | |
} | |
Serial.println("card initialized."); | |
//dataFile = SD.open("datalog.txt", FILE_WRITE); | |
Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version()); | |
Serial.println("by Mikal Hart"); | |
Serial.println(); | |
Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS)); | |
Serial.println(); | |
Serial.println("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum"); | |
Serial.println(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail"); | |
Serial.println("--------------------------------------------------------------------------------------------------------------------------------------"); | |
} | |
void loop() | |
{ | |
if(!dataFile) | |
{ | |
dataFile = SD.open("datalog3.txt", FILE_WRITE); | |
} | |
bool newdata = false; | |
unsigned long start = millis(); | |
// Every second we print an update | |
while (millis() - start < 1000) | |
{ | |
if (feedgps()) | |
newdata = true; | |
} | |
// gpsdump(gps); | |
} | |
static void gpsdump(TinyGPS &gps) | |
{ | |
float flat, flon; | |
unsigned long age, date, time, chars = 0; | |
unsigned short sentences = 0, failed = 0; | |
static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002; | |
print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5); | |
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5); | |
gps.f_get_position(&flat, &flon, &age); | |
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5); | |
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5); | |
print_int(age, TinyGPS::GPS_INVALID_AGE, 5); | |
print_date(gps); | |
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2); | |
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); | |
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2); | |
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6); | |
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9); | |
print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); | |
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6); | |
gps.stats(&chars, &sentences, &failed); | |
print_int(chars, 0xFFFFFFFF, 6); | |
print_int(sentences, 0xFFFFFFFF, 10); | |
print_int(failed, 0xFFFFFFFF, 9); | |
Serial.println(); | |
} | |
static void print_int(unsigned long val, unsigned long invalid, int len) | |
{ | |
char sz[32]; | |
if (val == invalid) | |
strcpy(sz, "*******"); | |
else | |
sprintf(sz, "%ld", val); | |
sz[len] = 0; | |
for (int i=strlen(sz); i<len; ++i) | |
sz[i] = ' '; | |
if (len > 0) | |
sz[len-1] = ' '; | |
Serial.print(sz); | |
feedgps(); | |
} | |
static void print_float(float val, float invalid, int len, int prec) | |
{ | |
char sz[32]; | |
if (val == invalid) | |
{ | |
strcpy(sz, "*******"); | |
sz[len] = 0; | |
if (len > 0) | |
sz[len-1] = ' '; | |
for (int i=7; i<len; ++i) | |
sz[i] = ' '; | |
Serial.print(sz); | |
} | |
else | |
{ | |
Serial.print(val, prec); | |
int vi = abs((int)val); | |
int flen = prec + (val < 0.0 ? 2 : 1); | |
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; | |
for (int i=flen; i<len; ++i) | |
Serial.print(" "); | |
} | |
feedgps(); | |
} | |
static void print_date(TinyGPS &gps) | |
{ | |
int year; | |
byte month, day, hour, minute, second, hundredths; | |
unsigned long age; | |
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); | |
if (age == TinyGPS::GPS_INVALID_AGE) | |
Serial.print("******* ******* "); | |
else | |
{ | |
char sz[32]; | |
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ", | |
month, day, year, hour, minute, second); | |
Serial.print(sz); | |
} | |
print_int(age, TinyGPS::GPS_INVALID_AGE, 5); | |
feedgps(); | |
} | |
static void print_str(const char *str, int len) | |
{ | |
int slen = strlen(str); | |
for (int i=0; i<len; ++i) | |
Serial.print(i<slen ? str[i] : ' '); | |
feedgps(); | |
} | |
int xx =0; | |
static bool feedgps() | |
{ | |
while (nss.available()) | |
{ | |
char c = nss.read(); | |
Serial.print(c); | |
dataFile.print(c); | |
if (gps.encode(c)) | |
return true; | |
} | |
if(++xx == 50) | |
{ | |
dataFile.flush(); | |
} | |
return false; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment