MKR Wifi 1010 y GPS UBOX NEO 6M

Buenas! Hoy estoy con un proyecto personal basado con la tecnología GPS.
La idea es poder sacar la ubicación y subirla a la nube.
Pero empezando por lo primero. No ocurre nada.

El modulo GPS es un UBOX NEO 6M, conectado con la MKR WIFI 1010. Conexión:

ARDUINO GPS
GND ------ GND
VCC --------VCC
14 TX ------ RXD
13 RX -------TXD
PPS (no pude encontrar que es)

El código que uso es el siguiente:

#include <TinyGPS++.h>
TinyGPSPlus gps;

void setup() {
  Serial.begin(115200);
  Serial1.begin(9600);
}

void loop() {
  while (Serial1.available()) {
    if (gps.encode(Serial1.read())) {
      String msg = Serial1.readStringUntil('\r');
      Serial.print(msg);
      Serial.print("LAT=");  Serial.println(gps.location.lat(), 6);
      Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
      Serial.print("ALT=");  Serial.println(gps.altitude.meters());
      Serial.println(Serial1.read());
      // Delay between updates
      delay(2000);
    }
  }

}

Lo que obtengo en el puerto serie:

$GPGSV,4,1,16,01,30,02,3100,99.99,*48LAT=0.000000
LONG=0.000000
ALT=0.00
10

$GPGSV,4,1,16,01,30,02,30,03,30,09,31*73LAT=0.000000
LONG=0.000000
ALT=0.00
10

Se repite constantemente.
Agregue en el código: Serial.println(Serial1.read()); para ver que dato es el que lee. y lo que veo es que entrega un valor de 10. lo que me parece raro…
Alguien sabe en donde le estoy errando?.
Otro dato, todavía tengo el proyecto en la pc de escritorio y no he podido sacar el modulo a la intemperie. tendrá algo que ver:

PPS no hace falta. Tengo el mismo módulo GPS y no lo uso y funciona perfectamente.

Able to use GPS as a really accurate clock, this board provides a PPS (pulse per second) signal. This is a highly accurate clock pulse coming off a pin on the GPS that NTP can use. If you have such a GPS the resource below is a must read.

Esas mediciones si no las haces en un espacio abierto siempre te van a dar datos raros.
Tiene que ver satelites y eso en una habitación o departamento no ocurrirá jamás, no se si es tu caso pero considéralo.

Ese 10 es CR o retorno de carro

deberías ignorarlo.

tu mismo haces esto

String msg = Serial1.readStringUntil('\r');

leo hasta que alcance a CR pero queda ahí, así que si eso es todo te contiene hacer un Serial1.flush() y borras lo que quede.

Voy a probar luego de hacer la prueba a la intemperie.
Pero probé lo siguiente:

#include <TinyGPS++.h>
TinyGPSPlus gps;

void setup() {
  Serial.begin(115200);
  Serial1.begin(9600);
}

void loop() {
  //while (Serial1.available()) {
    //if (gps.encode(Serial1.read())) {
      //String msg = Serial1.readStringUntil('\r');
      //Serial.print(msg);
      //Serial.print("LAT=");  Serial.println(gps.location.lat(), 6);
      //Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
      //.print("ALT=");  Serial.println(gps.altitude.meters());
      Serial.println(Serial1.read());
      // Delay between updates
      delay(2000);
    //}
 // }

}

Y sigue entregando los valores raros esos.

71
44
44
44
44
44
44
44
44
44
78
42
51
48
13
10
36
71
80
71
71
65
44
44
44
44

Insisto no tendría que empezar algo como:
$GPRMC,044235.000,A,4322.0289,N,00824.5210,W,0.39,65.46,020615,A*44

Digo por lo que vi en algunos tutoriales…

Ahora comprendo.

if (gps.encode(Serial1.read())) {

ya hace la tarea por ti, no tienes que volver a leer los datos nuevamente.

Mira los ejemplos disponibles en la librería y verás que ninguno vuelvo a leer el puerto serie.

En particular este ejemplo

reemplaza el smartdelay y el SoftwareSerial por tu Serial1.

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (Serial1.available())
      gps.encode(Serial1.read());
  } while (millis() - start < ms);