This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
DUDA arduino uno + GPS + SD + SDS011
#1
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;
  }
}
  Responder
#2
Buenos días

Cita:estoy realizando un proyecto donde debo capturar partículas de un sensor de partículas,

Creo que quieres decir que vas a tomar las lecturas de un sensor de partículas.

Conforme tienes escrito el programa ¿Te compila? a mi no, me da varios errores básicos de generación del objeto sds, que ya deberías haber resuelto tu.


No he trabajado con el sensor de partículas Nova al que haces referencia, pero

¿Qué librería SDS usas? hay varias, y depende de cual uses creo que la librería está mal invocada, creo que deberías poner

Código:
#include <NovaSDS011.h>

Que es lo que dice en el ejemplo de la propia librería del sensor Nova SDS 011, en vez de lo que has puesto en el código  
Código:
#include <SDS011.h>


Veo que inicias el puerto serie a una velocidad y el GPS a otra, líneas 27 y 28

Código:
Serial.begin(115200); //inicia el puerto serie a 115200 baudios/seg

  ss.begin(9600); //inicia el GPS a 9600 baudios/seg

Esto te puede dar problemas a la hora de ver los datos en el Monitor Serie, deberían estar los dos a la misma velocidad 9600

En la línea 40, quieres que te imprima en el Monitor Serie las lecturas del sensor de partículas, pero en la línea 41 no hay nada entre los paréntesis, por lo tanto no va a salir ningún dato en el Monitor Serie

Código:
Serial.print("Datos de sensor particulas V 1.0 ");

  Serial.println();

Si utilizas la Macro f

Código:
SerialPrin(F())

En todos los textos fijos te ahorras un espacio considerable de código

Lineas 109 113 nuevas con el SerialPrint F

Código:
Serial.print(F("PM2.5="));
Serial.print(pm25);
Serial.print(F(" PM10="));
Serial.print(pm10);
Serial.println(F()); // ¿Qué quieres que te muestre aquí?


En tu línea 113 no tienes ningún valor, por lo tanto no te va mostrar ningún valor en el Monitor Serie

Tu línea 61, no la admite al compilar

Código:
if (sds011.read(&pm25, &pm10))

dice que la orden read, no es valida para esa librería
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  exit status 1 Error compilando para la tarjeta Arduino/Genuino Uno fcojavier 26 59,300 18-03-2022, 11:26 PM
Último mensaje: asesorplaza1
  Placa MEGA(china) la reconoce como UNO Jaimelito 1 888 18-11-2020, 10:15 PM
Último mensaje: asesorplaza1
  CONSULTA ¿como uno dos codigos en un solo codigo? laurangcard 1 943 18-11-2020, 10:03 PM
Último mensaje: asesorplaza1
Triste DUDA Error compilando para la tarjeta Arduino/Genuino Uno. Necesito ayuda siro7 9 4,836 28-04-2019, 02:22 PM
Último mensaje: siro7
Exclamación DUDA Error compilando para la tarjeta Arduino/Genuino Uno aimarlasa 2 3,019 16-01-2019, 06:34 PM
Último mensaje: Nullz