← Projects

Dulton's Hidden Bank

An hybrid between a piggy bank and a Dulton-style clock acting as a nonintrusive container for cash storage, all powered by Arduino.

Date
Domain
hardware
Stack
C++ · CAD · electronics · soldering

The finished clock-front bank, closed

A physical savings device for tipped and service-industry workers, built around an Arduino. It works as a desk clock—an analog hand driven by a stepper motor sweeps once per hour—while tracking how much cash you’ve set aside and how many hours you worked to earn it. Group project for APPL110 at UNC-Chapel Hill, presented at MakerFest Spring 2026. My source code and simulation space can be found in this repo.

Software Stack

  • PlatformIO/Wokwi in VSCode for firmware development and simulation
  • Fusion 360 for enclosure modelling
  • KiCAD for schematic generation

Hardware

  • Arduino Uno R3
  • 16x2 I2C LCD
  • DS3231 real-time clock module
  • 28BYJ-48 stepper motor w/ ULN2003 driver
  • 9x buttons, 2x LEDs
  • 3D printed parts, various screws and inserts

Process

My responsibility for this project was to develop the software and build the electronics used in the product; I will mostly describe that process.

The device runs two modes: money mode tracks a dollar balance, time mode tracks minutes worked. Seven increment buttons are shared between them via a reference alias, so the same hardware does double duty. In money mode they cover fixed denominations from $0.01 to $100; in time mode the first three add time blocks and the rest become function keys for saving shifts, reviewing history, and computing hourly wage. A subtract toggle flips any increment negative, floored at zero.

The most involved feature was shift logging. At the end of a shift you save your balance, time worked, and a timestamp to EEPROM as a record. A review mode lets you scroll through up to 50 past shifts, compute the hourly wage for any of them, or delete one. Deletion rewrites later entries over the gap to keep the stored array contiguous.

Persistence drove most of the design decisions. Every counter change writes to EEPROM immediately using change-only writes, staying within the chip’s rated write cycles. On boot the firmware sanity-checks everything it reloads, since uninitialized EEPROM returns garbage values. Negative balances, impossible shift counts, and blank timestamps are all caught and reset. The clock has the same concern: since the device can sit unpowered for long stretches, startup computes elapsed time from the DS3231 and steps the motor forward to the correct position. One edge case worth mentioning is that a future RTC timestamp overflows the unsigned subtraction and sends the motor spinning wildly, which surfaced in Wokwi simulation; the load-time checks now guard against it.

The enclosure of the bank was 3D printed and assembled with heatset inserts, screws, and superglue. The buttons and their associated components were soldered onto a perfboard to create the bank face panel. All components were secured with 3D printed connectors and adhesives inside the enclosure itself.

Outcomes

A self-contained savings tracker with memory persistence across power loss, shift history with hourly wage calculation, and a working analog clock hand.

This project served as an introduction to C++ in embedded systems for me, improved my soldering skills, and helped further hone my ability to work in a group under time pressure.