In the picture attached you can see the signal on the oscilloscope at power on...
In the signal from GPS, I read in the oscilloscope:
$GPGSV,3,2,10,20,41,.....
Excellent! I'm so glad you can scope this out. This confirms that :
The sketch is sending the PMTK configuration command to turn on the GSV sentences.
The GPS device receives it correctly on the GPS RX pin.
The GPS device is sending GSV sentences.
The GPS device can see 10 satellites (3rd field in the GSV sentence).
This eliminates the most common problems. Next:
Now I'm reading:
3 dtsat:4/0
3 dtsat:4/0
near the window.
This shows:
the status (3, a good fix),
date/time are valid (from RMC and GGA sentences),
4 satellites were used to calculate the current fix (according to the GGA sentence), and
0 satellites were tracked in the gps.satellites[] array.
The first 3 are good. The last one, 0 satellites in the array, is bad.
Since you know the GPS device is sending the GSV sentences, either:
the 328 is not receiving anything from the GPS device, or
the 328 is receiving GPS characters, but it is not parsing the GSV sentences correctly.
It must be the latter. Are you sure that this line is uncommented?
#define NMEAGPS_PARSE_GSV
NeoGPS will ignore $GPGSV sentences unless this #define is uncommented.
Make sure there are no NeoGPS files in your sketch directory. Having a NeoGPS config file in the sketch directory can make bad things happen. You must modify the config files in the Libraries/NeoGPS/src directory.
why STATUS_NONE is true with one or more satellites?
This means that the MTK device is using that many satellites to calculate a fix (loc, alt, speed, etc.), but the STATUS_NONE means that it has not successfully calculated a fix yet. I see the same thing with a ublox GPS device. The satellites number goes up just before status becomes STATUS_STD.
The GSV satellites number goes up long before that, which sets the status to STATUS_TIME_ONLY.
Your interpretation of fix.valid.time, fix.satellites and fix.status is acceptable. We don't really know what the MTK is "thinking", but your choices seem reasonable. I think this code is equivalent:
if(fix.valid.status)
{
if(fix.status >= gps_fix::STATUS_STD) lcd.print('F'); // Se ha fatto il punto scrive F
else if((fix.status==gps_fix::STATUS_NONE) && (fix.satellites==0)) lcd.write(byte(0));
else lcd.print('t');
}
else lcd.print('?');