Problem logging data from the Ultimate GPS v3

For other supported Arduino products from Adafruit: Shields, accessories, etc.

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
coding1227
 
Posts: 32
Joined: Tue Apr 30, 2013 5:00 pm

Problem logging data from the Ultimate GPS v3

Post by coding1227 »

Dear support team

I am trying to record the data I get from my ultimate GPS. Using the code below, everything works great. The output I get via serial is:

Adafruit GPS library basic test!

Time: 21:32:26
Time: 21:32:28
Time: 21:32:31
Time: 21:32:34
etc etc...

However... when I uncomment out the line "SS_log.begin(9600);" and the SS_log print lines in order to user softwareserial to write the data out to a data logger, I get the following (both in the serial and sd card file):

Adafruit GPS library basic test!

Time: 0:0:0
Time: 0:0:0
Time: 0:0:0
Time: 0:0:0
Time: 0:0:0

I'm not really sure what is happening, or why... Any help in helping me save the data out from my Ultimate GPS would be great. Thanks!

The code I'm using is:

Code: Select all

#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(3, 2);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO  false
boolean usingInterrupt = false;
void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy

// Declare SoftwareSerial for data logger
SoftwareSerial SS_log(6, 5);



void setup()  
{
  Serial.begin(9600);
  Serial.println("Adafruit GPS library basic test!");

  GPS.begin(9600);
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 Hz update rate
  GPS.sendCommand(PGCMD_ANTENNA);
  useInterrupt(true);

  // Start the logger communication
  SS_log.begin(9600);  
  
  delay(1000);
  mySerial.println(PMTK_Q_RELEASE);
}


// Interrupt is called once a millisecond, looks for any new GPS data, and stores it
SIGNAL(TIMER0_COMPA_vect) {
  char c = GPS.read();
  // if you want to debug, this is a good time to do it!
#ifdef UDR0
  if (GPSECHO)
    if (c) UDR0 = c;  
    // writing direct to UDR0 is much much faster than Serial.print 
    // but only one character can be written at a time. 
#endif
}

void useInterrupt(boolean v) {
  if (v) {
    // Timer0 is already used for millis() - we'll just interrupt somewhere
    // in the middle and call the "Compare A" function above
    OCR0A = 0xAF;
    TIMSK0 |= _BV(OCIE0A);
    usingInterrupt = true;
  } else {
    // do not call the interrupt function COMPA anymore
    TIMSK0 &= ~_BV(OCIE0A);
    usingInterrupt = false;
  }
}

uint32_t timer = millis();
void loop()                     // run over and over again
{
  // in case you are not using the interrupt above, you'll
  // need to 'hand query' the GPS, not suggested :(
  if (! usingInterrupt) {
    // read data from the GPS in the 'main loop'
    char c = GPS.read();
    // if you want to debug, this is a good time to do it!
    if (GPSECHO)
      if (c) Serial.print(c);
  }
  
  // if a sentence is received, we can check the checksum, parse it...
  if (GPS.newNMEAreceived()) {
    // a tricky thing here is if we print the NMEA sentence, or data
    // we end up not listening and catching other sentences! 
    // so be very wary if using OUTPUT_ALLDATA and trytng to print out data
    //Serial.println(GPS.lastNMEA());   // this also sets the newNMEAreceived() flag to false
  
    if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
      return;  // we can fail to parse a sentence in which case we should just wait for another
  }

  // if millis() or timer wraps around, we'll just reset it
  if (timer > millis())  timer = millis();

  // approximately every 2 seconds or so, print out the current stats
  if (millis() - timer > 2000) { 
    timer = millis(); // reset the timer
    
    Serial.print("\nTime: ");
    Serial.print(GPS.hour, DEC); Serial.print(':');
    Serial.print(GPS.minute, DEC); Serial.print(':');
    Serial.print(GPS.seconds, DEC); Serial.print(' ');    
    
/*
SS_openlog.print("\nTime: ");
    SS_log.print(GPS.hour, DEC); SS_openlog.print(':');
    SS_log.print(GPS.minute, DEC); SS_openlog.print(':');
    SS_log.print(GPS.seconds, DEC); SS_openlog.print(' ');
*/
    
  }
}

User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

Re: Problem logging data from the Ultimate GPS v3

Post by adafruit_support_rick »

If you move the SS_log.begin(9600); to before the GPS.begin(9600), then the GPS starts working again.
According to the Arduino site, it's supposed to be OK to have multiple software serial ports, but that doesn't seem to be true in this instance.
Can you use hardware serial for your logger?

Locked
Please be positive and constructive with your questions and comments.

Return to “Other Arduino products from Adafruit”