On 25 October 2026, around 12:20 local time, we launched SERVET XII from Lumpiaque (Zaragoza, Spain). It climbed for 83 minutes up to 33,933 m and landed a little over 2 hours after launch. Meanwhile, one of its capsules put LoRa radio image transmission with SSDV to the test, besides sending its position and altitude. Everything could be followed live, from any phone, on a public Telegram channel.
This post describes one of the Servet XII capsules (the one with the LoRa radio transmitter), how the receivers work, how the flight went, what results we got from the radio link and what we learned.
1. The idea
The main idea was to test image transmission over LoRa radio with SSDV from the stratosphere: how many photos get through, at what distance and with what link quality, using the SF9 setting (125 kHz, 17 dBm). One of the capsules carried a LoRa transmitter with a GPS; on the ground, two receivers listened and published what they received on the Internet, so that anyone could watch it live.
Telegram channel: Servet HAB (https://t.me/sondaservet).
2. One of the Servet XII capsules: the transmitter
| Part | Details |
|---|---|
| Board | LilyGO T-Beam V1.2: ESP32 microcontroller, u-blox GPS module, LoRa SX1276 radio, AXP2101 power management |
| Power | One 18650 battery (4.10 V at the start, 3.85 V, 73%, when tracking ended) |
| GPS | u-blox in “Airborne” mode (<1 g), the mode that keeps working above ~12 km. Ceramic patch antenna, connected with a u.FL cable |
| Radio | 869.525 MHz (the European 868 MHz licence-exempt band), LoRa SF9, 125 kHz, 17 dBm (50 mW). Vertical antenna hanging below this capsule |
| Camera | None on board. The images were 8 test photos stored in the microcontroller’s memory and sent in a loop |
| Mounting | The suspension cord runs through this capsule from top to bottom; the radio antenna hangs below it and the GPS antenna sits on top, facing the sky |
What it transmits, and how often
- Telemetry every ~30 s (38 bytes): position, altitude, vertical and horizontal speed, heading, satellites, battery, power-manager temperature, UTC time and image counters.
- Images as SSDV packets (255 bytes each), one every ~13 s. A 256×192-pixel photo takes 21 to 37 packets, that is, 5-8 minutes per photo.
- That pace is not arbitrary: in the 869.4-869.65 MHz band you can transmit at most 10% of the time, and SF9 takes ~1.3 s per large packet.
Every photo carries an overlay: name, altitude, date, UTC time and coordinates. That way each pass of the same image is different, and any screenshot tells you when and where it was received.

3. The receivers
- Board: LilyGO T3-S3 (ESP32-S3, SX1262 radio and OLED display).
- What they do: they listen, rebuild the SSDV images packet by packet and upload everything to Telegram through a bot.
- Two receivers during the flight:
- Rx #1 (🏠 home): on a balcony, on the home WiFi.
- Rx #2 (🚗 car): in the car, using the phone’s hotspot.
- What each one publishes: a message at start-up, a status message that is edited every minute (whether it sees the balloon, signal, packets), a new message with every telemetry packet (one value per line, with a map link), the live position and every photo that gets completed, or a partial one if packets are missing.
- OLED display: five pages (flight, position, link, image and battery) that cycle automatically.
- Each receiver has its own icon so they can be told apart at a glance in the channel.
4. How the flight went
The launch was prepared in the Lumpiaque sports hall, with participants checking their capsules and experiments until the last moment.




Photos: Alejandro Suarez and Adolfo Amella.
And the lift-off, on video:
Times are UTC; local time was UTC+1.
| Time (UTC) | What happened |
|---|---|
| ~11:20:50 | Launch (estimated: the signal at the car receiver drops suddenly and the board starts to cool down) |
| 11:32 | First GPS fix, at 4,722 m |
| 11:32-12:43 | Steady climb at 6.3-6.8 m/s. Strong wind between 8 and 10 km, up to 131 km/h. At 10 km, on the way down, the sensor read -22 °C |
| 12:43:56 | Official maximum altitude: 33,933 m, about 53 km from the home receiver. The balloon burst at that altitude (the last thing our transmitter received before the burst was 33,902 m) |
| 12:45-13:05 | Fast descent, with peaks of -34.6 m/s at about 25 km, slowing down as it reached denser air |
| 13:05:22 | Last data received: 8,610 m altitude, 72.5 km from the receiver, with an RSSI of -114 dBm |
| 13:27 (14:27 local) | Landing in Chiprana (Zaragoza province, Bajo Aragón-Caspe county), at 41.22827 N, 0.18506 W: about 21 km beyond the last position received |
Tracking figures:
- Telemetry reached Telegram throughout the flight, with 3 to 12 GPS satellites and good HDOP even at 34 km. The Airborne mode worked.
- Distance flown: about 97 km from Lumpiaque to the last position received (83 km in a straight line), and about 119 km including the final stretch to the landing site.
- Link quality: RSSI between -104 and -122 dBm and SNR down to -13 dB, right at the limit of what SF9 can decode (-12.5 dB). Even so, telemetry got through almost every time.
- Losses: during the ascent about 7% of the image packets were lost. Near the maximum altitude, with the weakest signal, it rose to a third.
- Images: 15 different images in flight, 24 uploaded to the channel. Three arrived complete (17, 19 and 21) and the rest partial; some with 90% of the packets (image 22: 34 of 37). In total the channel stored 389 images, counting earlier tests.
- The car receiver (Rx #2) powered off at 11:29 UTC (it did not stop receiving data), so the home receiver covered almost the whole flight.
- Landing: in the municipality of Chiprana (Zaragoza), about 103 km in a straight line from Lumpiaque, and about 21 km after the last data received. No receiver saw the last kilometres of the descent.
This is what the equipment looked like at the landing site, near Chiprana:


Photos: Alejandro Suarez and Adolfo Amella.
Interactive flight map
Flight path, every telemetry point (coloured by signal quality) and the photos placed where they were received, with the average signal quality for each one. Click a point or a photo for details. Dashed points are approximate positions (interpolated, or estimated before the first GPS fix). Use the full-screen button to enlarge it, or open the map in a new tab.
3D view, with altitude to real scale: the vertical curtain links the flight path to the ground, and you can play the flight back with the button at the top right. Open the 3D map in a new tab.
5. Results and what we learned
What we measured on the LoRa link (SF9, 17 dBm) – Range: up to 72 km from the receiver with the balloon at 8.6 km altitude (last data received, RSSI of -114 dBm). With the balloon at its ceiling, at 34 km altitude and about 53 km from the home receiver, telemetry kept coming in with an RSSI of -120 to -122 dBm. – Link quality: RSSI between -104 and -122 dBm and SNR down to -13 dB, at the limit of what SF9 can decode (-12.5 dB). Near the ceiling only a few dB of margin were left. – Losses: during the ascent about 7% of the image packets were lost; near the ceiling, with the weakest signal, a third. – Images: 15 different images and 24 uploads to the channel. Three arrived complete and several had more than 90% of the packets (image 22: 34 of 37; image 26: 34 of 35). With SF9 and the 10% airtime limit, a 256×192-pixel photo takes 5 to 8 minutes. – Telemetry: it got through almost every time, even at the edge of the link, because its packets are much shorter (38 bytes versus 255) and tolerate weak signals better. – A worst case: the home receiver was on a balcony between buildings and the car receiver powered off early. We suspect that with an antenna in a clear spot the margin would have been larger.
Conclusion: SF9 at 17 dBm is enough to follow the balloon’s telemetry beyond 50 km and to receive photos, although with losses when the signal approaches the limit. To receive complete photos at the very top, more margin is needed.
Also worked well: the GPS Airborne mode (3 to 12 satellites even at 34 km), telemetry every 30 s, the automatic upload to Telegram and using two receivers at once.
What gave us trouble (and how we fixed it) 1. Very slow Telegram uploads (10-23 s per request). It was the ESP32’s WiFi power saving. Turning it off (WiFi.setSleep(false)) brought it down to ~1 s. 2. No GPS fix during a test walk. It was a bad contact in the u.FL connector of the ceramic antenna. Reseating it, securing the cable and placing the ceramic face up fixed it. 3. Stale position: the transmitter repeated the last position when it lost the fix, because the GPS library treats a position as valid forever. The age of the data is now checked. 4. SNR is misleading with a strong signal: it stays at ~11 dB at both -10 and -60 dBm. The real margin has to be read from the RSSI. 5. Street-level range is short (about 340 m, with the receiver on a balcony between houses), but in the air, with line of sight, it is a different story.
Next time – More link margin: SF10 (+2.5 dB, photos take twice as long), antennas on the car roof, and a transmitter antenna that works better with the balloon almost overhead, where our vertical antennas have less gain. – A real camera (ESP32-S3-CAM) with the same overlay system. – More receivers spread along the route, some with a different connection (mobile coverage runs out too).
6. Technical details for the curious
- Software: PlatformIO with Arduino-ESP32; SSDV by fsphil (quality 4); JPEG encoded on the ESP32 itself with
stb_image_writeand decoded with JPEGDEC; a separate task uploads to the Telegram API over HTTPS. - Link: LoRa 869.525 MHz, SF9, BW 125 kHz, CR 4/5, 17 dBm (≈ 80 mW EIRP with a 2 dBi antenna, below the band’s 500 mW limit).
- Flight data: 4,564 messages in the channel, 3,476 of them telemetry, and 389 images.
Want to follow the next flights? Telegram channel: Servet HAB.
