Written by

in

MicroPython · ESP32-S3TrackerIP67

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.

GNSS L1 + L5Quectel LC29H · UARTAPI coming
LTE Cat 1 bisEG916Q-GL · + 2G fallback
eSIMMFF2 chip, no holder
Motion sensor3-axis · I²C · 2 interruptsAPI coming
Magnet wake-upreed switch, IO7
RTC32.768 kHz crystal
Wi-Fi / BLE 5ESP32-S3 · module u.FLAPI coming
LEDsred (yours) · blue (network)
Qty1 pc10–99100–499500+
Price€100.00€95.00€90.00€80.00

+ €25 / device / year — findy IoT Platform, global LTE SIM, OTA updates, support.

Everything is inside the box

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.

GNSS L1 + L5 API coming
Quectel LC29H on UART1 · own switched 3.3 V rail (IO13) · passive patch antenna
Motion sensor API coming
3-axis accelerometer · I²C · INT1 / INT2 wake the chip from deep sleep
Reed / magnet switch
IO7, active high · wake-up through the enclosure
RTC
32.768 kHz crystal · scheduled wake-ups, parameter 421
Wi-Fi / Bluetooth 5 API coming
On the ESP32-S3 module · external antenna connector
ESP32-S3-WROOM-1U-N16R8 · Xtensa LX7 dual-core
16 MB flash · 8 MB PSRAM · 512 KB SRAM
MicroPython (ESP32-S3)
Quectel EG916Q-GL · Cat 1 bis · 2G
Quectel LC29H · GNSS L1 + L5
RTC 32.768 kHz · OTA
LTE Cat 1 bis / 2G
Quectel EG916Q-GL · u.FL (J5) · PWRKEY and RESET lines · supply cut in deep sleep
Embedded SIM
MFF2 chip soldered to the board · global findy SIM
GNSS rail
3.3 V switched by IO13 · quick discharge for a real reset
Status LEDs
Red LED on IO39 · blue LED on the modem network line
Battery 2× MR18650-26H
3.6 V · 5.2 Ah · JST XH
Inputs
Outputs
Communication
Power
API coming hardware fitted, no findy Lab API yet
A receiver that listens on two bands

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.

ESP32-S3 WROOM-1U · 16 MB / 8 MB accelerometer on the back EG916Q-GL LTE Cat 1 bis · 2G LC29H GNSS L1 + L5 H4 · GNSS antenna pad eSIM BATT · JST XH J1 · ESP32 serial J5 LTE reed · IO7 32 kHz red LED · IO39 blue · NET 66.0 mm incl. wings · body 57.0 mm 44.8 mm

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
ConstellationsGPS · GLONASS · Galileo · BeiDou · QZSS
BandsL1 + L5, concurrent
InterfaceUART1 — TXD1 → IO17, RXD1 ← IO3 · API coming
Supply3.3 V switched by IO13 (TPS22919 + ferrite bead)
AntennaPassive L1/L5 patch on pad H4
Not wired1PPS · I²C/SPI · UART2 · WAKEUP · RESET_N

Wake sources

All on RTC-domain pins
RTC32.768 kHz FC-135 crystal on IO15 / IO16 · wake-up period is parameter 421 (60–3600 s), aligned so a fleet reports in step
Movement3-axis accelerometer on I²C (SDA IO21, SCL IO12) · INT1 IO4, INT2 IO5 · API coming
MagnetReed switch on IO7 → 3.3 V through 100 Ω · hold a magnet to the closed enclosure

On the board

R.2
CellularQuectel EG916Q-GL · PWRKEY IO1, RESET IO2 · supply cut in deep sleep by IO47 · u.FL J5
eSIMSoldered MFF2 chip — no holder, no tray · global findy SIM
LEDsRed LED on IO39 is yours · blue LED follows the modem's network status line
SerialJ1: EN · TXD0 IO43 · RXD0 IO44 · IO0 — external USB-UART / findy debug cable
Own power switchThe receiver's 3.3 V comes through a TPS22919 load switch on IO13. Your code decides when the receiver is on — for a fix, then off.
Backup pin on the switched railV_BCKP shares the switched 3.3 V, so a receiver that is powered off forgets ephemeris. Keep the rail on between fixes or accept a cold start.
Battery voltage via the modemThere is no divider on the board; the pack voltage is read with getBat() (AT+CBC) because the modem rail is the battery.
No terminalsThe enclosure stays closed: RTC, movement and magnet wake the chip; position and signal go out over LTE.
Full technical specs

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.

Physical
Dimensions118 × 82 × 55 mm
Weight290 gWith battery
IP ratingIP67UV-protected enclosure
Temperature−20 °C to +40 °C
External terminalsNone
PCB4 layers · 66.0 × 44.8 mm4 × Ø3.2 mm holes on 50 × 38 mm
Connectivity
RadioLTE Cat 1 bis + 2G
ModemQuectel EG916Q-GL
SIMEmbedded MFF2 chipGlobal findy SIM
LTE antennau.FL (J5)
GNSSLC29H · L1 + L5GPS, GLONASS, Galileo, BeiDou, QZSS
GNSS antennaPassive patch, on-board pad
Wi-Fi / Bluetooth802.11 b/g/n · BLE 5External antenna on module u.FL · no findy Lab API yet
DiagnosticsRSSI, RSRQ, SINR, cell IDIDs 230–238
Power
Battery2× Li-Ion MR18650-26H · 3.6 V · 5.2 Ah
Battery connectorJST XH 2-pin
Battery lifeUp to 10 years @ 1 report / 24 hUp to 18 000 reports
Work current120 mA~30 s per report
Deep-sleep current10 µA
Battery voltageVia modem (AT+CBC)
GNSS rail3.3 V switchedTPS22919 + ferrite bead
Processor & sensors
MCUESP32-S3-WROOM-1U-N16R8Xtensa LX7, dual core
Memory16 MB flash · 8 MB PSRAM512 KB SRAM
RuntimeMicroPythonESP32-S3
Motion sensor3-axis accelerometerSC7A20 / BMA400 · I²C · 2 interrupts
Wake sourcesRTC · motion · magnet
RTC crystal32.768 kHz FC-135
IndicationRed LED (IO39) · blue LED (network)
Wake-up period60 / 300 / 900 / 1800 / 3600 sParameter 421
OTA updateZIP, CRC32, fail-safe
ProgrammingJ1 serial headerExternal USB-UART / findy debug cable
Same framework, new chip, new pin map

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.

FunctionFramework constant (ESP32 boards)GPS Pro R.2 (ESP32-S3)Status
Modem power railP_Power_GSM = 17IO47 → AP2302 → IRLML6402⚠ new pin
Modem PWRKEY · RESETP_PWRKey = 23 · noneIO1 · IO2, through a PUMH13 pair⚠ new pin · reset line added
Modem UART · DTR · RI36 / 21 / 5 · —RX IO14 · TX IO42 · DTR IO38 · RI IO6, TXS0108E level shifter⚠ new pins
GNSSeg915.getGPS() — modem receiverLC29H on UART1: TX IO3, RX IO17, power IO13— no driver
I²CPsda = 18, SCL 19 → external ADCSDA IO21 · SCL IO12 → accelerometer— no driver
Accelerometer INT—INT1 IO4 · INT2 IO5— no driver
Reed switchPreed = 15, active lowIO7, active high⚠ pin and polarity
Buzzer · ADC · pulse inputsIO27 · address 104 · IO4Not fitted— not on this board
Serial / boot—J1: EN · TXD0 IO43 · RXD0 IO44 · IO0✓ same header layout
What this means for your code. Period, report and OTA parameters (421, 422, 55 → 52) and the network diagnostics 230–238 work as on every findy Lab device. Position and motion are read in your own 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.
One file is yours

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.

last.py — GPS Pro
GNSS fixWake on movementReport & sleep
# 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
Pins are from the R.2 schematic. Position uses custom parameters 900/901 until the framework ships an LC29H driver and system IDs for position.Full API reference →
What you see in the findy IoT Platform

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.

GPS Pro · Trailer 14 · #0311
Last report: 4 min ago
MeasurementsSettingsCommandsSystem
Latitude · ID 900
42.6977
° N · L1+L5 fix
Longitude · ID 901
23.3219
° E
Alarm code · ID 440
1
movement detected
LTE RSSI · ID 231
−74
dBm · Cat 1 bis
Wake-up period · ID 421
3600
s · 1 h
Last report · ID 443
09:14
server-synced timestamp
From sensor to your system

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

Where GPS Pro fits

Trailers, containers, machines that sit outside for years — anything that has to be found and should tell you when it starts moving.

Beginner
Hourly position report with L1/L5 GNSS
GNSSUART
Beginner
Wake on movement, report, back to sleep
MotionINT1
Intermediate
Geofence alarm computed on the device
GNSSAlarm 440
Intermediate
Magnet-triggered field report
ReedWake-up
Advanced
Wi-Fi scan for indoor position
Wi-FiESP32-S3
Advanced
Ten-year budget: cold vs warm GNSS start
PowerV_BCKP
Three ways to use GPS Pro

Ready-made solutions

Asset, cargo and heavy-equipment tracking built on findy trackers — delivered with platform, SIM and support.

View solutions

Have 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 →

More posts