You are browsing as a guest. Sign up (or log in) to start making projects!

HydraCoaster

Hardware
  • 8 Devlogs
  • 23 Total hours

HydraCoaster is a smart drink coaster built on an ESP32-C6 Feather with an NAU7802 load cell for weight sensing and a passive piezo buzzer on GPIO7, using PlatformIO with the Arduino framework. It streams weight data over WiFi (UDP) to a Python dashboard, supports over-the-air firmware updates, and needs no USB cable in operation. Weight readings detect cup presence and sip events, with host-side calibration and automatic zero tracking. Reminder alerts play three tones — 700 Hz for hearing-loss audibility, 3400 Hz at the piezo's resonance for loudness, and 4200 Hz to bypass ANC headphones — with the onboard NeoPixel flashing in sync. It pulls weather from OpenWeatherMap to adjust hydration reminder intervals based on temperature and humidity, and relaxes them after a good drinking session. Sound, LED, and reminder preferences are configurable from the dashboard. (An earlier FSR 402 + deep-sleep firmware variant remains in the repo but is superseded by the load-cell design.)

Ship #1 Pending review

I made a "HydraCoaster", a smart drink coaster that tracks how much you drink, reminds you when you’ve gone too long without water, and adjusts your hydration goal based on the weather! It connects to a full iOS app where you can see your daily progress, streaks, badges, drink history, and even sync everything with Apple Health!

The hardest part was making the coaster reliable when the phone wasn’t connected. I had to fix Bluetooth timing issues, recover offline sips, improve weight accuracy, and make sure celebrations only triggered after the coaster confirmed they actually played.

I’m most proud that this started as a basic ESP32 prototype and turned into something that feels like a real product. It’s fully wireless, has a custom enclosure, supports over-the-air updates, logs drinks automatically, and even celebrates when you hit your goal!

I'd really appreciate if you could give me all 9s because this took forever to make. Thank you!

  • 8 devlogs
  • 23h build
Video of Project → See source code →
Open comments for this post

1h 40m 46s logged

Devlog #8 – HydraCoaster

V3 IS HERE!!!!

THE PARTY ALWAYS ARRIVES

Shipping a celebration and reliably delivering one turn out to be different problems. V2 marked your once-a-day celebration as used the moment the phone sent the command — so if the coaster rejected it or the reply got lost in the air, the day burned with nothing played, and it never retried. Now the day is only recorded when the coaster confirms the flourish actually ran; a bad or lost reply clears the pending marker and the next qualifying sip simply sends it again.

Crossing 100% away from the coaster counts too. Log a glass at a restaurant, walk in the door, and the celebration fires the moment the coaster reconnects — no waiting for another sip. Amber pulses and ascending chirps, right on cue.

NO MORE VANISHING SIPS

The nastiest bug of the release: the app called itself “connected” the instant Bluetooth linked, before it had discovered where writes actually go. Everything that fires on connect — including the request for sips the coaster logged while your phone was away — hit a not-ready guard and was silently dropped. Offline sips just never backfilled. “Connected” now means ready-to-write, and a failed discovery disconnects for a clean retry. Every phone-free sip lands in your history on the next reconnect, every time.

A RING WITH A PULSE

The Today ring traded flat ink for an angular gradient with a liquid sheen, progress moves on a spring, and the first time it fills each day it does a quick scale pulse and pins a sparkly “goal reached” under the number — the on-phone echo of the coaster’s flourish. The streak flame bounces when your streak grows. The Awards tab got tinted icon circles on the stat tiles, earned badges on accent-washed gradient cards, badge symbols that bounce when unlocked, and a cascading entrance. Turn on Reduce Motion and all of it politely sits still.

PUSH TO PARTY

A Celebration Test button now lives in Settings, right under Buzz Test. Unlike Buzz Test, it respects your Sound and Light toggles, so it exercises the exact path a real goal celebration takes. A checkmark plus silence means your toggles are off — not that something’s broken.

0
0
2
Open comments for this post

5h 9m 2s logged

Devlog #7 – HydraCoaster

V2 IS HERE!!!!

SMARTER GOALS

Your daily goal can now be computed from weight, height, and activity level instead of picked from a wheel, and it scales up on hot or dry days using the same OpenWeatherMap feed that already drives reminder pacing. The Today ring shows the weather bump as a caption so a bigger goal never looks like a bug. Streaks and badges always judge against your base goal, since past days’ weather isn’t stored — that’s deliberate and documented in the code.

REAL DRINK TRACKING

A 61-drink catalog across 9 categories, each with a hydration factor — water is 1.0, espresso less, beer much less. Log drinks manually with the + button, or reclassify any coaster-detected sip after the fact. Apple Health entries are replaced in place when you reclassify, so Health always agrees with the app.

SLEEP-AWARE QUIET HOURS

The coaster no longer buzzes at 3am. Quiet hours come in three modes: off, manual times, or derived from your Health sleep data — a 14-day median of bedtime and wake, with naps filtered out and a noon-centered median so bedtimes straddling midnight don’t average to lunchtime. The phone converts your local window to UTC and rewrites it to the coaster on every connect and every half-hour weather tick, which means daylight-saving shifts fix themselves within one cycle and the firmware never learns what a timezone is. A reminder suppressed overnight isn’t lost — it fires on the first check after the window ends. Phone-side, notifications defer to fifteen minutes after wake, reminders got a snooze button, and three presets (Gentle, Standard, Persistent) scale how hard the whole system nags.

One casualty: the “Respect Focus” toggle. Apple’s Focus-status entitlement can’t ride on a free personal-team provisioning profile, so the feature is compiled out behind a flag with a note on how to restore it if the project ever gets a paid developer account.

STREAKS, BADGES, AWARDS

A fourth tab. Today’s hydration score, current streak, and longest streak up top; below, ten badges from First Sip to a 30-day streak, a lifetime 50 liters, an early-bird sip before 8am, and a perfect calendar week. Everything is recomputed from sip history on demand — nothing is stored, so the numbers can never drift from the data. A small flame chip appears on Today once you’re two days deep.

DEEPER HISTORY

Week and month chart ranges, a GitHub-style heatmap of the last twelve weday got to goal, a per-category drink breakdown, and CSV export of yourentire sip history from the share button — RFC-4180 quoted, ISO-8601 dates, ready for a spreadsheet.

THEMES AND A WIDGET

Four color themes — Aqua (the original), Sunset, Forest, Mono — plus a light/dark override, all applied live. A home-screen and lock-screen widget shows the progress ring and
streak, updated through an App Group the moment a sip lands.

THE COASTER CELEBRATES WITH YOU

New firmware command: the first time you hit 100% in a day, the coaster pirps with amber LED pulses — deliberately distinct from the reminder alertby both ear and eye. It respects your sound and light preferences, fires once per day, and triggers against the same weather-scaled goal the ring shows.

0
0
2
Open comments for this post

5h 0m 40s logged

Devlog #6 – HydraCoaster

Today, I setup HydraCoaster with BLE and made a full-fledged iOS app! The whole reminder system is now onboard: sip detection, automatic zero-drift correction, and self-timed buzz reminders now run on the ESP32 with no computer anywhere. Sips get logged to flash and served over a custom BLE service: live weight streaming, history backfill, time sync, calibration commands, battery. The product build is BLE-only, but a dev build keeps WiFi OTA so reflashing stays cable-free.

The app has a sixty-second onboarding (pair + set a goal), Today screen with a goal ring and live weight, 14-day history chart, Settings with sound/light/reminder toggles, buzz test, notification test, reset data button, and a guided recalibration flow. Sips sync into SwiftData, write to Apple Health with their real timestamps, and the phone mirrors the coaster’s reminder as a local notification.

0
0
3
Open comments for this post

5h 14m 36s logged

Devlog #5 – HydraCoaster

Printed and converted to V2 of the hardware enclosure (images not attached)! New CAD has an added cork base, and had to add the hardware for a buzzer as well.

Made HydraCoaster fully wireless! It now streams weight over WiFi (UDP), reflashes over the air, and the USB cable is optional. I also built a notification system: a piezo buzzer plays a three-tone alert (low for hearing loss, mid for loudness, high to beat noise-cancelling), with the onboard LED flashing white in sync.

The server detects sips from weight drops, and buzzes the coaster when you haven’t drunk for too long — 20 min base, shortened in hot/dry weather (OpenWeatherMap), relaxed after a good drinking session. Dashboard got a console showing location/temp/humidity/interval, a test buzz button, and persistent toggles for sound, LED, and reminders.

0
0
4
Open comments for this post

1h 9m 33s logged

Devlog #4 – HydraCoaster


I tested V1 of the enclosure and created a proof of concept software to test the basic hydration session system. The electronics fit perfectly but the strain gauge is offset and has less accurate readings in this coaster. I also printed the TPU cover on the wrong build plate, causing for small imperfections in the print. I plan to reprint the TPU cover and the outer wall of the coaster to be a bit taller so that there’s more wiggle room for the strain gauge.

‎The software is measuring values that are really wrong, but the start and end values are equally wrong. This means the session drinking amounts are really right and I’m happy with that for now!

0
0
2
Open comments for this post

2h 20m 29s logged

Devlog #3 – HydraCoaster

‎‎
I designed V1 of the HydraCoaster’s enclosure/case and tried my best to house the electronics as well as possible. I definitely will need future iterations to fix the weight mechanism and also include more features like LEDs, vibration motors, buzzers, etc. I’m really happy with what I’ve got so far and can’t wait to see this through!

0
0
3
Open comments for this post

1h 10m 32s logged

Devlog #2 – HydraCoaster


I switched from the FSR402s to a proper 1kg Load Cell that has much higher accuracy when connected to an Adafruit NAU7802. After some testing, the load cell returned values with accuracy down to the tenth of a gram. With the right code and design, this is the perfect component for a compact smart coaster!

0
0
2
Open comments for this post

45m 46s logged

Devlog #1 – HydraCoaster


Hi everyone! This is my second hardware project on Stardance and I think it might be my favorite. The goal of this project is to eventually make something with a sleek form factor and the potential of being scaled into a real product. I envision a PCB, meaning I need to learn PCB design and production. However, for now, I’m prototyping with a breadboard and perf board just to learn the basics. I’ve wired an ESP 32 C6 Feather with two FSR402 pressure sensors and a passive buzzer. I’ve coded a basic OWM pull with PlatformIO and Arduino framework. It adapts drinking intervals using the temperature from OWM and buzzes accordingly. That’s all I have for now!

0
0
2

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…