How to Make a Arduino Smart Watch

This guide walks you through how to make an Arduino smart watch from scratch using affordable components and open-source code. You’ll learn to assemble the hardware, upload firmware, and customize features like time, notifications, and sensors.

Key Takeaways

  • Affordable DIY Project: Build a functional smart watch for under $50 using common Arduino-compatible parts.
  • Beginner-Friendly: No advanced soldering or coding skills required—perfect for hobbyists and students.
  • Customizable Features: Add real-time clock, Bluetooth, heart rate monitoring, or step counting with modular code.
  • Learn Core Electronics: Gain hands-on experience with microcontrollers, sensors, and power management.
  • Rechargeable Battery Powered: Includes guidance on safe LiPo battery integration and charging circuits.
  • Open-Source Code: Use and modify free Arduino libraries to personalize your smart watch interface.
  • Wearable Design Tips: Learn how to 3D print or modify a case for comfort and durability.

Introduction: Why Build Your Own Arduino Smart Watch?

Have you ever wanted a smart watch that does exactly what you want—without the bloatware, high price tag, or privacy concerns? Building your own Arduino smart watch is not only possible, but it’s also a fun and educational project that puts you in full control. Whether you’re a student, maker, or tech enthusiast, this guide will show you how to create a fully functional wearable device using the popular Arduino platform.

Unlike commercial smart watches, your DIY version can be tailored to your needs. Want a minimalist design that shows only the time and date? Done. Prefer to add heart rate monitoring, step tracking, or Bluetooth notifications? You can do that too. With Arduino’s open-source ecosystem, the possibilities are endless.

In this comprehensive guide, you’ll learn how to select the right components, assemble the circuit, write and upload code, and even design a wearable case. By the end, you’ll have a working smart watch that you built yourself—and the knowledge to improve it over time.

What You’ll Need: Components and Tools

Before we dive into the build, let’s gather all the necessary parts. Most of these components are widely available and affordable, often found in Arduino starter kits or on platforms like Amazon, Adafruit, or AliExpress.

How to Make a Arduino Smart Watch

Visual guide about How to Make a Arduino Smart Watch

Image source: technoreview85.com

Essential Components

  • Arduino Pro Mini (3.3V, 8MHz): This compact board is ideal for wearables due to its small size and low power consumption. Make sure to get the 3.3V version to match other components.
  • OLED Display (0.96” I2C): A tiny screen that shows time, text, and simple graphics. I2C communication reduces wiring complexity.
  • Real-Time Clock (RTC) Module (DS3231): Keeps accurate time even when the watch is powered off. Essential for a functional smart watch.
  • Lithium Polymer (LiPo) Battery (3.7V, 150–300mAh): Provides portable power. Choose a small, flat battery that fits comfortably on your wrist.
  • LiPo Charging Module (TP4056): Safely charges the battery via USB. Prevents overcharging and extends battery life.
  • Push Buttons (2–3): Used for navigation—setting time, switching modes, or activating features.
  • Breadboard and Jumper Wires: For prototyping and testing before final assembly.
  • Resistors (10kΩ): Used for pull-down circuits on buttons.
  • Optional: Bluetooth Module (HC-05 or HC-06): Enables wireless communication with your phone for notifications.
  • Optional: Heart Rate Sensor (MAX30102): Adds biometric monitoring capabilities.

Tools Required

  • Soldering iron and solder
  • Wire strippers and cutters
  • Multimeter (for testing connections)
  • Hot glue gun or epoxy (for securing components)
  • 3D printer or pre-made watch case (optional, for housing)
  • Computer with Arduino IDE installed

Step 1: Setting Up the Arduino IDE

To program your Arduino smart watch, you’ll need the Arduino Integrated Development Environment (IDE). This free software lets you write, compile, and upload code to your board.

Download and Install Arduino IDE

  1. Go to the official Arduino website: arduino.cc/en/software
  2. Download the version compatible with your operating system (Windows, macOS, or Linux).
  3. Install the software by following the on-screen instructions.

Install Required Libraries

Your smart watch will rely on several libraries to control the display, RTC, and sensors. Here’s how to install them:

  1. Open the Arduino IDE.
  2. Go to Sketch > Include Library > Manage Libraries.
  3. Search for and install the following:
    • Adafruit SSD1306: For OLED display control.
    • Adafruit GFX: Graphics library for drawing shapes and text.
    • RTClib: For interfacing with the DS3231 RTC module.
    • Wire: Built-in library for I2C communication (usually pre-installed).

Select the Correct Board and Port

  1. In the IDE, go to Tools > Board > Arduino AVR Boards > Arduino Pro or Pro Mini.
  2. Set the processor to ATmega328P (3.3V, 8MHz).
  3. Connect your Arduino Pro Mini to your computer using an FTDI programmer or USB-to-Serial adapter.
  4. Go to Tools > Port and select the correct COM port (Windows) or /dev/tty device (macOS/Linux).

Step 2: Wiring the Circuit

Now it’s time to connect all the components. We’ll start with a breadboard prototype to test everything before soldering.

Connect the OLED Display

The OLED display uses I2C communication, which requires only four wires:

  • VCC → 3.3V on Arduino
  • GND → GND
  • SCL → A5 (or SCL pin)
  • SDA → A4 (or SDA pin)

Double-check the pin labels on your display—some boards reverse SDA and SCL.

Wire the Real-Time Clock (DS3231)

The DS3231 also uses I2C, so it shares the same SDA and SCL lines:

  • VCC → 3.3V
  • GND → GND
  • SCL → A5
  • SDA → A4

This daisy-chaining is possible because I2C supports multiple devices on the same bus.

Add Push Buttons

Use two or three buttons for basic navigation:

  • Connect one side of each button to GND.
  • Connect the other side to a digital pin (e.g., D2, D3, D4).
  • Add a 10kΩ pull-down resistor between the digital pin and GND to prevent floating signals.

When the button is pressed, the pin reads HIGH; otherwise, it reads LOW.

Power the System with LiPo Battery

The LiPo battery connects to the charging module:

  • Battery + → B+ on TP4056
  • Battery – → B–
  • OUT+ → RAW on Arduino Pro Mini
  • OUT– → GND

The TP4056 module regulates the voltage and protects against overcharging. Never connect the battery directly to the Arduino without a charging circuit.

Optional: Add Bluetooth (HC-05)

If you want smartphone connectivity:

  • VCC → 3.3V (not 5V—HC-05 is 3.3V tolerant)
  • GND → GND
  • TX → RX (D0) on Arduino
  • RX → TX (D1) (use a voltage divider if needed)

Note: Disconnect TX/RX when uploading code to avoid conflicts.

Step 3: Writing the Arduino Code

Now let’s write the firmware that brings your smart watch to life. We’ll start with a basic version that displays the time and responds to button presses.

Basic Code Structure

Here’s a simplified version of the code. You can expand it later with more features.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

RTC_DS3231 rtc;

const int buttonPin = 2;
int buttonState = 0;
int lastButtonState = 0;

void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED failed");
for(;;);
}
display.display();
delay(2000);
display.clearDisplay();

if (!rtc.begin()) {
Serial.println("RTC failed");
while (1);
}

pinMode(buttonPin, INPUT);
}

void loop() {
DateTime now = rtc.now();

display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Time: ");
display.print(now.hour(), DEC);
display.print(":");
display.print(now.minute(), DEC);
display.print(":");
display.println(now.second(), DEC);

display.print("Date: ");
display.print(now.day(), DEC);
display.print("/");
display.print(now.month(), DEC);
display.print("/");
display.println(now.year(), DEC);

buttonState = digitalRead(buttonPin);
if (buttonState != lastButtonState) {
if (buttonState