le code marche assez bien, environ trois écritures par seconde, trois fois la même mesure et les coordonnées changent toutes les secondes.
le fait que les données soient identiques est normal puisque votre GPS est sans doute configuré pour émettre une trame par seconde. A moins de changer ce paramètre (fréquence d'obtention des fix) vous n'aurez pas mieux.
le buffer série est limité à 64 caractères et à 9600 bauds
Une trame GPS fait souvent plus de 64 caractères, par exemple cette trame en contient 67
$GPRMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n
Quand le GPS va émettre la trame à 9600 bauds, le 65ème caractère va arriver au bout de 68ms. L'arrivée de ce caractère va faire perdre le plus vieux caractère dans le buffer
Si vous faites une pause trop longue entre deux lectures du port série, les 64 caractères restants dans le buffer seront (pour la trame ci dessus)
RMC,045103.000,A,3014.1984,N,09749.2872,W,0.67,161.46,030913,,,A*7C\r\n
le parser de TinyGPS++ ne va donc pas recevoir un $GPRMC et va ignorer entièrement la ligne.
==> comme dit précédemment vous ne pouvez pas vous permettre de ne pas extraire les données du buffer du port série du GPS pendant trop longtemps et c'est ce que vous faites avec votre delay(500)
pour avoir l'actualisation correcte, virez tout ce qui est bloquant, travaillez au maximum en asynchrone et s'il y a trop de tâches un peu longues / à risque dans la loop, lisez plusieurs fois le GPS dans la loop.
Une alternative serait de modifier le code de la bibliothèque qui gère le port série affecté au GPS de façon à augmenter la taille du buffer (si vous avez assez de RAM dans votre arduino) ou alors d'alimenter directement tinyGPS depuis le code d'interruption du hardware ou software serial (au risque de rester super longtemps dans l'interruption car tinyGPS fait pas mal de calculs une fois la trame reçue)...