Back to Projects

Snowverlay

Smart HUD ski goggles

Snowverlay

How the idea was born

Elite skiers and snowboarders have always relied on coaching, video analysis, and post-run data review to refine their technique. But the feedback that matters most in the moment, speed, acceleration, and heading, has historically required bulky, expensive setups out of reach for most athletes.

Working with two teammates for our embedded systems design course, we built Snowverlay to close that gap: a sensor-equipped ski goggle system that delivers live performance metrics directly in the athlete's field of vision through a transparent heads-up display.


What it does

Snowverlay fuses five sensor subsystems into a single wearable device, all navigable through one rotary encoder on the goggle frame:

  • GPS screen — Live latitude, longitude, speed, and fix status from a u-blox NEO-M9N module.
  • Motion screen — Real-time acceleration and heading from a Bosch BNO055 9-axis IMU, using onboard sensor fusion.
  • Environment screen — Temperature, humidity, barometric pressure, gas resistance, and a UV index with risk classification, from a Bosch BME688 sensor and a dedicated UV photodiode.
  • Avalanche safety alert — If humidity crosses a configurable threshold (a signal of wet-snow, avalanche-prone conditions), the companion iPhone app triggers a full-screen alert and offers to call an emergency contact.
  • Companion app — A React Native iPhone app connects over Bluetooth Low Energy, displaying a full post-run summary across every sensor channel and logging complete session data regardless of which HUD screen was active. The whole system runs on a 3,500 mAh rechargeable LiPo battery, rated for an estimated 40+ hours of operation even after cold-weather derating.

How it's built

The system is architected around an Adafruit Feather nRF52840 Express, chosen for its integrated Bluetooth 5.0 radio and native 3.3V logic. Sensor data flows over I2C, while the transparent OLED display runs on a separate SPI bus, keeping high-frequency screen refresh from saturating the sensor-polling traffic.

A few things I'm proud of from the build:

  • Hardware interrupts over polling — The rotary encoder uses interrupt-driven quadrature decoding with a debounce lockout, so screen navigation never misses an event even during rapid spins.
  • Validated fix logic — GPS readings are checked against fix-status flags before being displayed or logged, so a lost satellite fix shows "No Fix" instead of stale, misleading data.
  • Compact BLE protocol — All sensor channels are packed into an abbreviated JSON payload under the 200-byte BLE characteristic limit, streamed to the phone app at roughly 1 Hz.
  • Modular validation — Every sensor was tested and calibrated in isolation before system integration, which made debugging fast once everything came together. One of the trickier issues we ran into: the nRF52840's EN pin intermittently failed to reach a valid logic HIGH, cutting power to the whole board with no clear root cause. We traced it to a probable interaction with the SYSTEMOFF low-power register and resolved it with an external pull-up resistor on the EN line.

Snowverlay HUD ski goggles


Bugss

Building a wearable sensor system meant running into a fair number of hardware and firmware quirks along the way:

  • The EN pin mystery — The trickiest bug of the whole project. The nRF52840's regulator enable pin would intermittently fail to reach a valid logic HIGH, cutting the 3.3V rail entirely even with USB power applied. We never fully isolated the root cause, but the best hypothesis is an interaction with the SYSTEMOFF low-power register leaving the board in a bad state. Fixed with an external ~1kΩ pull-up resistor on the EN line.
  • Cold-start GPS delay — The NEO-M9N takes anywhere from 27 to 60 seconds to acquire a satellite fix on cold start, which means the HUD shows "No Fix" for a noticeable stretch at the top of a run.
  • No GPS smoothing — Without a Kalman filter, raw position and speed readings get noisy at higher ski speeds, especially in tree corridors with partial sky obstruction.
  • Sunlight readability — The transparent OLED is hard to read in direct, bright sunlight, a known limitation of transparent OLED tech in general rather than something fixable in firmware.
  • BME688 warm-up time — The environmental sensor's gas resistance reading needs about 15 minutes to stabilize after power-on, so early air-quality readings during a session aren't reliable.
  • Continuous polling drains battery faster than needed — GPS and UV sensors are read every loop instead of duty-cycled, which works but leaves battery life on the table.

Things to improve

The prototype hit its core goals, but there are things that could be improved if given more time:

1. Custom PCB and Enclosure

Moving all electronics from the current tape-and-cardboard prototype onto a custom PCB mounted flush to the goggle side arm, with an IP54-rated, conformal-coated enclosure for real weatherproofing.

2. Smarter Sensor Processing

Adding a Kalman filter to smooth GPS noise at ski speeds, and duty-cycling the GPS and UV sensors instead of polling continuously, to meaningfully extend battery life beyond the current 40-hour estimate.

3. Modular Firmware Architecture

Formally separating the firmware into distinct sensor-driver, display-service, and Bluetooth-pipeline layers, a refactor we identified as valuable but didn't have time to implement during the initial build.

4. Field Validation and Social Features

On-mountain testing with real athletes, plus social features in the companion app like friend tracking and shared run data.


Resources