Skip to the content
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.

Size
94.7 × 69.1 mm
Copper layers
4
Thickness
1.6 mm
Parts
158
Nets
133
Pads
530
Tracks, vias
1,307, 324
Pours
22
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
1 Nov 2021
Updated
19 Oct 2026

Overview

VariometerV2.2.1 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 94.7 × 69.1 mm with 158 parts on 133 nets, routed with 1,307 tracks and 324 vias.

It is built around the ESP32-S3-WROOM-1-N8, DPS310 and QMC5883L, with the SRV05-4, BMI088 and TPS22916CNYFPR among its other parts. Its parts include 52 capacitors, 46 resistors, 12 ICs, 9 connectors and 7 diodes. 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

158
QtyValueFootprintReferences
181uFCapacitor_SMD:C_0402_1005MetricC2, C11, C15, C16, C19, C23, C24, C25, C26, C27, C28, C29, C31, C32, C47, C48 +2
1410kResistor_SMD:R_0603_1608MetricR4, R7, R8, R15, R17, R25, R26, R35, R37, R38, R39, R40, R42, R43
13100nFCapacitor_SMD:C_0402_1005MetricC3, C4, C5, C8, C17, C20, C35, C36, C37, C38, C39, C43, C50
1110kResistor_SMD:R_0402_1005MetricR1, R5, R20, R27, R28, R29, R30, R31, R44, R46, R48
810uFCapacitor_SMD:C_0603_1608MetricC7, C13, C14, C30, C42, C44, C45, C52
54.7uFCapacitor_SMD:C_0603_1608MetricC9, C33, C34, C40, C46
5B5819W SLDiode_SMD:D_SOD-123D1, D3, D4, D5, D6
41kResistor_SMD:R_0402_1005MetricR6, R45, R47, R49
4BTN1Button_Switch_THT:SW_PUSH_6mm_H4.3mmSW3, SW4, SW5, SW6
4MountingHole_PadMountingHole:MountingHole_2.2mm_M2_DIN965_PadH1, H2, H3, H4
3SRV05-4Package_TO_SOT_SMD:SOT-23-6U1, U2, U3
21kResistor_SMD:R_0603_1608MetricR9, R13
22.2uFCapacitor_SMD:C_0603_1608MetricC21, C22
25.1kResistor_SMD:R_0805_2012MetricR2, R3
2AO3400APackage_TO_SOT_SMD:SOT-23Q3, Q4
2AO3401APackage_TO_SOT_SMD:SOT-23Q1, Q2
2JMPJumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP2, JP4
2SWMainLibrary:PTS636SM25FSMTRLFSJ6, J9
2~Jumper:SolderJumper-3_P1.3mm_Open_Pad1.0x1.5mmJP5, JP7
10.47RResistor_SMD:R_0805_2012MetricR34
11.5kResistor_SMD:R_0603_1608MetricR24
1100kResistor_SMD:R_0603_1608MetricR36
110RResistor_SMD:R_0603_1608MetricR10
110k BResistor_SMD:R_0805_2012MetricR41
110k SResistor_SMD:R_0805_2012MetricR32
110nFCapacitor_SMD:C_0402_1005MetricC18
115kResistor_SMD:R_0603_1608MetricR18
11MResistor_SMD:R_0402_1005MetricR19
11uFCapacitor_SMD:C_0603_1608MetricC51
11uH PInductor_SMD:L_0603_1608MetricL1
120kResistor_SMD:R_0603_1608MetricR22
122Resistor_SMD:R_0402_1005MetricR33
1220nFCapacitor_SMD:C_0402_1005MetricC41
122uFCapacitor_SMD:C_0603_1608MetricC1
1270RResistor_SMD:R_0603_1608MetricR16
13.1V TPTestPoint:TestPoint_Pad_D1.5mmTP2
147kResistor_SMD:R_0603_1608MetricR21
147nFCapacitor_SMD:C_0603_1608MetricC12
147nHInductor_SMD:L_0805_2012MetricL2
16.8uFCapacitor_SMD:C_0805_2012MetricC10
1600 @ 100 MHzInductor_SMD:L_0603_1608MetricFB1
19.1kResistor_SMD:R_0603_1608MetricR23
1BLUELED_SMD:LED_0603_1608MetricD7
1BMI088MainLibrary:BMI088U5
1BQ24196RGERMainLibrary:QFN50P400X400X100-25N-DIC3
1CC1TestPoint:TestPoint_Pad_D1.5mmTP11
1CC2TestPoint:TestPoint_Pad_D1.5mmTP12
1Conn_01x02Connector_JST:JST_PH_S2B-PH-K_1x02_P2.00mm_HorizontalJ7
1Conn_01x02Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ2
1Conn_01x24_MountingPinConnector_FFC-FPC:Hirose_FH12-24S-0.5SH_1x24-1MP_P0.50mm_HorizontalJ10
1DPS310MainLibrary:DPS310XTSA1U4
1ESP32-S3-WROOMMainLibrary:ESP32S3WROOM1IC1
1L76-LMainLibrary:XCVR_L76-LU8
1LED_CHRGConnector_PinHeader_2.54mm:PinHeader_2x01_P2.54mm_VerticalJ8
1MAX98357AMainLibrary:QFN50P300X300X80-17NU7
1QMC5883LMainLibrary:QMC5883LU6
1REDLED_SMD:LED_0603_1608MetricD2
1SJJumper:SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP6
1SJMPJumper:SolderJumper-3_P1.3mm_Open_Pad1.0x1.5mmJP8
1SRN6045TA-680MMainLibrary:SRN6045TAL3
1SolderJumper_3_OpenJumper:SolderJumper-3_P1.3mm_Open_Pad1.0x1.5mm_NumberLabelsJP1
1TPS22916CNYFPRMainLibrary:BGA4C40P2X2_78X78X50IC4
1TPS73701DCQRMainLibrary:SOT127P706X180-6NIC5
1TP_BATTERYTestPoint:TestPoint_Pad_D1.5mmTP1
1TP_SCL1TestPoint:TestPoint_Pad_D1.5mmTP4
1TP_SCL2TestPoint:TestPoint_Pad_D1.5mmTP6
1TP_SDA1TestPoint:TestPoint_Pad_D1.5mmTP3
1TP_SDA2TestPoint:TestPoint_Pad_D1.5mmTP5
1TP_SYS_LOADTestPoint:TestPoint_Pad_D1.5mmTP10
1U.FL-R-SMT(01)SamacSys_Parts:HRS_U.FL-R-SMT(01)J5
1USB_C_Receptacle_USB2.0Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J1
1~MainLibrary:TFP09212BJ3

More from oiver12/VariometerV2

4
  • 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 layers56.6 × 69.4 mmVariometerV2, the printed circuit board in 3D

    VariometerV2

    oiver12/VariometerV2

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

    117 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

  • 4 layers38 × 48 mmSTDC, the printed circuit board in 3D

    STDC

    SebastianThomas/STDC-PCB

    PCB Layout of the STDC Project

    127 parts
  • 8 layersFoc control, the printed circuit board in 3D

    Foc control

    sujaygouda123/foc-control

    BLDC field-oriented-control board for a humanoid robot actuator. KiCad 10, Ø80 mm, 8 layers, 1.6 mm.

    104 parts
  • 2 layers170 × 73 mmIGNRocketOrderFile, the printed circuit board in 3D

    IGNRocketOrderFile

    wasa-rockoon/WOBC

    WASAロケットプロジェクト 共通電装基盤

    240 parts1MIT
  • 2 layers70 × 70 mmRecorder, the printed circuit board in 3D

    Recorder

    Yang-xy-svg/ESP_OpenMic

    This project is subject to the licence in the LICENCE file, and even if that says it is an open source project, you cannot sell boards or cases bearing the Andrews & Arnold Ltd name, the A&A logo, the registered…

    71 partsGPL-3.0
  • 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 layers21 × 54 mmSensorBoardNoMCU, the printed circuit board in 3D

    SensorBoardNoMCU

    Terrapin-Rocket-Team/SRAD-Avionics

    Code and PCBs for the avionics subteam for the SRAD flight computer and side projects

    29 parts17
  • 2 layers35 × 55 mmIcarus, the printed circuit board in 3D

    Icarus

    Aryan2804/Icarus

    56 parts
  • 4 layers244 × 244 mmQfmu, the printed circuit board in 3D

    Qfmu

    steewbsd/quincy

    236 parts

Questions

How big is the VariometerV2.2.1 PCB?

It measures 94.7 × 69.1 mm and has 4 copper layers, 1.6 mm thick.

What parts does the VariometerV2.2.1 use?

158 parts, built around the ESP32-S3-WROOM-1-N8, DPS310, QMC5883L 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.2.1 KiCad files?

From the oiver12/VariometerV2 repository on GitHub, at the commit this page was made from: the board is Hardware/Version 2.1/VariometerV2.2.1/VariometerV2.2.1.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.2.1 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).