



GPS Pro
Dual-band L1/L5 GNSS, LTE Cat 1 bis and a motion sensor in an IP67 box — a battery tracker whose reporting logic you write in MicroPython.
| Qty | 1 pc | 10–99 | 100–499 | 500+ |
|---|---|---|---|---|
| Price | €100.00 | €95.00 | €90.00 | €80.00 |
+ €25 / device / year — findy IoT Platform, global LTE SIM, OTA updates, support.
No terminals and no external inputs on the R.2 board — the tracker senses position, motion and a magnet, and reports over LTE. Colour indicates type.
Most trackers take position from the cellular modem's built-in GNSS. GPS Pro carries a separate Quectel LC29H, which receives the L1 and the newer L5 signals at the same time and is fed from its own switched rail. No terminals, no external inputs — everything the tracker measures is inside the enclosure.
Top view · outline, holes, module and connector positions read from the R.2 PCB file; component blocks simplified. The accelerometer, the 3.3 V regulator and the GNSS power switch sit on the back. The GNSS patch antenna is drawn in the schematic but has no footprint on this PCB revision — H4 is its feed pad.
LC29HAAMD as fitted
GNSS receiver| Constellations | GPS · GLONASS · Galileo · BeiDou · QZSS | |
| Bands | L1 + L5, concurrent | |
| Interface | UART1 — TXD1 → IO17, RXD1 ← IO3 · API coming | |
| Supply | 3.3 V switched by IO13 (TPS22919 + ferrite bead) | |
| Antenna | Passive L1/L5 patch on pad H4 | |
| Not wired | 1PPS · I²C/SPI · UART2 · WAKEUP · RESET_N | |
Wake sources
All on RTC-domain pins| RTC | 32.768 kHz FC-135 crystal on IO15 / IO16 · wake-up period is parameter 421 (60–3600 s), aligned so a fleet reports in step | |
| Movement | 3-axis accelerometer on I²C (SDA IO21, SCL IO12) · INT1 IO4, INT2 IO5 · API coming | |
| Magnet | Reed switch on IO7 → 3.3 V through 100 Ω · hold a magnet to the closed enclosure | |
On the board
R.2| Cellular | Quectel EG916Q-GL · PWRKEY IO1, RESET IO2 · supply cut in deep sleep by IO47 · u.FL J5 | |
| eSIM | Soldered MFF2 chip — no holder, no tray · global findy SIM | |
| LEDs | Red LED on IO39 is yours · blue LED follows the modem's network status line | |
| Serial | J1: EN · TXD0 IO43 · RXD0 IO44 · IO0 — external USB-UART / findy debug cable | |
getBat() (AT+CBC) because the modem rail is the battery.Enclosure, battery, consumption and pricing as published on findyiot.com for GPS IP67 Pro; module, rail, pin and board figures read from the R.2 schematic and PCB.
GPS Pro is the first findy Lab board on an ESP32-S3. The framework's report cycle and parameter IDs carry over; every pin constant changes, and two peripherals have no driver yet.
| Function | Framework constant (ESP32 boards) | GPS Pro R.2 (ESP32-S3) | Status |
|---|---|---|---|
| Modem power rail | P_Power_GSM = 17 | IO47 → AP2302 → IRLML6402 | ⚠ new pin |
| Modem PWRKEY · RESET | P_PWRKey = 23 · none | IO1 · IO2, through a PUMH13 pair | ⚠ new pin · reset line added |
| Modem UART · DTR · RI | 36 / 21 / 5 · — | RX IO14 · TX IO42 · DTR IO38 · RI IO6, TXS0108E level shifter | ⚠ new pins |
| GNSS | eg915.getGPS() — modem receiver | LC29H on UART1: TX IO3, RX IO17, power IO13 | — no driver |
| I²C | Psda = 18, SCL 19 → external ADC | SDA IO21 · SCL IO12 → accelerometer | — no driver |
| Accelerometer INT | — | INT1 IO4 · INT2 IO5 | — no driver |
| Reed switch | Preed = 15, active low | IO7, active high | ⚠ pin and polarity |
| Buzzer · ADC · pulse inputs | IO27 · address 104 · IO4 | Not fitted | — not on this board |
| Serial / boot | — | J1: EN · TXD0 IO43 · RXD0 IO44 · IO0 | ✓ same header layout |
measure() and reported through custom parameter IDs — the shipped framework has no ESP32-S3 build, no LC29H driver and no system IDs for position yet.boot.py and firmware_core.mpy stay as shipped. You edit last.py: when the receiver is on, what counts as movement, what gets reported.
# Position from the LC29H on UART1 — pins as wired on the R.2 board.
import machine, time
gps_pwr = machine.Pin(13, machine.Pin.OUT) # TPS22919 → 3.3 V GNSS rail
gps = machine.UART(1, 115200, tx=3, rx=17) # LC29H RXD1 / TXD1
def measure(self):
gps_pwr.value(1)
t0 = time.time()
while time.time() - t0 < 90: # fix timeout, s
line = gps.readline()
if line and line.startswith(b'$GNRMC'):
f = line.split(b',')
if f[2] == b'A': # A = valid fix
core.db.write('900', str(nmea_deg(f[3], f[4]))) # latitude
core.db.write('901', str(nmea_deg(f[5], f[6]))) # longitude
break
gps_pwr.value(0) # receiver off again
fw.measure = measure# The accelerometer's INT1 sits on IO4, an RTC pin of the ESP32-S3.
# Arm it before sleeping; on wake, check why we woke and raise an alarm.
import machine, esp32
int1 = machine.Pin(4, machine.Pin.IN, machine.Pin.PULL_DOWN)
esp32.wake_on_ext1(pins=(int1,), level=esp32.WAKEUP_ANY_HIGH)
def start(self):
moved = machine.wake_reason() == machine.EXT1_WAKE
core.db.write('440', '1' if moved else '0') # alarm code
self.measure()
self.report(moved, datalist) # alarm=True on movement
self.prepareSleep(int(core.db.read('421')), True)
fw.start = start# Two custom parameters carry the position until the framework has system IDs for it.
databaseParams["900"] = ["W", 0, 0, 0, "0", "W"] # latitude
databaseParams["901"] = ["W", 0, 0, 0, "0", "W"] # longitude
# What this device reports: position, alarm code, signal, period, last report.
datalist = ['900', '901', '440', '231', '421', '443']
def start(self):
self.measure()
self.report(False, datalist)
self.prepareSleep(int(core.db.read('421')), True) # True = magnet wakes it
fw.start = start
Signal, period, alarm code and last report are system parameters the framework fills in. Position arrives on the IDs you define — the platform draws the card from your definition.
GNSS L1/L5 · motion · magnet
LC29H receiver, accelerometer, reed switch
GPS Pro
Your measure() runs here — MicroPython on ESP32-S3
LTE Cat 1 bis / 2G
Global findy SIM, embedded
findy IoT Platform
Measurements, settings, commands — by parameter ID
Your system
API, webhooks, export
Trailers, containers, machines that sit outside for years — anything that has to be found and should tell you when it starts moving.
Ready-made solutions
Asset, cargo and heavy-equipment tracking built on findy trackers — delivered with platform, SIM and support.
View solutionsHave your own system?
We supply the tracker and the SIM. You take positions and alarms from the platform API into the system you already run.
Talk to our team →Write your own logic
You're here. Decide when the receiver wakes, what counts as movement, what a report contains — and ship the next version over the air.
Can't do it? Enterprise team →