An SMA connector on the edge takes an external antenna, which does most of the work. GPS signals are faint and line-of-sight, so walls and roofs block them, meaning indoors you'll get a slow, drifting fix or none at all.
Technical Details
Pinout

Arduino Example Snippet
#include <HardwareSerial.h>
#include <TinyGPSPlus.h>
HardwareSerial GPS(1);
TinyGPSPlus gps;
volatile bool ppsFired = false;
void IRAM_ATTR onPPS() {
ppsFired = true;
}
void setup() {
Serial.begin(115200);
GPS.begin(9600, SERIAL_8N1, P1_IO1, P1_IO2);
pinMode(P1_IO0, INPUT);
attachInterrupt(digitalPinToInterrupt(P1_IO0), onPPS, RISING);
Serial.println("GNSS receiver started — waiting for fix...");
}
void loop() {
while (GPS.available()) {
gps.encode(GPS.read());
}
if (ppsFired) {
ppsFired = false;
if (gps.location.isValid()) {
Serial.print("PPS | Lat: ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Lon: ");
Serial.print(gps.location.lng(), 6);
Serial.print(" Alt: ");
Serial.print(gps.altitude.meters(), 1);
Serial.print("m Sats: ");
Serial.print(gps.satellites.value());
Serial.print(" UTC: ");
if (gps.time.isValid()) {
char t[9];
snprintf(t, sizeof(t), "%02d:%02d:%02d",
gps.time.hour(), gps.time.minute(), gps.time.second());
Serial.print(t);
} else {
Serial.print("--:--:--");
}
Serial.println();
} else {
Serial.print("PPS | No fix yet — satellites seen: ");
Serial.println(gps.satellites.isValid() ? gps.satellites.value() : 0);
}
}
}


