File size: 5,731 Bytes
53ca30f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
#include <TinyGPS.h>
#include <SD.h>
#include <stdlib.h>
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<len; ++1)
sz[i] = ' ';
if (len > 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<len; ++i)
sz[i] = ' ';
Serial.print(sz);
if(SD_val == 1) SD_lat = sz;
else if(SD_val == 2) SD_lon = sz;
}
else
{
Serial.print(val, prec);
if (SD_val == 1) SD_lat = dtostrf(val,10,5,dtostrfbuffer);
else if (SD_val == 2) SD_lon = dtostrf(val,10,5,dtostrfbuffer);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1);
fle += 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("******* ******* ");
SD_date_time = "invalid";
}
else
}
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",
month, day, year, hour, minute, second);
Serial.print(sz);
SD_date_time = 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 (Serial3.availabe())
{
if (gps.encode(Serial3.read()))
return true;
}
return false;
}
|