Skip to the content
4 layers56.6 × 69.4 mmVariometerV2, the printed circuit board in 3D

Paragliding variometer: custom KiCad PCBs, ESP32 firmware, sensor fusion, e-ink UI, and desktop flight replay.

Size
56.6 × 69.4 mm
Copper layers
4
Thickness
1.6 mm
Parts
117
Nets
105
Pads
381
Tracks, vias
891, 181
Pours
6
Routed
Yes
KiCad
KiCad 6 (file 20211014)
Created
1 Nov 2021
Updated
19 Oct 2026

Overview

VariometerV2 is an open-source printed circuit board by oiver12, from the oiver12/VariometerV2 repository on GitHub, published under the MIT licence. It is a 4-layer board of 56.6 × 69.4 mm with 117 parts on 105 nets, routed with 891 tracks and 181 vias.

It is built around the ATGM336H-5N31, ESP32-S3-WROOM-1-N8 and MS5611-01BA03, with the SRV05-4, BMI088 and DW01A-G among its other parts. Its parts include 40 resistors, 20 capacitors, 10 ICs, 10 transistors and 9 connectors. It belongs with the sensors and measurement and lEDs and displays boards and the ESP32 boards of this library.

Main components

11

README

README.md

VariometerV2

A paragliding variometer built from custom KiCad PCBs, ESP32 firmware, sensor fusion, and an e-ink flight interface.

Variometer mounted on the harness during a paragliding flight

Flight-tested on my paragliding harness. Watch the flight video.

I started this project in 2021 as my Maturarbeit (Swiss high-school thesis), then continued developing it independently through 2024. I designed the custom PCBs and developed the firmware, sensor fusion pipeline, and e-ink rendering system, screens, and widgets. The enclosure/CAD work combines contributions from my brother and me.

Features

  • Three custom PCB revisions designed in KiCad.
  • ESP32 firmware in C on ESP-IDF and FreeRTOS.
  • BMI088 IMU, DPS310 barometer, and QMC5883L magnetometer; quaternion orientation estimation and a Kalman filter combining barometric altitude with acceleration.
  • GPS/NMEA input, IGC flight logging, airspace parsing, sound output, an experimental BLE module, and watchdog support.
  • E-ink UI with a custom rendering system, screens, and widgets.
  • Sensor mocks, a FreeRTOS host simulation, a Linux screen simulator, and recorded-sensor replay for analysis.

Hardware

Latest revision: 2.1

Front / topBack / mirrored bottom
Latest PCB, topLatest PCB, mirrored bottom

Latest PCB, angled KiCad 3D render

Schematic overview · Power · Sensors · Display · Peripherals

Revision history

Case/ contains the enclosure designs and printing exports.

Firmware architecture

mermaid
flowchart LR
    IMU["BMI088 IMU"] --> Drivers["Sensor drivers"]
    Baro["DPS310 barometer"] --> Drivers
    Mag["QMC5883L magnetometer"] --> Drivers
    Drivers --> Orientation["Quaternion orientation"]
    Orientation --> Acc["Vertical acceleration"]
    Drivers --> Kalman["Kalman altitude and climb rate"]
    Acc --> Kalman
    GPS["GPS / NMEA"] --> State["Flight state / device context"]
    Kalman --> State
    Airspace["Airspace parser"] --> State
    State --> UI["E-ink UI / screens / widgets"]
    State --> IGC["IGC logger"]
    State --> BLE["BLE module (experimental)"]
    State --> Sound["Sound"]

The sensor fusion pipeline runs across FreeRTOS tasks: the barometer task notifies the Kalman filter, while the acceleration task updates orientation and queues vertical acceleration. The filter combines these inputs into shared flight state, using queues, task notifications, and mutexes to coordinate the tasks.

Rendering and e-ink refresh run in separate tasks. GPS parsing, IGC logging, button input, battery management, sound, storage checks, and airspace parsing have their own task entry points.

Project structure

DirectoryPurpose
Hardware/, Case/PCB revisions and enclosure designs
Software/variometer-software/ESP32 firmware
Simulation/Main/FreeRTOS host runner and sensor mocks
Screen_Simulator_Linux/, Screen_Simulator/Desktop UI simulators
VariometerAnalysis/Sensor-log analysis and offline replay

Simulation & replay

Sensor mocks replace hardware reads with recorded IMU, magnetometer, and pressure samples. A FreeRTOS simulation replays these recordings on a PC, allowing the firmware to run against recorded data.

The offline analysis tool runs the firmware’s quaternion and Kalman functions over the recorded sensor data:

Raw barometric data compared with an offline Kalman estimate

Barometric altitude and climb rate compared with the Kalman estimate. The recording has no timestamps, so replay uses an assumed sample interval; this plot is not a latency benchmark.

The Linux screen simulator exercises the custom UI independently of the device:

Flight layoutNavigation layoutSettings
Flight UINavigation UISettings UI

Replay and simulator instructions.

Build & flash

ESP32-S3 · ESP-IDF v5.1.4

See the developer guide for cloning, firmware build and flash commands, desktop simulation, and regenerating the visuals.

Flight footage

Short preview of the variometer during flight

Third-party code & license

The project builds on FreeRTOS, Waveshare’s e-ink driver and GUI, STMicroelectronics bitmap fonts, Neil Kolban’s BLE library, Freescale/NXPMotionSense sensor fusion, kalman-clib, and other credited libraries. Full credits and license details are in THIRD_PARTY_NOTICES.txt.

My original software is licensed under MIT. Third-party code retains its own licenses, including the FIFO’s GPL-3.0-or-later obligations; the combined tree is not uniformly MIT-licensed. Enclosure/CAD contributions and third-party assets are outside this software license unless separately stated.

Parts

117
QtyValueFootprintReferences
1410kResistor_SMD:R_0402_1005MetricR14, R16, R24, R26, R27, R28, R29, R30, R31, R32, R33, R34, R36, R37
10100nFCapacitor_SMD:C_0402_1005MetricC1, C2, C5, C7, C10, C13, C18, C19, C20, C21
610uFCapacitor_SMD:C_0603_1608MetricC3, C6, C8, C9, C12, C15
6AO3400APackage_TO_SOT_SMD:SOT-23Q1, Q2, Q4, Q6, Q8, Q10
522Resistor_SMD:R_0402_1005MetricR20, R21, R22, R23, R35
41kResistor_SMD:R_0603_1608MetricR2, R4, R5, R25
4AO3401APackage_TO_SOT_SMD:SOT-23Q3, Q5, Q7, Q9
4MountingHole_PadMountingHole:MountingHole_2.2mm_M2_DIN965_PadH1, H2, H3, H4
3B5819W SLDiode_SMD:D_SOD-123D1, D2, D3
3SRV05-4Package_TO_SOT_SMD:SOT-23-6U2, U5, U6
20kResistor_SMD:R_0805_2012MetricR39, R40
21.5kResistor_SMD:R_0603_1608MetricR12, R17
2100kResistor_SMD:R_0603_1608MetricR7, R9
210kResistor_SMD:R_0603_1608MetricR6, R18
21MResistor_SMD:R_0402_1005MetricR13, R38
21uFCapacitor_SMD:C_0402_1005MetricC4, C11
22.2uFCapacitor_SMD:C_0402_1005MetricC16, C17
2SW_PushConnector_Wire:SolderWire-0.25sqmm_1x02_P4.2mm_D0.65mm_OD1.7mmSW1, SW4
2Switch_SW_PushButton_Switch_THT:SW_PUSH_6mmSW2, SW3
11.2kResistor_SMD:R_0603_1608MetricR1
1100Resistor_SMD:R_0603_1608MetricR3
11AFuse:Fuse_0603_1608MetricF1
127kResistor_SMD:R_0603_1608MetricR11
13.3V TPTestPoint:TestPoint_Pad_D1.5mmTP1
1300kResistor_SMD:R_0603_1608MetricR8
133kResistor_SMD:R_0402_1005MetricR15
14.7kResistor_SMD:R_0402_1005MetricR19
147nHInductor_SMD:L_0603_1608MetricL1
15-1814832-2Hardware:518148322J7
151kResistor_SMD:R_0603_1608MetricR10
1600 @ 100 MHzInductor_SMD:L_0603_1608MetricFB1
1ATGM336H-5N31Hardware:ATGM336H5N31U4
1BLUELED_SMD:LED_0603_1608MetricD5
1BMI088Hardware:BMI088U7
1Conn_01x02_MaleConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ4
1Conn_02x01Connector_PinHeader_2.00mm:PinHeader_2x01_P2.00mm_VerticalJ8
1DW01A-GHardware:SOT95P280X135-6NIC2
1ESP32-S3-WROOM-1Hardware:ESP32S3WROOM1IC3
1Jumper_2_OpenTestPoint:TestPoint_2Pads_Pitch2.54mm_Drill0.8mmJP1
1LED_CHRGConnector_PinHeader_2.00mm:PinHeader_2x01_P2.00mm_VerticalJ1
1LED_STBYConnector_PinHeader_2.00mm:PinHeader_2x01_P2.00mm_VerticalJ2
1MS5611-01BAPackage_LGA:LGA-8_3x5mm_P1.25mmU8
1REDLED_SMD:LED_0603_1608MetricD4
1SWDConnector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_VerticalJ5
1TFP09-2-12BHardware:TFP09212BJ9
1TFT_LCD_CONNECTORConnector_PinHeader_2.54mm:PinHeader_1x09_P2.54mm_VerticalJ3
1TP4056Hardware:SOIC127P600X175-9NIC1
1TPS76801QDRHardware:SOIC127P600X175-8NU1
1TP_3.3V_SD-CardTestPoint:TestPoint_Pad_D1.0mmTP2
1TP_BATTERYTestPoint:TestPoint_Pad_D1.0mmTP5
1TP_PresSens_CSTestPoint:TestPoint_Pad_D1.0mmTP11
1TP_RXTestPoint:TestPoint_Pad_D1.0mmTP7
1TP_SPI1_MISOTestPoint:TestPoint_Pad_D1.0mmTP10
1TP_SPI1_MOSITestPoint:TestPoint_Pad_D1.0mmTP9
1TP_SPI1_SCKTestPoint:TestPoint_Pad_D1.0mmTP8
1TP_TXTestPoint:TestPoint_Pad_D1.0mmTP6
1TP_USB_D+TestPoint:TestPoint_Pad_D1.0mmTP3
1TP_USB_D-TestPoint:TestPoint_Pad_D1.0mmTP4
1USB3135-30-AHardware:USB313530AJ6

More from oiver12/VariometerV2

4
  • 4 layers94.7 × 69.1 mmVariometerV2.2.1, the printed circuit board in 3D

    VariometerV2.2.1

    oiver12/VariometerV2

    Paragliding variometer: custom KiCad PCBs, ESP32 firmware, sensor fusion, e-ink UI, and desktop flight replay.

    158 partsMIT
  • 4 layers96.1 × 65.8 mmVariometerV2.2, the printed circuit board in 3D

    VariometerV2.2

    oiver12/VariometerV2

    Paragliding variometer: custom KiCad PCBs, ESP32 firmware, sensor fusion, e-ink UI, and desktop flight replay.

    129 partsMIT
  • 4 layers45 × 31 mmL96-M33 Breakout, the printed circuit board in 3D

    L96-M33 Breakout

    oiver12/VariometerV2

    Paragliding variometer: custom KiCad PCBs, ESP32 firmware, sensor fusion, e-ink UI, and desktop flight replay.

    18 partsMIT
  • 4 layers30.5 × 27.9 mmMAX M10S Breakout, the printed circuit board in 3D

    MAX M10S Breakout

    oiver12/VariometerV2

    Paragliding variometer: custom KiCad PCBs, ESP32 firmware, sensor fusion, e-ink UI, and desktop flight replay.

    16 partsMIT

Similar boards

  • 2 layers95 × 60 mmCallsystem, the printed circuit board in 3D

    Callsystem

    thomas1299/Wireless-call-system

    Die Alarmauslösung auf beiden Geräten erfolgt innerhalb von 500 ms ab dem Berühren des Sensors durch die Lippen und die Reichweite der Funkverbindung beträgt mindestens 100 m im Freien.

    59 partsGPL-3.0
  • 2 layers60 × 150 mmPhone, the printed circuit board in 3D

    Phone

    TheEinfachFelix/CampPhone

    Warum habe ich mich dagegen entschieden, das Sim Modul selber zu implementieren? Ich habe kein Chip gefunden, der günstiger als das fertige Modul war, und ein Datenblatt in Englischer Sprache hat.

    137 parts
  • 2 layers70 × 90 mmNeuralRobot, the printed circuit board in 3D

    NeuralRobot

    viktorvano/NeuroBot

    Robot With Deep Neural Network

    74 parts9MIT
  • 2 layers131 × 100 mmPanel, the printed circuit board in 3D

    Panel

    RamRamAndroid/ESP32Drone-CodeMatrix

    ESP32 Drone by CodeMatrix is a compact, WiFi-controlled drone based on the ESP32-S3 microcontroller. Designed for hobbyists, makers, and engineers, ESP32 Drone by CodeMatrix offers a simple yet powerful platform for…

    182 parts1
  • 2 layers97.8 × 73.7 mmClock test breakout, the printed circuit board in 3D

    Clock test breakout

    Iver-Iscariot/TideWatchEink

    E-ink display version of my tidal water wrist watch

    228 parts
  • 4 layers102 × 34 mmNetscore, the printed circuit board in 3D

    Netscore

    arcticlula/Netscore

    Device that keeps track of a volleyball's game score (points and sets). Ideally it should be mounted on the net, since it has a display on the front and back and buttons on the sides.

    150 partsMIT
  • 4 layers63.6 × 86 mmBECom, the printed circuit board in 3D

    BECom

    rjsc/BECom

    BECom - Battery Emulator Companion - Open Source Hardware, designed to run dalathegreat/Battery-Emulator

    276 parts2GPL-3.0
  • 2 layers96 × 50 mmPager, the printed circuit board in 3D

    Pager

    justinlindh/bramble

    Privacy-first LoRa mesh networking for ESP32-S3, built with ESP-IDF

    97 parts2MIT

Questions

How big is the VariometerV2 PCB?

It measures 56.6 × 69.4 mm and has 4 copper layers, 1.6 mm thick.

What parts does the VariometerV2 use?

117 parts, built around the ATGM336H-5N31, ESP32-S3-WROOM-1-N8, MS5611-01BA03 and SRV05-4. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the VariometerV2 KiCad files?

From the oiver12/VariometerV2 repository on GitHub, at the commit this page was made from: the board is Hardware/Version 1.0/VariometerV2.kicad_pcb and its schematic Hardware/GPS_Test/L96-M33_Breakout/L96-M33_Breakout.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the VariometerV2 design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).