Created
August 23, 2013 19:48
-
-
Save MattReimer/6323259 to your computer and use it in GitHub Desktop.
This file contains 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> | |
/* 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(3, 4); | |
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(57600); | |
nss.begin(57600); | |
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() | |
{ | |
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(); | |
} | |
static bool feedgps() | |
{ | |
while (nss.available()) | |
{ | |
if (gps.encode(nss.read())) | |
return true; | |
} | |
return false; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment