每秒使用neogps撰写GPS信息



我试图每秒写入每秒输出的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数据。目前我只得到零。

正如注释中所读取的那样,我认为可以以1秒的频率获取所有GPS数据,它至少无法为位置和速度(GPRMC数据(运行。(...在电源时进行第一个修复需要花费时间(也许会分钟(。尝试制作一个循环以获取第一个修复程序,然后每5秒更新一次,然后从那里工作以使其更快。

首先,您需要不断将序列数据(chars(馈送到您的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();
}

最新更新