Arduino uno + GPS + SD + Sensor

Hola a todos tengo unas dudas, estoy realizando un proyecto donde debo capturar partículas de un sensor de partículas, junto con los datos de longitud y latitud de un modulo GPS y guardarlos en una microSD en un archivo CSV, todo esto en arduino uno,
el inconveniente que tengo es que no logro mostrar los datos del GPS y tampoco guardarlos, pero si me guarda los del sensor en el archivo CSV. en monitor serial me muestra los datos

dejo el código, si saben que puede ser, les agradezco muchísimo, todos esta alimentados a los pines de 5v del arduino uno.

Modulo Gps Neo-6m
Sensor de particulas SDS011 NOVA PM
Lector grabador de tarjeta SD

#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <SD.h>
#include <SDS011.h>

// Configuración del módulo SD
const int chipSelect = 10; // Pin CS del módulo SD

// Configuración del módulo GPS
TinyGPSPlus gps;
SoftwareSerial ss(0, 1); // Se utiliza el pin 4 como RX y el pin 3 como TX

// Configuración del sensor de partículas SDS011
SDS011 sds;

File dataFile; // Variable para el archivo de datos

unsigned long previousTime = 0; // Variable para almacenar el tiempo anterior
unsigned long interval = 10000; // Intervalo de tiempo en milisegundos (10 segundos)

void setup()
{
Serial.begin(115200);
ss.begin(9600);

// Inicializar la tarjeta SD
if (!SD.begin(chipSelect))
{
Serial.println("Error al inicializar la tarjeta SD.");
return;
}

// Inicializar el sensor de partículas SDS011
sds.begin(6, 7); // Pines 6 (RX) y 7 (TX)

Serial.print("Datos de sensor particulas V 1.0 ");
Serial.println();
}

void loop()
{
bool newDataGPS = false;
bool newDataSDS = false;
unsigned long chars;
unsigned short sentences, failed;

// Obtener el tiempo actual
unsigned long currentTime = millis();

// Verificar si ha pasado el intervalo de tiempo deseado
if (currentTime - previousTime >= interval)
{
previousTime = currentTime; // Actualizar el tiempo anterior

// Leer datos del sensor de partículas SDS011
float pm25, pm10;
if (sds.read(&pm25, &pm10))
{
  newDataSDS = true;

  // Abrir el archivo en modo escritura y añadir datos al final
  dataFile = SD.open("data.csv", FILE_WRITE);
  if (dataFile)
  {
    // Escribir los datos en el archivo CSV
    float latitude = gps.location.lat();
    float longitude = gps.location.lng();
    dataFile.print(latitude, 6);
    dataFile.print(",");
    dataFile.print(longitude, 6);
    dataFile.print(",");
    dataFile.print(gps.satellites.value());
    dataFile.print(",");
    dataFile.print(gps.hdop.value());
    dataFile.print(",");
    dataFile.print(pm25);
    dataFile.print(",");
    dataFile.println(pm10);

    // Cerrar el archivo
    dataFile.close();
  }
  else
  {
    Serial.println("Error al abrir el archivo.");
  }
}

// Imprimir los datos en el Monitor Serie
if (newDataGPS)
{
  Serial.print("LAT=");
  Serial.print(gps.location.lat(), 6);
  Serial.print(" LON=");
  Serial.print(gps.location.lng(), 6);
  Serial.println();
}
else
{
  Serial.println(" No se recibieron caracteres del GPS: revisa la conexión ");
}

if (newDataSDS)
{
  Serial.print("PM2.5=");
  Serial.print(pm25);
  Serial.print(" PM10=");
  Serial.print(pm10);
  Serial.println();
}
else
{
  Serial.println(" No se recibieron datos del sensor de partículas: revisa la conexión ");
}

// Ajustar el intervalo de tiempo si el usuario lo desea
if (Serial.available() > 0)
{
  interval = Serial.parseInt();
}

}

// Para parsear los datos del GPS durante un segundo
while (ss.available())
{
char c = ss.read();
Serial.write©; // Descomenta esta línea si quieres ver los datos del GPS en el Monitor Serie
if (gps.encode©) // ¿Se recibió una nueva sentencia válida?
newDataGPS = true;
}
}

SoftwareSerial ss(0, 1); // Se utiliza el pin 4 como RX y el pin 3 como TX

Estás poniendo SoftwareSerial en los mismos pines (0 y 1) que Serial, no en 3 y 4, así que el comentario no tiene sentido pero además no te va a funcionar nunca.

Puedes usar tranquilamente Serial porque no vas a enviar datos al GPS ni recibir del puerto USB, conecta solo Rx del UNO al Tx del GPS y pon Serial a 9600 y olvida SoftwareSerial.

Te recomiendo que uses la librería NeoGps en lugar de TinyGps++.

hola buenas tardes, gracias por el apoyo suministrado realice pruebas con la librería que me indicaste pero no me funciono ya que esta librería trae pines por defecto y no me permitió ajustarlo, me sigue sin tomar los datos del modulo GPS, agradezco cualquier ayuda posible o ideas.

No, no trae pines por defecto, en GPSport.h defines que puerto usas. Incluso puedes usar SoftwareSerial.

Te avisé que están mal definidos los pines para usar SoftwareSerial, ¿los cambiaste?

TinyGps++ puede darte buenos resultados o no porque no tiene en cuenta el orden en que llegan las sentencias, entonces puedes terminar con los datos de localización desfasados del horario. Depende de lo precisa que deba ser la aplicación puede ser un completo desastre o no importar. Ten en cuenta que 1 segundo de desfasaje a paso de hombre son menos de 3 m. de error pero a 120 km/h son más de 33 m.
Hay otros detalles (explicados en la documentación de la librería), por ej., que no verifica la validez de los datos. Además solo decodifica 2 sentencias NMEA (alguna más "a pedido"), en NeoGps configuras desde el puerto serie hasta cuales sentencias quieres decodificar con solo modificar un par de archivos de configuración.

Por cierto, edita tu primer post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7. También usa la opción "Autoformato" del menú "Herramientas" de la IDE antes de copiar el código así nos facilitas su lectura.

1 Like

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