Investigations

LoRa Communication System

Go February 2026

End-to-end LoRa system: bare-metal STM32 firmware, Go backend, TypeScript dashboard, Android range-test app, and a custom PCB.

This is probably my most ambitious investigation — a full end-to-end LoRa communication system spanning five different technology stacks. It started when I got hold of a pair of DX-LR30 boards (STM32F103 + SX1262 LoRa transceiver + USB serial) and wanted to see what I could build with them.

The firmware layer is bare-metal C99 on the STM32F103, turning the boards into transparent UART-to-LoRa serial bridges. No RTOS, no HAL bloat — just register-level access to the SX1262.

The Go backend (1.24) acts as the hub: it reads from the USB serial port, stores everything in SQLite, exposes a GraphQL API, and pushes real-time updates over WebSocket. The TypeScript frontend (Vite) renders a hardware info dashboard showing signal strength, packet stats, and device status.

Then there's the Android range-test app written in Java. You connect a LoRa board to your phone via USB OTG, walk around, and it maps signal strength against GPS coordinates. The results feed back to the Go server for visualization.

The cherry on top is a custom PCB designed in KiCad — a dog tracker combining an ESP32, SX1262 LoRa module, and GPS receiver. It's the logical next step: take everything I learned and put it on a purpose-built board.

What this project demonstrates

Bare-metal STM32 firmware in C99 — no RTOS, no HAL
Go 1.24 backend with GraphQL, SQLite, and WebSocket
TypeScript dashboard for real-time hardware monitoring
Android range-test app with GPS signal mapping
Custom KiCad PCB design: ESP32 + SX1262 + GPS dog tracker
Full stack from register-level firmware to web UI

Technologies

LoRaSTM32EmbeddedGraphQLAndroidKiCad

© 2026 Jonathan Leahy · v0.8.1-31-g196fa14