"H-CUBE" a Retro Style Smart Watch Powered by an ESP32-S3
by Ashu503 in Circuits > Wearables
1197 Views, 9 Favorites, 0 Comments
"H-CUBE" a Retro Style Smart Watch Powered by an ESP32-S3
I always wanted to build my own wristwatch, something I could design, create, and actually wear. But I never had the right inspiration to begin. The biggest challenge was choosing the display, which is the most important part of any digital watch.
I’ve always been fascinated by 80s technology, amber LEDs, simple character displays, and minimalistic design, so I naturally wanted something that captured that retro feel.
OLEDs were an option, but they didn’t match the look I had in mind. Color LCDs also didn’t fit that aesthetic. E-ink displays were interesting, but their refresh rates were too slow for a responsive watch interface.
At first, I considered using 0.2" seven-segment displays, four of them arranged in a matrix. That idea stayed with me for a while, until a few months ago, when I was searching for seven-segment modules and came across the HCMS-2971: a High Performance CMOS 5×7 alphanumeric display.
The moment I saw it, everything clicked. It had the perfect retro glow, the right size, and exactly the kind of visual character I wanted for my wristwatch. That’s when the project finally started taking shape, built on a custom PCB with an ESP32-S3 at its center and designed to incorporate features such as GPS, a step counter, temperature sensing, and more.
Supplies
- Core electronics: ESP32‑S3 microcontroller with external 128‑Mbit flash, CP2102 USB‑to‑UART, 40 MHz crystal, ESD protection, and USB‑C connector.
- Display and indicators: HCMS‑2971 8‑character alphanumeric LED display plus several 0603 status LEDs in different colors for notifications and mode feedback.
- Sensing and timing: DS3231 real‑time clock, BMI270 6‑axis IMU, GP‑02 GNSS module with dedicated RF and GNSS chip antennas for accurate motion, time, and position data.
- Power and battery: Single‑cell Li‑ion battery, BQ24075 charger and power‑path IC, PAM2401 boost converter, LP38690 3.3 V LDO, MAX17048 fuel gauge, power inductors, Schottky diodes, and a full network of decoupling capacitors.
- Audio and user input: MLT‑8530 side‑firing buzzer, LS‑1305 3‑way navigation switch, additional tactile switch, and various NPN transistors for driving loads and handling control signals.
- Passives and connectors: Dozens of 0402/0603 capacitors, resistors from 0 Ω jumpers to precision feedback values, small RF inductors for antenna matching, a JST battery connector, and other board headers
I have given BOM with all the components.
What Is H-CUBE?
H-CUBE stands for "Hardware Cube", representing both the hardware-centric design philosophy and the compact form factor. It's a wearable smartwatch featuring:
- Retro Display: HCMS-2971 8-character yellow alphanumeric LED (2000 nits, PWM adjustable brightness)
- Modern Processor: ESP32-S3 dual-core 240 MHz with 8 MB flash, integrated Bluetooth/WiFi
- Sensor Suite: DS3231 RTC (±2 ppm), BMI270 IMU (6-axis), GP-02 GPS, MAX17048 fuel gauge
- 12+ Operating Modes: Time, date, GPS, temperature, battery status, alarm, stopwatch, RGB LED control
- Wireless Features: Bluetooth SPP pairing with phones, WiFi connectivity, OTA updates
- Smart Power Management: Intelligent charging detection, 10-second sleep mode, 8-12 hour runtime
- Professional Hardware: 4-layer PCB, 100+ SMD components, custom 3D-printed housing
Testing the Concept on Bredboard
Before moving on to the PCB design, the whole circuit was first tested on a breadboard to make sure every block worked perfectly together. This stage acted as a safety check where wiring could be changed in seconds, parts could be swapped, and firmware could be debugged without risking an expensive 4‑layer board.
Downloads
Understanding the Hardware
1. ESP32-S3 (Main Microcontroller)
The ESP32-S3 is the main microcontroller of the H-CUBE watch. It handles all processing, sensing, communication, display driving, and UI control. The schematic connects the S3 to power, USB programming, I/O peripherals, and required strapping components.
- VDD3P3 / VDD_SPI / VDD_CPU are all powered from a 3.3V regulated output (from the LDO).
- Each supply pin has local 0.1 µF + 10 µF decoupling capacitors placed close to the chip, ensuring stable operation.
- VDDA rail (analog) is filtered by a small inductor + capacitors to reduce digital noise.
the ESP32-S3 has native USB support through its USB OTG (On-The-Go) peripheral, which allows it to act as a USB host or device. It also includes an integrated USB-Serial-JTAG controller, enabling direct firmware flashing, serial communication, and debugging via USB without an external USB-to-serial chip. But for simplicity, I went with a good and tested CP2102 USB-to-TTL.
The Following Pins are in use from ESP32-S3:
Display (HCMS-2971)
- GPIO10 → RS
- GPIO11 → Enable
- GPIO12 → Clock
- GPIO13 → Register Select
- GPIO14 → Data
Buttons
- GPIO4 → Center
- GPIO5 → Up
- GPIO6 → Down
RGB LED (PWM Channels)
- GPIO38 → R
- GPIO39 → G
- GPIO40 → B
Buzzer
- GPIO41 → Piezo buzzer
I²C pins
- GPIO8 → SDA
- GPIO9 → SCL
- Used by DS3231 RTC, BMI270 IMU, and MAX17048 fuel gauge.
GPS
- GPIO16 → RX
- GPIO17 → TX
2. Winbond W25Q128JV (16 MB)
The external flash IC stores the ESP32-S3’s firmware. It connects through a 4-bit SPI bus (QSPI mode) using CS, SCK, and IO0–IO3.
This allows fast code execution and large program storage needed for menus, GPS parsing, motion processing, and animations.
3. USB-C Connector
The USB-C port provides 5V power and programming access.
Although USB-C has up to 16 pins, the watch only needs:
- VBUS, GND (power)
- D+, D− (data)
- CC1 / CC2 each with a 5.1kΩ pull-down (Rd) so the host recognizes the watch as a 5V device.
- Other pins are unused but needed for physical compatibility.
4. CP2102N USB-to-UART Converter
This chip converts USB data into UART for the ESP32-S3 during programming.
It connects to the ESP32’s TX/RX, and its control pins toggle EN and BOOT to enter flashing mode automatically.
5. BQ24075 Charger IC (Li-Ion Charging + Power Management)
The BQ24075 handles safe charging of the Li-ion battery from the USB-C port.
Key features:
- 1A Li-ion charging with thermal regulation
- Power-path management → can run the watch directly from USB even without a battery
- SYS output gives a stable 4.4V system rail
- STAT1/STAT2 LEDs indicate charging status
- Safety timers + battery temperature input (TS pin)
This ensures safe and efficient charging, especially important for wearables.
6. PAM2401 Boost Converter (3.7V → 5V)
The PAM2401 boosts the battery voltage (3.0–4.2V) up to a stable 5V supply used for peripherals like the HCMS-2971 display.
It includes:
- Internal MOSFET switch
- Feedback network for output setting
- Input/output capacitors for stable operation
- Efficiency up to ~90%
This guarantees the watch gets a reliable 5V rail even when the battery is low.
7. 3.3V LDO Regulator
The ESP32-S3 and sensors require 3.3V, so the system voltage (battery or USB) is fed into a Low Dropout Regulator.
The LDO ensures:
- Clean, noise-free 3.3V
- Low quiescent current for better battery life
- Stable power during Wi-Fi/BLE peaks
All sensors and logic circuits use this regulated output.
8. HCMS-2971 Alphanumeric LED Display
The HCMS-2971 is an 8-character alphanumeric LED module with onboard driver circuitry.
Connections used:
- DATA, CLK, RS (Register Select), EN, RESET
- A current-set resistor (ISET) to define LED brightness
- Powered from 5V
Using the LedDisplay library, the ESP32 sends serial commands to update characters quickly and efficiently. Brightness is set via ISET + software control.
9. DS3231 Real-Time Clock (RTC)
The DS3231 keeps track of accurate time and date. It communicates over I²C (0x68) and includes:
- Built-in temperature-compensated crystal (high accuracy)
- Backup coin cell (CR2032) to keep time when battery is removed
- Two programmable alarms (INT/SQW output)
- Internal temperature sensor
The watch uses the RTClib library to read time and temperature.
10. MAX17048 Fuel Gauge
The MAX17048 measures battery voltage and percentage (SOC).
Features:
- I²C address 0x36
- Ultra-low power (~23 µA)
- ModelGauge™ algorithm for very accurate SOC
- No calibration or sense resistor needed
- Firmware uses QuickStart() for instant recalibration
This ensures stable and reliable battery readings in the watch.
11. BMI270 6-Axis IMU (Step Counter)
The BMI270 provides accelerometer + gyroscope data and includes a built-in hardware step counter.
Working:
- Detects wrist motion and gait cycles
- Internal motion engine increments a step counter register
- ESP32 reads steps using:
Because step detection runs inside the chip, it uses very little power and is highly accurate.
12. GP-02 GPS Module (UART GPS Receiver)
The GP-02 GPS module communicates with the ESP32 through UART (Serial2).
It outputs standard NMEA sentences (e.g., GPGGA, GPRMC) at 9600 baud.
Using the TinyGPS++ library, the watch reads:
- Latitude
- Longitude
- Fix status
- Satellites
- Time (optional)
Connections:
- GPS TX → ESP32 RX
- GPS RX → ESP32 TX
- Power from 3.3V
- Backup battery (optional) for faster warm starts
13. RGB LED (PWM Control)
A three-channel RGB LED is driven using ESP32 LEDC PWM:
- LED_R = 38
- LED_G = 39
- LED_B = 40
- Each channel uses PWM to blend colors, allowing custom themes and animations.
14. Buttons (UP, DOWN, CENTER)
Three pushbuttons are connected with internal pull-ups and read using software debouncing.
They handle menu navigation, mode switching, stopwatch/timer control, and alarm canceling.
15. Buzzer (MLT-8650)
A piezo buzzer connected to GPIO 41 provides alarms and timer tones.
The ESP32’s tone() function plays melodies such as countdown completion or wake alarms.
16. Li-Ion Battery
A single-cell 3.7V Li-ion battery powers the entire watch.
Its voltage is monitored by the MAX17048 and charged safely by the BQ24075.
Auto-Programmer (Auto-Boot / Auto-Reset Circuit) — ESP32-S3
The ESP32-S3 requires a specific sequence on its EN (reset) and GPIO0 (boot mode) pins to enter download (UART flashing) mode. Instead of pressing buttons manually, the watch uses an auto-programmer circuit, controlled by the CP2102N USB-to-UART chip.
How it Works
The CP2102N has two modem control signals:
- DTR (Data Terminal Ready)
- RTS (Request To Send)
These pins are toggled automatically by the Arduino IDE or ESP-IDF when uploading code.
Using two small transistors, these signals generate the correct ESP32 boot sequence:
EN (Reset)
- Connected to RTS through an NPN transistor
- When RTS pulses low → ESP32-S3 resets
GPIO0 (Boot Mode)
- Connected to DTR through another NPN transistor
- When DTR pulses low during reset → ESP32 enters Bootloader mode
The ESP32 then waits for firmware over UART, and uploading begins automatically.
4-Layer PCB Stackup – Technical Overview
A 4-layer PCB stackup is used to support high-density routing, controlled impedance, and stable power distribution for high-speed digital and mixed-signal circuits. This type of structure helps maintain signal integrity for components such as microcontrollers, memory, GPS receivers, and various sensors commonly used in compact embedded systems.
Total PCB thickness: approximately 1.6 mm
Surface finish: ENIG (Nickel/Gold)
Functional Purpose of Each Layer:
Top Layer (L1) – Critical and High-Speed Routing
The top layer is used for components and short routing paths requiring minimum delay and impedance variation. Typical uses include:
- High-speed digital communication (e.g., flash memory buses)
- UART, SPI, and display interface traces
- Routing around power-management ICs and converters
This layer generally carries the densest routing.
Inner Layer 1 (L2) – Controlled-Impedance Signal Layer
L2 is dedicated to signals that require consistent impedance or reduced crosstalk. It is commonly used for:
- I²C buses
- Secondary SPI/QSPI routing
- USB differential pair routing
- The placement between dielectric layers provides stable impedance characteristics.
Inner Layer 2 (L3) – Low-Noise Signal and Power Routing
L3 supports low-noise or analog-related paths, as well as supplemental power routing. Typical usage includes:
- Battery sensing lines
- IMU auxiliary connections
- GPS-related reference signals
- It can also function as a semi-power plane to improve return-path integrity.
Bottom Layer (L4) – Auxiliary and Interface Routing
The bottom layer is used for less critical routing such as:
- Button and interface traces
- Buzzer and LED control paths
- Miscellaneous breakout routing for bottom-mounted devices
This layer provides additional routing capacity without impacting critical signal integrity.
Electrical Performance Considerations:
Controlled Impedance
The stackup supports:
- 50-ohm single-ended impedance (approximately 0.16 mm trace width depending on reference plane)
- 90-ohm differential impedance (approximately 0.16 mm width with 0.22 mm spacing)
This is suitable for:
- USB D+/D− lines
- High-speed QSPI interfaces
- Other differential or high-speed signaling environments
Electromagnetic Compatibility
The symmetric structure with internal signal layers helps:
- Reduce electromagnetic emissions
- Minimize coupling between analog and digital subsystems
- Improve overall noise performance
Power Integrity
Internal layers provide:
- Short, predictable return paths
- Reduced ground noise
- Improved voltage stability during high-load conditions (such as wireless transmission or display switching)
Via Structure:
The configuration supports:
- Through vias (L1–L4)
- Blind vias (L1–L2, L1–L3, L4–L3)
- Buried vias (L2–L3)
This provides routing flexibility and supports compact QFN/BGA device breakout.
Designing the PCB
Top Side Overview :
The top side contains the primary active components and high-speed interfaces. Major elements include:
Microcontroller Section
A central ESP32-S3 module is placed near the middle of the PCB. Its surrounding area includes the required decoupling capacitors, crystal oscillator, bootstrap components, and associated power-conditioning elements. The placement allows short, direct connections to the internal copper layers for signal routing and return-path integrity.
Display Interface
A large edge connector or pad array is positioned at the upper section, intended for interfacing with a segmented display or LED module. The interface lines are routed predominantly on the top and inner layers using controlled-width traces to minimize skew and maintain consistent impedance.
USB Type-C Port
The USB Type-C receptacle is mounted on the bottom left of the top side. It is surrounded by ESD protection components, configuration resistors, and a USB bridge IC. The differential USB data pair is routed with matched lengths and controlled impedance across the stackup.
Power-Management Components
Charging and voltage-boost circuitry occupy the upper-right region. This includes:
- Battery charger IC
- Power-path MOSFETs
- Inductors and diodes for the boost converter
- Output filtering capacitors
Their placement maintains short high-current loops, with wide copper pours and multiple via stitching for thermal and electrical performance.
Sensor and Peripherals
A GPS module is positioned at the upper left, isolated from noisy digital circuits. Nearby filtering and matching components support the module’s RF performance.
Additional ICs such as the RTC, fuel gauge, and IMU are distributed around the center and lower sections, each accompanied by local capacitors and pull-up resistors.
Mechanical and Interface Devices
Pushbuttons, tactile switches, and connectors are placed along the edges for accessibility from the enclosure. An RGB LED and buzzer footprint are also included.
Bottom Side Overview :
The bottom side contains smaller passive components, supplemental routing, and secondary functional blocks.
RTC Backup and Battery Interface
A coin-cell or supercapacitor footprint supports RTC backup. Passives around this area handle filtering, charge control, and battery isolation.
Additional Decoupling and Filtering
Many resistors, capacitors, and small passives populate the bottom side to support signal integrity and power filtering for the top-side ICs. Their placement directly underneath higher-speed digital ICs shortens via paths and reduces loop inductance.
Switches, Connectors, and Mechanical Features
Additional user-interface elements, such as toggle switches or rear-mounted buttons, are located along the edges. Their routing is isolated from analog and RF sections to avoid interference.
Layer Utilization:
The four layers are utilized efficiently:
Layer 1 (Top Copper)
High-speed, high-priority, and dense component-to-component routing. Most signal fan-out and sensitive nets begin here.
Layer 2 (Inner 1)
Used for structured, impedance-controlled routing and critical digital buses that require stable dielectric environments.
Layer 3 (Inner 2)
Carries filtered analog traces, power-distribution paths, and low-noise nets.
Layer 4 (Bottom Copper)
Used for non-critical routing, breakout paths for bottom-side components, and longer interface connections.
Copper pours on top and bottom assist in grounding, thermal dissipation, and shielding.
Routing Characteristics:
- Differential pairs (USB) are length-matched and routed with consistent spacing.
- Power traces near inductors and switching nodes are kept short to reduce EMI.
- High-density areas around the MCU use micro vias and via-in-pad structures where required.
- RF-sensitive sections are isolated and separated from high current loops.
- Via stitching surrounds the board perimeter to provide additional shielding and return path control.
The whole PCB is 50 x 45 mm in dimensions.
Soldering the Components
Soldering all the components on the PCB was challenging due to the high component density and the variety of package sizes. To streamline the process, all resistors and capacitors were first soldered using a hot-plate reflow method. This allowed the smaller SMD components to settle evenly as the solder paste melted uniformly across the board. The top side, which contains the major ICs and fine-pitch parts, was also soldered using reflow, but this time with a hot-air gun to provide more control over individual components and ensure proper alignment during heating.
After completing the reflow stages on both sides, the remaining through-holes and mechanically sensitive parts, such as buttons, switches, and connectors, were soldered last using a standard soldering iron. This approach prevents heat damage to nearby components and allows precise manual placement where reflow is not ideal. Overall, the combination of hot-plate reflow, hot-air reflow, and manual soldering provided a reliable way to assemble the board despite its complexity.
Testing the PCB
Once the assembly was completed, the PCB underwent a series of basic functional tests to verify that each subsystem was operating correctly. Power tests were performed first to ensure the charging circuit, voltage regulation, and battery connections were stable without overheating or abnormal current draw. Communication interfaces such as I²C, UART, and SPI were then checked to confirm proper response from the RTC, IMU, GPS module, and fuel gauge.
Programming the H‑CUBE
Programming and firmware development were carried out using the Arduino IDE; I initially considered PlatformIO but ultimately chose the Arduino environment for its simplicity and direct integration with the board.
The code begins by including all the necessary libraries for handling the real-time clock, display, IMU, GPS module, preferences storage, and battery fuel gauge. These libraries allow each hardware block to work independently without having to write low-level drivers. After that, all display pins, sensor objects, and communication interfaces such as I²C and UART are defined. The HCMS-2971 LED display is created using its dedicated library so that text can be printed in simple commands.
Next, the code sets up core modules like the RTC, IMU, and GPS. The DS3231 RTC keeps accurate time, while the BMI270 IMU provides step counts. TinyGPS++ is used to read GPS data from the connected module through Serial2. PWM-based RGB LED control is also initialized using the ESP32’s LEDC hardware, so the color can be adjusted smoothly. The buzzer pin is configured for alarms and timer beeps.
A set of buttons (UP, DOWN, and CENTER) serves as the user interface for navigating menus and selecting options. The code also uses the ESP32 Preferences library to save user settings such as RGB color, alarm time, and default timer duration. This ensures that values remain stored even after powering off the watch. The MAX17048 fuel-gauge driver reads battery voltage and state-of-charge so these can be shown in the Battery menu.
To manage all the watch features, the code defines many state variables. These variables track whether the device is in the menu, adjusting brightness, viewing date, using the stopwatch, setting the alarm, running the timer, and more. Each main feature has its own display function, such as showing time, date, steps, GPS coordinates, temperature, or battery level. The stopwatch and timer include their own timing logic to handle start, pause, and reset operations.
The setup() function initializes everything: it starts communication buses, configures pin modes, powers up the display, starts the GPS module, checks the IMU connection, loads saved settings from flash, and prepares all features for use. Once setup is complete, the loop continuously runs the watch interface. The main loop checks button inputs, updates the GPS parser, and activates the correct mode depending on what the user has selected. Each mode is handled separately to keep the interface simple and predictable.
The menu system lets the user switch between different features. Holding the center button opens the menu, while UP and DOWN scroll through options such as Date, Steps, GPS, RGB settings, Alarm, Battery, Timer, and more. Pressing the center button selects an item and switches into that mode. The display is updated through a helper function that formats all text to fit the 8-character LED module.
Finally, the code includes full handling for alarms and the countdown timer. Both use the buzzer to play a sequence of tones, and the user can stop the sound with a button press. Every feature is kept modular, making the firmware easier to maintain and extend.
Downloads
Designing the Case
The designing was done using Fusion 360, while the rendering was carried out in KeyShot and Rhino. The design was inspired by a teenage engineering, minimalistic style that emphasizes clean geometry and strong functional cues.
Design tools
Fusion 360 was used to model all the enclosure parts as separate solid bodies, including the main case, back plate, button caps, and decorative inserts, ensuring everything is dimensionally accurate for PCB and strap integration. KeyShot and Rhino were then used to assign materials, lighting, and environments, which helped visualize the final watch in different colorways such as matte black, brushed metal, and bright accent pieces.
Visual style
The overall look takes cues from teenage engineering’s products, focusing on simple blocks, rounded edges, and precise perforation patterns to keep the surface visually light while remaining robust. The layout of the vented speaker grid, recessed display window, and stepped side details creates a balanced front face that feels retro yet refined rather than overly busy.
Functional detailing
Every exterior feature corresponds to a real interaction: the vent grid aligns with the buzzer/speaker, the side cutouts house the slider and push buttons, and the USB‑C opening is centered to match the PCB connector. The removable top plates and back cover are designed for easy assembly and servicing, with clearances around the PCB, standoffs, and strap interface so the watch can be printed, assembled, and modified without redesigning the core body.
3D Printing and Assembly
3D printing was used to turn the H‑CUBE CAD model into a physical, wearable prototype, with tuned slicer settings to balance surface quality, strength, and print time. The case and inserts were printed separately, then assembled and lightly post‑processed to highlight the two‑tone, retro aesthetic.
Printer and material
For this kind of enclosure, an FDM printer with a 0.4 mm nozzle and PLA filament is ideal because PLA is easy to print, has low warping, and gives crisp detail on small features like perforation holes and button slots. PLA typically prints best with a nozzle temperature around 190–210 °C and a heated bed at 40–60 °C, so those values are a good starting point before fine‑tuning per filament brand.
Core slicer settings
Key slicer parameters were chosen to match the small size of the watch and the need for strong walls around the strap slot. A layer height around 0.16–0.2 mm offers a good compromise between detail and print time for a 0.4 mm nozzle, while 2–3 perimeter walls (about 0.8–1.2 mm total) give the housing enough stiffness without wasting material. An infill of roughly 20–35 % in a grid or gyroid pattern is usually sufficient for non‑load‑bearing electronics enclosures, since most of the strength comes from the outer walls.
Orientation and supports
The main body is best printed with the back face on the bed so that the visible top surface and perforated plate come out smoother and require minimal support removal. Overhangs steeper than about 45° and the recessed display cavity may still need support structures, so enabling automatic supports with a 45° overhang threshold and a low support density makes removal easier and reduces scarring on the visible faces.
Speed, cooling, and adhesion
Moderate print speeds (about 40–60 mm/s for outer walls) help small features like the speaker holes print cleanly and reduce ringing on the sharp edges. A cooling fan set fairly high after the first few layers, combined with proper bed adhesion (clean surface, light glue or tape if needed), keeps PLA from warping and preserves the tight tolerances needed for push‑fit inserts and buttons.
Post‑processing and assembly
After printing, light sanding of the mating faces and corners removes layer lines and helps the silver top plates and orange buttons slide into place with a snug fit. Any residual support material around the strap slot, side sliders, and display window is trimmed away so that the strap feeds cleanly and the mechanical controls move freely without binding.
A Small Demo Video
This video is a short showcase of the custom-built H‑CUBE smartwatch, walking through the main firmware features. The NO GPS is because the video was shot indoors.
Conclusion
Over the past two months, I’ve learned a lot, especially about 4-layer PCB stack-ups, CAD design, impedance control, and matching circuits. It has been a challenging but rewarding journey. Component selection alone took nearly two weeks, as I carefully studied each datasheet to ensure every part was suitable for the design. There were a few mistakes in the initial PCB layout as well, but they were corrected with a bit of creativity and improvisation. The board can definitely be made smaller in the next revision, and there’s room to add more features, such as biosensors for SpO₂ and other health metrics.