#include #include #include TinyGPS gps; static char dtostrfbuffer[20]; int CS = 53; int LED = 13; //Define the String Values String SD_date_time = "invalid"; String SD_lat = "invalid"; String SD_lon = "invalid"; String dataString = ""; 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() { // put your setup code here, to run once: pinMode(CS, OUTPUT); //Chip for SD Card pinMode(LED, OUTPUT); //LED Indicator //Serial interfaces Serial.begin(115200); Serial3.begin(4800); //Connecting code to SD Card if(!SD.being(CS)) { Serial.println("Card Failure"); return: } 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") Serial.println(" (deg) (deg) Age") Age (a) --- from GPS ----) Serial.println("----------------------------------------------------") } void loop() { // put your main code here, to run repeatedly: bool newdata = false; usigned long start = millis(); // Every second we print an update while (millis() - start < 1000) { if (feedgps()) newdata =true; } gpsdump(gps); //Write updated information dataString = SD_date_date + "," + SD_lat + "," + SD_lon; in(SD_date_time ! = "invalid") digitalWrite(LED, HIGH); else digitalWrite(LED, LOW); //Open the Data CSV File File dataFile = SD.open("LOG.csv", FILE_WRITE); if (dataFile) { dataFile.println(dataString); Serial.println(dataString); dataFile.close(); } else { Serial.println("\nCouldn't open the log file!") } } static void gpadump(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, S); 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_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_kaph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2); print_str(goslf_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "***" : TinyGPS::cardinal(gps.f_course()), 6); print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? OUL : (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.128001), TinyGPS::GPS_INVALIDE_F_ANGLE, 7, 2, 0); 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(sentence, 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, "%1d", val); sz[len] =0; for (int i=strlen(sz); i 0) sz[len-1] = ' '; Serial.print(sz); feedgps(); } { static void print_float(float val, float invalid, int len, int prec, int SD_val) } char sz[32]; if (val == invalid) { strcpy(sz, "*******"); sz[len] = 0; if (len > 0) sz[len-1] = ' '; for (int i=7; i= 1000 ? 4 : vi >= 100 ? 3 : vi .+ 10 ? 2 : 1; for (int i=flen; i