COPIAR DATOS SENSOR GPS A TARJETA SD

Buenas de nuevo!
Estoy haciendo un proyecto en el que coloco un sensor de temperatura y un sensor gps.
La temperatura me da el valor bien y se guarda en la SD, pero el sensor GPS no sé como conseguir que se guarden los datos en la tarjeta SD.

Cuando abro el monitor serie sale el valor tanto de la temperatura como todas las variables del sensor GPS (Lat, Long, Date, Speed, etc) pero no consigo que se almacenen los datos en el archivo donde se estan almacenando los datos de la temperatura.

Os adjunto el código:

#include <TinyGPS++.h> // Include the TinyGPS++ library
TinyGPSPlus tinyGPS; // Create a TinyGPSPlus object

#define GPS_BAUD 9600 // GPS module baud rate. GP3906 defaults to 9600.

// Define the serial monitor port. On the Leonardo this is 'Serial'
//  but on other boards this may be 'SerialUSB'
#define SerialMonitor Serial // e.g. Arduino Leonardo
// Define the harware serial port on pins 0/1. On the Leonardo this is 'Serial1'
//  but on other boards this may be 'Serial'
#define gpsPort Serial2 // e.g. Arduino Leonardo
// See https://www.arduino.cc/en/Reference/Serial to find out which Serial ports
//  you should use in the defines above.
#include <SPI.h>
#include <SD.h>
#include <math.h>

const int B=4275;                 // B value of the thermistor
const int R0 = 100000;            // R0 = 100k

const int pinTempSensor = A0;     // Grove - Temperature Sensor connect to A0
const int chipSelect = 10; // Para Arduino DUE usar pin 10


void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  gpsPort.begin(GPS_BAUD);
  
  pinMode(pinTempSensor, INPUT);
  pinMode(chipSelect, OUTPUT);


  Serial.print("Inicializando SD...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    // don't do anything more:
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop()
{
  //incio del calculo de la temperatura

  int a = analogRead(pinTempSensor );

    float R = 1023.0/(3.3/5*(float)a)-1.0;
    R = 100000.0*R;

    float temperature=1.0/(log(R/100000.0)/B+1/298.15)-273.15;//convert to temperature via datasheet ;
    delay(2000);
 
//Fin del calculo de la tempertura

  String dataString = ""; // Vacia el String para evitar problemas

   // Abre el archivo datalog.txt
  //Solo puede haber un archivo abierto a la vez,
  //por lo que hay que cerrar este si queremos utilizar otro

  File dataFile = SD.open("logTemp.txt", FILE_WRITE);

  //Guardamos en dataString la temperatura y una etiqueta
  // para que se vea la ºC de grados Centigrados

  dataString += String("temperature = ")+ String(temperature)+ String (" ºC");
  // Si el archivo existe, escribimos en el.
  if (dataFile) {
    dataFile.print( (millis()/1000 ) );
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close();
    //    Imprimimos dataString por el Serial para ver la medida.
    Serial.println(dataString);
  }
  // Si el archivo no se abre, imprime un error para avisar.
  else {
    Serial.println("Error abriendo logTemp.txt");
  }
   // print position, altitude, speed, time/date, and satellites:
  printGPSInfo();

  // "Smart delay" looks for GPS data while the Arduino's not doing anything else
  smartDelay(1000); 

 }

void printGPSInfo()
{
  // Print latitude, longitude, altitude in feet, course, speed, date, time,
  // and the number of visible satellites.
  SerialMonitor.print("Lat: "); SerialMonitor.println(tinyGPS.location.lat(), 6);
  SerialMonitor.print("Long: "); SerialMonitor.println(tinyGPS.location.lng(), 6);
  SerialMonitor.print("Alt: "); SerialMonitor.println(tinyGPS.altitude.feet());
  SerialMonitor.print("Course: "); SerialMonitor.println(tinyGPS.course.deg());
  SerialMonitor.print("Speed: "); SerialMonitor.println(tinyGPS.speed.mph());
  SerialMonitor.print("Date: "); printDate();
  SerialMonitor.print("Time: "); printTime();
  SerialMonitor.print("Sats: "); SerialMonitor.println(tinyGPS.satellites.value());
  SerialMonitor.println();
}

// This custom version of delay() ensures that the tinyGPS object
// is being "fed". From the TinyGPS++ examples.
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    // If data has come in from the GPS module
    while (gpsPort.available())
      tinyGPS.encode(gpsPort.read()); // Send it to the encode function
    // tinyGPS.encode(char) continues to "load" the tinGPS object with new
    // data coming in from the GPS module. As full NMEA strings begin to come in
    // the tinyGPS library will be able to start parsing them for pertinent info
  } while (millis() - start < ms);
}

// printDate() formats the date into dd/mm/yy.
void printDate()
{
  SerialMonitor.print(tinyGPS.date.day());
  SerialMonitor.print("/");
  SerialMonitor.print(tinyGPS.date.month());
  SerialMonitor.print("/");
  SerialMonitor.println(tinyGPS.date.year());
}

// printTime() formats the time into "hh:mm:ss", and prints leading 0's
// where they're called for.
void printTime()
{
  SerialMonitor.print(tinyGPS.time.hour());
  SerialMonitor.print(":");
  if (tinyGPS.time.minute() < 10) SerialMonitor.print('0');
  SerialMonitor.print(tinyGPS.time.minute());
  SerialMonitor.print(":");
  if (tinyGPS.time.second() < 10) SerialMonitor.print('0');
  SerialMonitor.println(tinyGPS.time.second());
}

GRACIAS Y ESPERO UNA RESPUESTA!!

No entiendo tu pregunta... Cómo hiciste para guardar la temperatura y no puedes guardar los datos del GPS? El único problema que veo es que la temperatura la lees antes de grabarla lo que es correcto pero los datos del satelite los consultas luego. Podrias ya que es un loop guardar los datos al siguiente ciclo pero tambien podrias poner antes printGPSInfo con lo que ya consultas la información y podrias guardarla en simultaneo con la temperatura en la SD.

La pregunta es que yo para guardar los datos de la temperatura lo hago con esta parte del código

 File dataFile = SD.open("logTemp.txt", FILE_WRITE);

  //Guardamos en dataString la temperatura y una etiqueta
  // para que se vea la ºC de grados Centigrados

  dataString += String("temperature = ")+ String(temperature)+ String (" ºC");
  // Si el archivo existe, escribimos en el.
  if (dataFile) {
    dataFile.print( (millis()/1000 ) );
    dataFile.print(",");
    dataFile.println(dataString);
    dataFile.close();
    //    Imprimimos dataString por el Serial para ver la medida.
    Serial.println(dataString);
  }
  // Si el archivo no se abre, imprime un error para avisar.
  else {
    Serial.println("Error abriendo logTemp.txt");
  }

con dataString le digo que guarde temperature, pero para guardar los datos del GPS no se como decirselo!

Del mismo modo… mira, mas o menos asi, corrige si hay errores.

#include <TinyGPS++.h> // Include the TinyGPS++ library
TinyGPSPlus tinyGPS; // Create a TinyGPSPlus object

#define GPS_BAUD 9600 // GPS module baud rate. GP3906 defaults to 9600.

// Define the serial monitor port. On the Leonardo this is 'Serial'
//  but on other boards this may be 'SerialUSB'
#define SerialMonitor Serial // e.g. Arduino Leonardo
// Define the harware serial port on pins 0/1. On the Leonardo this is 'Serial1'
//  but on other boards this may be 'Serial'
#define gpsPort Serial2 // e.g. Arduino Leonardo
// See https://www.arduino.cc/en/Reference/Serial to find out which Serial ports
//  you should use in the defines above.
#include <SPI.h>
#include <SD.h>
#include <math.h>

const int B=4275;                 // B value of the thermistor
const int R0 = 100000;            // R0 = 100k

const int pinTempSensor = A0;     // Grove - Temperature Sensor connect to A0
const int chipSelect = 10; // Para Arduino DUE usar pin 10


void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);

  gpsPort.begin(GPS_BAUD);
  
  pinMode(pinTempSensor, INPUT);
  pinMode(chipSelect, OUTPUT);


  Serial.print("Inicializando SD...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    // don't do anything more:
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop()
{
    //incio del calculo de la temperatura

    int a = analogRead(pinTempSensor );

    float R = 1023.0/(3.3/5*(float)a)-1.0;
    R = 100000.0*R;

    float temperature = 1.0/(log(R/100000.0)/B+1/298.15)-273.15;//convert to temperature via datasheet ;


    //Fin del calculo de la tempertura

    String dataString = ""; // Vacia el String para evitar problemas

        // print position, altitude, speed, time/date, and satellites:
    printGPSInfo();
    String gpsString = ""
    // "Smart delay" looks for GPS data while the Arduino's not doing anything else
    smartDelay(1000); 

    // Abre el archivo datalog.txt
    //Solo puede haber un archivo abierto a la vez,
    //por lo que hay que cerrar este si queremos utilizar otro

    File dataFile = SD.open("logTemp.txt", FILE_WRITE);

    //Guardamos en dataString la temperatura y una etiqueta
    // para que se vea la ºC de grados Centigrados

    dataString += String("temperature = ")+ String(temperature)+ String (" ºC");
    gpsString  += String("Lat: ")+String(tinyGPS.location.lat()) + String(" ");
    gpsString  += String("Long: ")+String(tinyGPS.location.lng()) + String(" ");
    gpsString  += String("Alt: ")+String(tinyGPS.altitude.feet()) + String(" ");
    gpsString  += String("Course: ")+String(tinyGPS.course.deg()) + String(" ");
    gpsString  += String("Speed: ")+String(tinyGPS.speed.mph()) + String(" ");
    gpsString  += String("Sats: ")+String(tinyGPS.satellites.value()) + String(" ");

    // Si el archivo existe, escribimos en el.
    if (dataFile) {
        dataFile.print( (millis()/1000 ) );
        dataFile.print(",");
        dataFile.println(dataString);
        dataFile.close();
        //    Imprimimos dataString por el Serial para ver la medida.
        Serial.println(dataString);
    }
    // Si el archivo no se abre, imprime un error para avisar.
    else {
        Serial.println("Error abriendo logTemp.txt");
    }


 }

void printGPSInfo()
{
  // Print latitude, longitude, altitude in feet, course, speed, date, time,
  // and the number of visible satellites.
  SerialMonitor.print("Lat: "); SerialMonitor.println(tinyGPS.location.lat(), 6);
  SerialMonitor.print("Long: "); SerialMonitor.println(tinyGPS.location.lng(), 6);
  SerialMonitor.print("Alt: "); SerialMonitor.println(tinyGPS.altitude.feet());
  SerialMonitor.print("Course: "); SerialMonitor.println(tinyGPS.course.deg());
  SerialMonitor.print("Speed: "); SerialMonitor.println(tinyGPS.speed.mph());
  SerialMonitor.print("Date: "); printDate();
  SerialMonitor.print("Time: "); printTime();
  SerialMonitor.print("Sats: "); SerialMonitor.println(tinyGPS.satellites.value());
  SerialMonitor.println();
}

// This custom version of delay() ensures that the tinyGPS object
// is being "fed". From the TinyGPS++ examples.
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do   {
    // If data has come in from the GPS module
    while (gpsPort.available())
      tinyGPS.encode(gpsPort.read()); // Send it to the encode function
    // tinyGPS.encode(char) continues to "load" the tinGPS object with new
    // data coming in from the GPS module. As full NMEA strings begin to come in
    // the tinyGPS library will be able to start parsing them for pertinent info
  } while (millis() - start < ms);
}

// printDate() formats the date into dd/mm/yy.
void printDate()
{
  SerialMonitor.print(tinyGPS.date.day());
  SerialMonitor.print("/");
  SerialMonitor.print(tinyGPS.date.month());
  SerialMonitor.print("/");
  SerialMonitor.println(tinyGPS.date.year());
}

// printTime() formats the time into "hh:mm:ss", and prints leading 0's
// where they're called for.
void printTime()
{
  SerialMonitor.print(tinyGPS.time.hour());
  SerialMonitor.print(":");
  if (tinyGPS.time.minute() < 10) SerialMonitor.print('0');
  SerialMonitor.print(tinyGPS.time.minute());
  SerialMonitor.print(":");
  if (tinyGPS.time.second() < 10) SerialMonitor.print('0');
  SerialMonitor.println(tinyGPS.time.second());
}

Faltaba solo un pequeño detalle pero YA FUNCIONA!!

Faltaba decir que escribiera lo del GPS al abrir el archivo, la linea de print gps

  // Si el archivo existe, escribimos en el.
    if (dataFile) {
        dataFile.print( (millis()/1000 ) );
        dataFile.print(",");
        dataFile.println(dataString);
        dataFile.println(gpsString);
        dataFile.close();
        //    Imprimimos dataString por el Serial para ver la medida.
        Serial.println(dataString);
    }

GRACIAS!!!

Como te dije... lo tenías todo resuelto delante de tus ojos...

Cuando el código crece tanto es fácil no verlo.

Me da gusto que lo resolvieras.