What and why is RMC?
The GPS devices sends information in "sentences".
Different sentences contain different fields (see this table). Since you are only using speed, you only need one of the sentences that contain speed: RMC or VTG.
If I turns off all sentences except the RMC, what impact will it have?
To reduce the number of RX char interrupts the Arduino has to handle, tell the GPS to send the fewest sentences possible.
To reduce the time that NeoGPS spends in recognizing different sentences, minimize the NMEAGPS_cfg.h configuration file as described above. This also reduces RAM and program space.
To reduce the time that NeoGPS spends parsing fields that you don't use, minimize the GPSfix_cfg.h configuration file as described above. This also reduces RAM and program space.
To configure the GPS to send only the RMC sentence, add these lines of code to your setup
function:
gps.send_P( &gpsPort, F("PUBX,40,GLL,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,GSV,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,GSA,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,VTG,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,ZDA,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,RMC,0,1,0,0,0,0") ); // <-- only enabled sentence
gps.send_P( &gpsPort, F("PUBX,40,GGA,0,0,0,0,0,0") );
This matches the config files above.
To be even more efficient, you could try using just the VTG sentence. Make these changes to NMEAGPS_cfg.h:
//#define NMEAGPS_PARSE_GGA
//#define NMEAGPS_PARSE_GLL
//#define NMEAGPS_PARSE_GSA
//#define NMEAGPS_PARSE_GSV
//#define NMEAGPS_PARSE_GST
//#define NMEAGPS_PARSE_RMC
#define NMEAGPS_PARSE_VTG
//#define NMEAGPS_PARSE_ZDA
#define LAST_SENTENCE_IN_INTERVAL NMEAGPS::NMEA_VTG
And send these commands in setup
:
gps.send_P( &gpsPort, F("PUBX,40,GLL,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,GSV,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,GSA,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,VTG,0,1,0,0,0,0") ); // <-- only enabled sentence
gps.send_P( &gpsPort, F("PUBX,40,ZDA,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,RMC,0,0,0,0,0,0") );
gps.send_P( &gpsPort, F("PUBX,40,GGA,0,0,0,0,0,0") );
How to configure that will run at 1.67Hz?
Start with these changes at 1Hz, as it will give the maximum amount of time for the OBD functions to complete. It will also coordinate the OBD functions with the GPS quiet time. No RX char interrupts will occur during the OBD functions.
Likewise, the OBD functions will have completed by the time a new GPS update begins (RX char interrupts).
If this works very reliably, post your code and I can comment on changing the display update rate.
But still there are some "wrong" readings from OBD.
Explain this in more detail.