Problemas con modulo GPS y tarjeta sd

buenas tardes, antes que nada, me presento soy nuevo en esto de la programación de Arduino y e visto varios códigos parecidos y probe hacer este para un proyecto.
El problema que tengo es que el código si me aguarda los datos, pero me los aguada demasiado separados los datos como se ve en la foto.


y después de varios datos me lo vuelve a grabar y lo que quiero es que me aguarde los datos cada segundo si es posible y aver si me pudieran orientar si es que m falta parte del codigo o alguna otra cosa.
adjunto el codigo

#include <TinyGPS.h> //libreria gps 
TinyGPS gps;
#include <SoftwareSerial.h>

SoftwareSerial serialgps(11,10); //entradas de arduino mega

#include <SPI.h> //librerias sd
#include <SD.h> // librerias sd

const int chipSelect = 53; // pin usado mega 53
 int year;
  byte month, day, hour, minute, second, hundredths; //variables para dias
  unsigned long chars;
 unsigned short sentences, failed_checksum;
void setup()
{
  // abrimos serial de comunicaciones
  Serial.begin(9600);

  serialgps.begin(9600);
  
  
  pinMode(chipSelect, OUTPUT);


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

  // ver si la tarjeta se esta inicializando
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    //si no pasa eso 
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop()
{
 
    String dataString = ""; // vacia la cadena para evitar incovenientes

        // imprime los datos del gps
    Datosgps();
    String gpsString = "";
   


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

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

    while(serialgps.available()) 
   {
    int c = serialgps.read(); 
    if(gps.encode(c)) 
    {
     
      float latitude, longitude;
     gps.f_get_position(&latitude, &longitude);
    gpsString  += String("Latitud: ")+String(latitude,5) + String(" ");
    gpsString  += String("Longitud: ")+String(longitude,5) + String(" ");
    gpsString  += String("Velocidad en km/hr: ")+String(gps.f_speed_kmph()) + String(" ");
    gpsString  += String("Satelites encontrados: ")+String(gps.satellites()) + String(" ");
gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
    gpsString  += String("DIA: ")+String(day, DEC) + String(" ");
     gpsString  += String("MES: ")+String(month, DEC) + String(" ");
      gpsString  += String("AÑO: ")+String(year, DEC) + String(" ");
    gps.stats(&chars, &sentences, &failed_checksum);
    }}
    // 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);
    }
    // Si el archivo no se abre imprimir:
    else {
        Serial.println("Error abriendo DATOSGPS.txt");
    }


 }
 
void Datosgps()
{
  // imprimir variables pedidas
  while(serialgps.available()) 
   {
    int c = serialgps.read(); 
    if(gps.encode(c)) 
 {// comienza la accion
 float latitude, longitude;
     gps.f_get_position(&latitude, &longitude);
  Serial.print("Latitud: "); Serial.println(latitude,5);
  Serial.print("Longitud: "); Serial.println(longitude,5);
  Serial.print("velocidad en km/hr: "); Serial.println(gps.f_speed_kmph());
  gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
  Serial.print("dia: "); Serial.println(day, DEC);
Serial.print("mes: "); Serial.println(month, DEC);
Serial.print("año: "); Serial.println(year, DEC);  
  Serial.print("Satelites encontrados: "); Serial.println(gps.satellites());
  Serial.println();
  gps.stats(&chars, &sentences, &failed_checksum);
}
   }}



:warning:
Código corregido

Tu publicación fue ** MOVIDA ** a su ubicación actual ya que es más adecuada.

¿Podría también tomarse unos minutos para Aprenda a usar el foro .

Solo debes ver esto

 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);
  }

dataString no sirve para nada. Lo inicializas

String dataString = "";

y nunca le cargas un dato?
asi que solo coméntalo a ver como se muestran los datos
El primer valor son los segundos y uego pones una , y a continuación alcanza con solo mostrar

dataFile.println(gpsString);

ya quité data string y solo deje (gpsString) y me sigue dando el mismo error

Primero, no es un error. Es algo que no deseas en tu programación pero no hay error.
Sacaste

 Serial.println(dataString);

y sigues teniendo la misma respuesta en tu salida serial?

Ya no es lo mismo mejoro bastante el nivel de respuesta ya me los datos seguidos el problema está en que los números que aparecen son repetitivos así como se muestra en la imagen

Tu problema ahora es que no tienes datos del GPS. vamos a agregar una variables SI o NO o sea una variable booleana que controle cuando tienes datos entres los guardas y si no, no haces nada

#include <Arduino.h>

#include <TinyGPS.h> //libreria gps 
TinyGPS gps;
#include <SoftwareSerial.h>

SoftwareSerial serialgps(11, 10); //entradas de arduino mega

#include <SPI.h> //librerias sd
#include <SD.h> // librerias sd

const int chipSelect = 53; // pin usado mega 53
int year;
byte month, day, hour, minute, second, hundredths; //variables para dias
unsigned long chars;
unsigned short sentences, failed_checksum;
bool guardarDatos = false;

void setup() {
  // abrimos serial de comunicaciones
  Serial.begin(9600);

  serialgps.begin(9600);


  pinMode(chipSelect, OUTPUT);


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

  // ver si la tarjeta se esta inicializando
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    //si no pasa eso 
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop() {

  String dataString = ""; // vacia la cadena para evitar incovenientes

  // imprime los datos del gps
  Datosgps();
  String gpsString = "";

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

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

  while (serialgps.available()) {
    int c = serialgps.read();
    if (gps.encode(c)) {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      gpsString += String("Latitud: ") + String(latitude, 5) + String(" ");
      gpsString += String("Longitud: ") + String(longitude, 5) + String(" ");
      gpsString += String("Velocidad en km/hr: ") + String(gps.f_speed_kmph()) + String(" ");
      gpsString += String("Satelites encontrados: ") + String(gps.satellites()) + String(" ");
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      gpsString += String("DIA: ") + String(day, DEC) + String(" ");
      gpsString += String("MES: ") + String(month, DEC) + String(" ");
      gpsString += String("AÑO: ") + String(year, DEC) + String(" ");
      gps.stats(&chars, &sentences, &failed_checksum);
      guardarDatos = true;
    }
  }
  // Si el archivo existe, escribimos en el.
  if (guardarDatos)
      if (dataFile) {
        dataFile.print((millis() / 1000));
        dataFile.print(",");
        dataFile.println(gpsString);
        dataFile.close();
        guardarDatos = false;
      }
      // Si el archivo no se abre imprimir:
      else {
        Serial.println("Error abriendo DATOSGPS.txt");
      }
}
}

void Datosgps() {
  // imprimir variables pedidas
  while (serialgps.available()) {
    int c = serialgps.read();
    if (gps.encode(c)) {// comienza la accion
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Latitud: "); Serial.println(latitude, 5);
      Serial.print("Longitud: "); Serial.println(longitude, 5);
      Serial.print("velocidad en km/hr: "); Serial.println(gps.f_speed_kmph());
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      Serial.print("dia: "); Serial.println(day, DEC);
      Serial.print("mes: "); Serial.println(month, DEC);
      Serial.print("año: "); Serial.println(year, DEC);
      Serial.print("Satelites encontrados: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
    }
  }
}
#include <Arduino.h>

#include <TinyGPS.h> //libreria gps 
TinyGPS gps;
#include <SoftwareSerial.h>

SoftwareSerial serialgps(11, 10); //entradas de arduino mega

#include <SPI.h> //librerias sd
#include <SD.h> // librerias sd

const int chipSelect = 53; // pin usado mega 53
int year;
byte month, day, hour, minute, second, hundredths; //variables para dias
unsigned long chars;
unsigned short sentences, failed_checksum;
bool guardarDatos = false;

void setup() {
  // abrimos serial de comunicaciones
  Serial.begin(9600);

  serialgps.begin(9600);


  pinMode(chipSelect, OUTPUT);


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

  // ver si la tarjeta se esta inicializando
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    //si no pasa eso 
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop() {



  // imprime los datos del gps
  Datosgps();
  String gpsString = "";

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

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

  while (serialgps.available()) {
    int c = serialgps.read();
    if (gps.encode(c)) {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      gpsString += String("Latitud: ") + String(latitude, 5) + String(" ");
      gpsString += String("Longitud: ") + String(longitude, 5) + String(" ");
      gpsString += String("Velocidad en km/hr: ") + String(gps.f_speed_kmph()) + String(" ");
      gpsString += String("Satelites encontrados: ") + String(gps.satellites()) + String(" ");
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      gpsString += String("DIA: ") + String(day, DEC) + String(" ");
      gpsString += String("MES: ") + String(month, DEC) + String(" ");
      gpsString += String("AÑO: ") + String(year, DEC) + String(" ");
      gps.stats(&chars, &sentences, &failed_checksum);
      guardarDatos = true;
    }
  }
  // Si el archivo existe, escribimos en el.
  if (guardarDatos)
    if (dataFile) {
        dataFile.print((millis() / 1000));
        dataFile.print(",");
        dataFile.println(gpsString);
        dataFile.close();
        guardarDatos = false;
      }
      // Si el archivo no se abre imprimir:
      else {
        Serial.println("Error abriendo DATOSGPS.txt");
      }

}

void Datosgps() {
  // imprimir variables pedidas
  while (serialgps.available()) {
    int c = serialgps.read();
    if (gps.encode(c)) {// comienza la accion
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      Serial.print("Latitud: "); Serial.println(latitude, 5);
      Serial.print("Longitud: "); Serial.println(longitude, 5);
      Serial.print("velocidad en km/hr: "); Serial.println(gps.f_speed_kmph());
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      Serial.print("dia: "); Serial.println(day, DEC);
      Serial.print("mes: "); Serial.println(month, DEC);
      Serial.print("año: "); Serial.println(year, DEC);
      Serial.print("Satelites encontrados: "); Serial.println(gps.satellites());
      Serial.println();
      gps.stats(&chars, &sentences, &failed_checksum);
    }
  }
}

puse el codigo y ahora me pasa esto
image
ya lo reinicie varias veces y en algunas ocasiones si aguarda el dato correctamente cuando reinicio, pero solamente una vez

me lo guarda 1 vez y solo cuando reinicio como se ve en la foto

Lo que te puse fue una variable que cada vez que tienes datos nuevos de GPS te permita guardarlos en el archivo.
No me había dado cuenta de que estaba repetida la lectura de datos del gps, quita por favor

Datosgps();

Deja solo esto

#include <TinyGPS.h> //libreria gps 
TinyGPS gps;
#include <SoftwareSerial.h>

SoftwareSerial serialgps(11, 10); //entradas de arduino mega

#include <SPI.h> //librerias sd
#include <SD.h> // librerias sd

const int chipSelect = 53; // pin usado mega 53
int year;
byte month, day, hour, minute, second, hundredths; //variables para dias
unsigned long chars;
unsigned short sentences, failed_checksum;
bool guardarDatos = false;

void setup() {
  // abrimos serial de comunicaciones
  Serial.begin(9600);

  serialgps.begin(9600);


  pinMode(chipSelect, OUTPUT);


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

  // ver si la tarjeta se esta inicializando
  if (!SD.begin(chipSelect)) {
    Serial.println("Fallo o tarjeta no presente");
    //si no pasa eso 
    return;
  }
  Serial.println("Tarjeta SD OK");
}

void loop() {
  // imprime los datos del gps
  String gpsString = "";

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

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

  while (serialgps.available()) {
    int c = serialgps.read();
    if (gps.encode(c)) {
      float latitude, longitude;
      gps.f_get_position(&latitude, &longitude);
      gpsString += String("Latitud: ") + String(latitude, 5) + String(" ");
      gpsString += String("Longitud: ") + String(longitude, 5) + String(" ");
      gpsString += String("Velocidad en km/hr: ") + String(gps.f_speed_kmph()) + String(" ");
      gpsString += String("Satelites encontrados: ") + String(gps.satellites()) + String(" ");
      gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths);
      gpsString += String("DIA: ") + String(day, DEC) + String(" ");
      gpsString += String("MES: ") + String(month, DEC) + String(" ");
      gpsString += String("AÑO: ") + String(year, DEC) + String(" ");
      gps.stats(&chars, &sentences, &failed_checksum);
      guardarDatos = true;
    }
  }
  // Si el archivo existe, escribimos en el.
  if (guardarDatos) {
    if (dataFile) {
      dataFile.print((millis() / 1000));
      dataFile.print(",");
      dataFile.println(gpsString);
      dataFile.close();
      guardarDatos = false;
    }
    // Si el archivo no se abre imprimir:
    else {
      Serial.println("Error abriendo DATOSGPS.txt");
    }
  }
}

Me sigue dando lo mismo compañero. :smiling_face_with_tear:

Usas una Mega con 4 puertos serie hardware ¿y usas SoftwareSerial?

En lugar de armar esa String "monstruosa" (si, exagero...) ¿por qué no envías los datos directamente a la SD?

En lugar de

gpsString += String("Latitud: ") + String(latitude, 5) + String(" ");
gpsString += String("Longitud: ") + String(longitude, 5) + String(" "); 
// etc.

y luego

dataFile.println(gpsString);

puedes hacer directamente

dataFile.print("Latitud: ");
dataFile.print(latitude, 5);
dataFile.print(" "); 
dataFile.print("Longitud: ");
dataFile.print(longitude, 5);
dataFile.print(" "); 
// etc.

y ahorras todo ese manejo de Strings que sabemos que no es muy eficiente.

Por otro lado, la librería tiene las funciones isValid() e isUpdated() que sería "muy conveniente" (por no decir fundamental) utilizarlas.

Saludos

Muchas gracias ya se pudo resolver, ya me da los datos como queria

Nobleza obliga, cuéntanos como lo has resuelto ya que puede ser de utilidad a otro usuario.

Deja la parte igual del código de arriba hasta donde inicia el void loop y en void loop hacia la escritura directa únicamente agrege datastring para que que enumerada los datos de esta forma pude meterlos a exel

  if (dataFile) {
      dataFile.print((millis() / 1000));
     dataFile.print(",");
     dataFile.println(dataString);
      dataFile.print("Latitud: ");
dataFile.print(latitude, 5);
dataFile.print(" "); 
dataFile.print(",");
dataFile.print("Longitud: ");
dataFile.print(longitude, 5);
dataFile.print(" ");
dataFile.print(",");
 dataFile.print("Velocidad en Km/Hr: ");
dataFile.print(gps.f_speed_kmph());
dataFile.print(" "); 

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.