18-07-2023, 09:55 PM
Hola a todos tengo unas dudas, estoy realizando un proyecto donde debo capturar partículas de un sensro de particulas, 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 muchisimo, 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;
}
}
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 muchisimo, 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;
}
}