Запись информации GPS каждую секунду с использованием NeoGPS - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь записывать вывод GPS каждую секунду в выходной файл, но получаю только нули в выводе.Для вывода другого датчика он работает ...

Изначально я использовал пакет TinyGPS ++.Однако невозможно было выводить данные GPS каждую секунду.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <avr/wdt.h>
#include "BlueDot_BME680.h"
BlueDot_BME680 bme680 = BlueDot_BME680();

#include <NMEAGPS.h>
#include <GPSport.h>
#include <Streamers.h>


static const int RXPin = 2, TXPin = 3;
static const uint32_t GPSBaud = 9600;


NMEAGPS gps;
gps_fix fix;


File myFile;

void setup() {
//*********************** serielle kommunikation
  Wire.begin(); 
  Serial.begin(9600);
  gpsPort.begin(GPSBaud);

  if (!SD.begin(4)) {

    return;
  }

    bme680.parameter.I2CAddress = 0x76;                  //Choose I2C Address
    bme680.parameter.sensorMode = 0b01;                  //Default sensor mode
    bme680.parameter.IIRfilter = 0b100;                  //Setting IIR Filter coefficient (15 default,0 off, 127 max)
    bme680.parameter.humidOversampling = 0b101;          //Setting Humidity Oversampling factor (16 default,0 disable humidity meas.) 
    bme680.parameter.tempOversampling = 0b101;           //Setting Temperature Oversampling factor (16 default, 0 disable)
    bme680.parameter.pressOversampling = 0b101;          //Setting Pressure Oversampling factor (16 default,0 disable) 
    bme680.parameter.pressureSeaLevel = 1013.25;         //default value of 1013.25 hPa
    bme680.parameter.tempOutsideCelsius = 15;            //default 15°C, current average outside temp to calculate altitude
    bme680.parameter.target_temp = 320;                  // gas sensor hot plate temp (320C default, 200C min, 400C max)



  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  bme680.writeCTRLMeas();

  myFile = SD.open("sensor.txt", FILE_WRITE);


  if (myFile) {
    // print the headings for our data
    myFile.println("Time,Sat,Lat,Lng,Alt,Temp,Hum,Press");
  }
  myFile.close();
}

void sensor() {
  bme680.writeCTRLMeas();
  myFile = SD.open("sensor.txt", FILE_WRITE);
  if (myFile) {
  myFile.print(fix.dateTime);
  myFile.print(',');
  myFile.print(fix.satellites);
  myFile.print(',');
  myFile.print(fix.latitude(), 6);
  myFile.print(',');
  myFile.print(fix.longitude(), 6);
  myFile.print(',');
  myFile.print(fix.altitude());
  myFile.print(',');  
  myFile.print(bme680.readTempC());
  myFile.print(',');
  myFile.print(bme680.readHumidity());
  myFile.print(',');
  myFile.print(bme680.readPressure());
  myFile.println();
  }
  myFile.close();
}


//  This is the main GPS parsing loop.
static void GPSloop()
{
  while (gps.available( gpsPort )) {
    fix = gps.read();
    sensor();
  }
}

void loop()
{
  GPSloop();

  delay(1000);
}

Цель состоит в том, чтобы извлекать данные GPS каждую секунду.На данный момент я получаю только нули.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Во-первых, вам необходимо постоянно передавать последовательные данные (символы) в ваш объект fix, поэтому вам нужно удалить delay(1000) из вашего цикла.

Во-вторых, вам нужно проверить, находится ли местоположениедействителен, а затем записать их на SD.

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <avr/wdt.h>
#include "BlueDot_BME680.h"
BlueDot_BME680 bme680 = BlueDot_BME680();

#include <NMEAGPS.h>
#include <GPSport.h>
#include <Streamers.h>

static const int RXPin = 2, TXPin = 3;
static const uint32_t GPSBaud = 9600;

NMEAGPS gps;
gps_fix fix;

File myFile;

void setup()
{
    //*********************** serielle kommunikation
    Wire.begin();
    Serial.begin(9600);
    gpsPort.begin(GPSBaud);

    if (!SD.begin(4))
    {

        return;
    }

    bme680.parameter.I2CAddress = 0x76;          //Choose I2C Address
    bme680.parameter.sensorMode = 0b01;          //Default sensor mode
    bme680.parameter.IIRfilter = 0b100;          //Setting IIR Filter coefficient (15 default,0 off, 127 max)
    bme680.parameter.humidOversampling = 0b101;  //Setting Humidity Oversampling factor (16 default,0 disable humidity meas.)
    bme680.parameter.tempOversampling = 0b101;   //Setting Temperature Oversampling factor (16 default, 0 disable)
    bme680.parameter.pressOversampling = 0b101;  //Setting Pressure Oversampling factor (16 default,0 disable)
    bme680.parameter.pressureSeaLevel = 1013.25; //default value of 1013.25 hPa
    bme680.parameter.tempOutsideCelsius = 15;    //default 15°C, current average outside temp to calculate altitude
    bme680.parameter.target_temp = 320;          // gas sensor hot plate temp (320C default, 200C min, 400C max)

    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    bme680.writeCTRLMeas();

    myFile = SD.open("sensor.txt", FILE_WRITE);

    if (myFile)
    {
        // print the headings for our data
        myFile.println("Time,Sat,Lat,Lng,Alt,Temp,Hum,Press");
    }
    myFile.close();
}

void sensor()
{
    bme680.writeCTRLMeas();
    myFile = SD.open("sensor.txt", FILE_WRITE);
    if (myFile)
    {
        myFile.print(fix.dateTime);
        myFile.print(',');
        myFile.print(fix.satellites);
        myFile.print(',');
        myFile.print(fix.latitude(), 6);
        myFile.print(',');
        myFile.print(fix.longitude(), 6);
        myFile.print(',');
        myFile.print(fix.altitude());
        myFile.print(',');
        myFile.print(bme680.readTempC());
        myFile.print(',');
        myFile.print(bme680.readHumidity());
        myFile.print(',');
        myFile.print(bme680.readPressure());
        myFile.println();
    }
    myFile.close();
}

//  This is the main GPS parsing loop.
static void GPSloop()
{
    while (gps.available(gpsPort))
    {
        fix = gps.read();
        if (fix.valid.location)
            sensor();
    }
}

void loop()
{
    GPSloop();
}
0 голосов
/ 22 мая 2019

Как читается в комментариях, я не думаю, что можно получить все данные GPS с частотой 1 секунда, это не работает так быстро, по крайней мере, для положения и скорости (данные GPRMC) ... также это требует времени (возможно, минут), чтобы сделать первое исправление при включении. Попробуйте сделать цикл, чтобы получить первое исправление, а затем обновлять его каждые 5 секунд, и работайте оттуда, пытаясь сделать его быстрее.

...