Brad, this is the code I most recently ran on the Arduino.
#include <TinyGPS++.h>
#include <SD.h>
#define ADC_ref 5.0
#define analog_resolution 1024.0
#define zero_x 1.60156
#define zero_y 1.60156
#define zero_z 1.64551
#define sensitivity_x 0.33
#define sensitivity_y 0.33
#define sensitivity_z 0.31
//Establishing GPS
TinyGPSPlus gps;
//Digital Pins
int CS_pin = 53;
int PulsePin = 40;
int GPSOff= 35;
int GPSOn = 33;
//Establishing Variables' Types
unsigned int value_x;
unsigned int value_y;
unsigned int value_z;
unsigned long durationHigh;
unsigned long durationLow;
long AirTemp;
long FanTemp;
float timer;
float latitude;
float longitude;
float monthdata;
float daydata;
float hourdata;
float mindata;
float secdata;
float vel;
float sentences;
float xv;
float yv;
float zv;
float angle_x;
float angle_y;
float angle_z;
boolean hasrun = false;
long AccZ;
void setup()
{
Serial.begin(115200);
Serial3.begin(4800);
Serial.println("Initializing Card");
//Choosing Pin Modes
pinMode(CS_pin, OUTPUT);
pinMode (GPSOff, OUTPUT);
pinMode (GPSOn, OUTPUT);
pinMode(PulsePin, INPUT);
//Check to see if SD Works
if(!SD.begin(CS_pin))
{
Serial.println("Card Failed");
return;
}
Serial.println("Card Ready");
}
void loop()
{
//LED Condition
sentences = (gps.sentencesWithFix());
//Digital Inputs
durationHigh = pulseIn(PulsePin, HIGH , 500000);
durationLow = pulseIn(PulsePin, LOW, 500000);
timer = millis();
//Analog Inputs
FanTemp = analogRead(0);
AirTemp = analogRead(1);
value_x = analogRead(2);
value_y = analogRead(3);
value_z = analogRead(4);
//Acceleration Manipulation
xv = (value_x/analog_resolution*ADC_ref-zero_x)/sensitivity_x;
yv = (value_y/analog_resolution*ADC_ref-zero_y)/sensitivity_y;
zv = (value_z/analog_resolution*ADC_ref-zero_z)/sensitivity_z;
//Tilt Angle
angle_x = atan2(-yv,-zv)*RAD_TO_DEG;
angle_y = atan2(-xv,-zv)*RAD_TO_DEG;
angle_z = atan2(-yv,-xv)*RAD_TO_DEG;
//GPS
while (Serial3.available() > 0)
{
gps.encode(Serial3.read());
}
if (gps.location.isUpdated())
{
latitude = (gps.location.lat() , 8);
longitude = (gps.location.lng(), 8);
}
else if (gps.speed.isUpdated())
{
vel = (gps.speed.mph());
}
else if (gps.time.isUpdated())
{
hourdata =(gps.time.hour());
mindata = (gps.time.minute());
secdata = (gps.time.second());
}
else if (gps.date.isUpdated());
{
monthdata = (gps.date.month());
daydata = (gps.date.day());
}
//Establishing SD File
File dataFile = SD.open ("log.csv", FILE_WRITE);
File GPSFile = SD.open ("GPS.csv", FILE_WRITE);
//Writing Headers
if (hasrun == false)
{
//Debugging to Serial Monitor, can be trimmed for final design
Serial.print("Time (seconds)");
Serial.print(",");
Serial.print("Time between Pulses HIGH (microseconds)");
Serial.print(",");
Serial.print("Time between Pulses LOW (microseconds)");
Serial.print(",");
Serial.print("X Acceleration(G's)");
Serial.print(" , ");
Serial.print("Y Acceleration(G's)");
Serial.print(" , ");
Serial.print("Z Acceleration(G's)");
Serial.print(" , ");
Serial.print("X Angle(deg)");
Serial.print(" , ");
Serial.print("Y Angle(deg)");
Serial.print(" , ");
Serial.print("Z Angle(deg)");
Serial.print(",");
Serial.print("Fan Temperature (Celcius)");
Serial.print(",");
Serial.print("Air Temperature (Celcius)");
Serial.print(",");
Serial.print("Date and Time");
Serial.print(",");
Serial.print("Latitude");
Serial.print(",");
Serial.println("Longitude");
//Writing Data to SD Card
dataFile.print("Time (seconds)");
dataFile.print(",");
dataFile.print("Time between Pulses HIGH (microseconds)");
dataFile.print(",");
dataFile.print("Time between Pulses LOW (microseconds)");
dataFile.print(",");
dataFile.print("X Acceleration(G's)");
dataFile.print(" , ");
dataFile.print("Y Acceleration(G's)");
dataFile.print(" , ");
dataFile.print("Z Acceleration(G's)");
dataFile.print(" , ");
dataFile.print("X Angle(deg)");
dataFile.print(" , ");
dataFile.print("Y Angle(deg)");
dataFile.print(" , ");
dataFile.print("Z Angle(deg)");
dataFile.print(",");
dataFile.print("Fan Temperature (Celcius)");
dataFile.print(",");
dataFile.println("Air Temperature (Celcius)");
GPSFile.print("Date and Time");
GPSFile.print(",");
GPSFile.print("Latitude");
GPSFile.print(",");
GPSFile.print("Longitude");
GPSFile.print(",");
GPSFile.println("Speed");
hasrun = true;
}
if ( sentences == 0)
{
digitalWrite(GPSOff, LOW);
delay(300);
digitalWrite(GPSOff,HIGH);
delay(300);
digitalWrite(GPSOn,LOW);
}
else
{
digitalWrite(GPSOn,HIGH);
}
if (dataFile)
{
//Writing Data to SD Card
dataFile.print(timer/1000);
dataFile.print(',');
dataFile.print(durationHigh);
dataFile.print(',');
dataFile.print(durationLow);
dataFile.print(',');
dataFile.print(xv);
dataFile.print(" , ");
dataFile.print(yv);
dataFile.print(" , ");
dataFile.print(zv);
dataFile.print(" , ");
dataFile.print(angle_x);
dataFile.print(" , ");
dataFile.print(angle_y);
dataFile.print(" , ");
dataFile.print(angle_z);
dataFile.print(",");
dataFile.print(FanTemp*0.484375-1.6875);
dataFile.print(',');
dataFile.println(AirTemp*0.484375-1.6875);
dataFile.close();
GPSFile.print(monthdata );
GPSFile.print(daydata );
GPSFile.print(hourdata );
GPSFile.print(mindata );
GPSFile.print(secdata );
GPSFile.print(",");
GPSFile.print(latitude);
GPSFile.print(",");
GPSFile.print(longitude);
GPSFile.print(",");
GPSFile.println(vel);
GPSFile.close();
//Viewing Data on Computer
Serial.print(timer/1000);
Serial.print(',');
Serial.print(durationHigh);
Serial.print(',');
Serial.print(durationLow);
Serial.print(',');
Serial.print(xv);
Serial.print(" , ");
Serial.print(yv);
Serial.print(" , ");
Serial.print(zv);
Serial.print(" , ");
Serial.print(angle_x);
Serial.print(" , ");
Serial.print(angle_y);
Serial.print(" , ");
Serial.print(angle_z);
Serial.print(",");
Serial.print(FanTemp*0.484375-1.6875);
Serial.print(',');
Serial.print(AirTemp*0.484375-1.6875);
Serial.print(',');
Serial.print(monthdata );
Serial.print(daydata );
Serial.print(hourdata );
Serial.print(mindata );
Serial.print(secdata );
Serial.print(",");
Serial.print(latitude);
Serial.print(",");
Serial.print(longitude);
Serial.print(",");
Serial.println(vel);
}
else
{
Serial.println("Couldn't access file");
}
delay (100);
}
Reading through that code for the LED, I think I know what you're going for. So lastUpdated is tied to the most recent iteration isUpdated was changed to true? However, this is what I found for the isUpdated() as well as isValid() function on the TinyGPS++ (below).
The isValid() method will tell you whether the object contains any valid data and is safe to query.
Similarly, isUpdated() indicates whether the object’s value has been updated (not necessarily changed) since the last time you queried it.
My concern is that isUpdated will be changed to true even if the GPS doesn't have a fix. However, if you've done this before with TinyGPS++ I will certainly defer to you.