⚠️ Experimental project. Not intended as a primary or sole dive computer.
🤿 Open Source  ·  MIT License

DIY Dive Computer For Makers diyve

Build your own dive computer. Open source, open hardware, built on Raspberry Pi Pico.

RP2040 Raspberry Pi Pico
1.54" E-Paper Display
MIT License

Prototype

Photos of the diyve hardware prototype — hand-wired on perfboard inside a GoPro housing.

Dive Log Viewer

Real dive profiles recorded during prototype testing on December 19, 2025. Data parsed directly from the binary log files (dive_00N.bin).

Date / Start
Max Depth
Avg Temp
Duration
Log Entries
File
Depth (ft) — left axis
Temperature (°C) — relative scale

Chart rendered from sampled binary records. Export full logs with dive_log_to_uddf.py -i dive_00N.bin -o out.uddf

Subsurface Integration

Binary logs export to UDDF — the universal dive data format — making them directly importable into Subsurface, the open-source dive log manager used by thousands of divers worldwide.

Diyve dive log imported into Subsurface showing depth profile and dive map

What you get in Subsurface

  • Full depth profile graph with time axis
  • Dive statistics — max depth, average depth, duration
  • GPS map view of the dive site
  • Dive logbook with notes, ratings, and buddy info
  • Cross-dive comparisons and trend analysis
  • Export to further formats (CSV, PDF dive reports)

Export command

python3 tools/dive_log_to_uddf.py \
    -i dive_004.bin \
    -o dive_004.uddf

Then in Subsurface: Import → Import Log Files and select the .uddf file.

Features

Open hardware and software — every component and line of code is publicly available.

📡

Depth & Temperature

MS5803 pressure sensor over I2C. Reads depth and water temperature in real time at 1 Hz.

MS5803 · I2C @ 0x76
🖥️

E-Paper Display

1.54" 200×200 e-paper display. Readable underwater, low power, partial refresh for fast updates.

1.54" Waveshare · SPI · Partial Refresh
💾

Dive Logging

Logs depth and temperature to SD card at 1 Hz. Exports to UDDF for use in Subsurface and other dive software.

SD Card · 15 B/sample · UDDF Export
🕹️

2-Button UI

Four screens: Menu, Dive, Logs, and Settings. TOP button navigates, SIDE button selects. Long-press to start or end a dive.

Menu · Dive · Logs · Settings
🖨️

3D-Printed Housing

Custom wrist-worn enclosure in a GoPro housing. OpenSCAD source files included in the repo.

OpenSCAD · GoPro Housing
🔓

Fully Open Source

C firmware, Python log converter, and all hardware files under the MIT license.

MIT License · C Firmware · Python Tools

Hardware

Built around the Raspberry Pi Pico — affordable, well-documented, and supported by a mature SDK. All parts sourced from Amazon.

#ComponentRoleEst. Cost
1 Raspberry Pi Pico (RP2040) Main MCU — dual-core ARM Cortex-M0+ $15
2 MS5803 Pressure Sensor Depth + temperature via I2C1 (addr 0x76, SDA=GPIO2, SCL=GPIO3) $70
3 DS3231 RTC Module Accurate timestamps for dive logs via I2C0 (GPIO4/5) $8
4 Waveshare 1.54" E-Paper 200×200 display, partial refresh, SPI1 $18
5 SD Card Breakout FAT filesystem log storage via SPI0 $7
6 MicroSD Card Storage media for binary dive logs $10
7 LiPo Battery (3.7V) Rechargeable power source $8
8 LiPo Charger (TP4056) USB charging module for LiPo cell $6
9 Schottky Diode Power path protection $6
10 Slide Switch On/off switch for battery circuit $9
11 Momentary Buttons (×2) TOP (navigate) + SIDE (select / long-press) $7
12 Perfboard 52×72.5mm custom PCB base $5
13 Pin Headers Module interconnects $8
14 Hookup Wire Point-to-point wiring on perfboard $13
15 GoPro Waterproof Housing Waterproof outer enclosure; 3D-printed brackets mount internals inside $19
16 Two-Part Epoxy Seal pressure sensor port through housing wall $6
17 RP2040 Debug Probe dev only SWD debugger for flashing & on-device debugging $30
Total (excl. debug probe) $215

Pin assignments from diyve_pins.h

Buttons
GPIO 28TOP button (navigate)
GPIO 27SIDE button (select)
I²C Sensors
GPIO 2/3MS5803 SDA/SCL (i2c1)
GPIO 4/5DS3231 SDA/SCL (i2c0)
SD Card (SPI0)
GPIO 16–19MISO / CS / SCK / MOSI
E-Paper Display (SPI1)
GPIO 10/11CLK / MOSI
GPIO 13CS
GPIO 6DC
GPIO 7RST
GPIO 8BUSY

Getting Started

Everything you need to build, flash, and use diyve.

📹 Full build tutorials are coming soon.

Building the Firmware

Clone the repo, then run the program script — it handles building and flashing in one step:

git clone https://github.com/RiceShelley/dive_computer
cd dive_computer
./program.sh

Prerequisites: cmake, ninja, arm-none-eabi-gcc, the Pico SDK, and an RP2040 debug probe connected via SWD.

🔌Hardware Wiring

All pin assignments are defined in src/include/diyve_pins.h:

// Pressure sensor — MS5803 via i2c1
MS5803_I2C_SDA_PIN  = GPIO 2
MS5803_I2C_SCL_PIN  = GPIO 3

// Real-time clock — DS3231 via i2c0
DS3231_SDA_PIN      = GPIO 4 (PICO_DEFAULT_I2C_SDA)
DS3231_SCL_PIN      = GPIO 5 (PICO_DEFAULT_I2C_SCL)

// SD card — SPI port 0
SD_SPI_MISO_PIN     = GPIO 16
SD_SPI_SS_PIN       = GPIO 17
SD_SPI_SCK_PIN      = GPIO 18
SD_SPI_MOSI_PIN     = GPIO 19

// E-Paper — SPI port 1
EPD_CLK_PIN         = GPIO 10
EPD_MOSI_PIN        = GPIO 11
EPD_CS_PIN          = GPIO 13
EPD_DC_PIN          = GPIO 6
EPD_RST_PIN         = GPIO 7
EPD_BUSY_PIN        = GPIO 8

// Buttons (active low, pull-up)
TOP_BUTTON_PIN      = GPIO 28  (navigate)
SIDE_BUTTON_PIN     = GPIO 27  (select / long-press)

🖨️3D Printing the Enclosure

The mechanical design files (STL / source) are included in the mechanical/ directory of the repository. Designed for FDM printing with standard PLA or PETG.

Recommended print settings: 0.2mm layer height, 20% infill, no supports required for the main body. The wrist strap mount accepts standard 20mm watch bands.

See the GitHub repository for the latest mechanical files and assembly notes.

📤Exporting Dive Logs

Copy dive_00N.bin files from the SD card to your computer, then run the Python converter:

# Install Python 3 (no extra packages needed)
# Convert a single dive
python3 dive_log_to_uddf.py \
    -i logs/dive_004.bin \
    -o dive_004.uddf

# The output is UDDF 3.2.0 XML — import it into
# Subsurface, DivingLog, or any compatible app

The binary format is <HBBBBBff (little-endian): 2-byte year, five 1-byte time fields, two 4-byte floats (temp °C, depth m). 15 bytes per record.

🐛Debugging & Development

The project includes VSCode tasks and launch configurations for debugging via OpenOCD and a picoprobe/SWD adapter.

# Flash and debug via OpenOCD (from .vscode/tasks.json)
openocd -f interface/cmsis-dap.cfg \
        -f target/rp2040.cfg \
        -c "program build/diyve.elf verify reset exit"

Use the VSCode CMake extension with the kit defined in .vscode/cmake-kits.json for a full IDE experience including IntelliSense and breakpoint debugging.