Picture of Make your own smart watch

This document is also translated in Polish(by Sebastian), Korean language.

Most IT companies participate in the race to grab people’s wrist. A smart watch becomes the most significant item in a wearable device category. You can easily find this mood in this link, there are tons of smart watches.

But here is a simple way to evaluate smart watch’s future on your own. Make it! With Arduino micro-processor and Android, I made a simple smart watch and named it “Retro Watch“. You can do this too!

Retro Watch is an open source project to let you make a smart watch based on Arduino and Android. This text explains about modules, blueprints, how to install and use the Arduino and the Android source codes step by step.

Remove these adsRemove these ads by Signing Up

Step 1: Overall Structure

Picture of Overall Structure

RetroWatch is a simple system that is used a hardware platform called Arduino, which is intended for artists, designers, and hobbyst, and an Android app. The overall structure is in the picture above.

Imagine a very small computer that you can wear on your wrist. Arduino board is a micro-processor and a storage, and there’s only one input method : a button. Bluetooth is to communicate with other devices, and the battery would be necessary for power. I’ll install an Android app for collecting or editing various RSS and system information and for notification on the Android device.

Step 2: Preparing for RetroWatch

Picture of Preparing for RetroWatch

You need to prepare modules as small as possible to wear the watch on your wrist. There may be tons of variations, but I chose parts that are commonly used and inexpensive.


Hardware parts for smart watch

Arduino micro-controller

I chose the smallest Arduino, Pro mini. Arduino Pro mini is a light version of UNO R3. It doesn’t have a USB interface chip in order to reduce the price and the size. There are two version depending on the operating voltage(3.3v/5v). And I used a 3.3v version, because the bluetooth and display that are connected with the board support 3.3v and the board goes well with the 3.7v LiPo battery. It runs at 8MHz and a 5v version at 16MHz, but 8MHz is enough. Overall, all you need to prepare are Arduino Pro Mini 3.3v and USB to UART module.

The main chip of the board, ATmega328, has only 2KBytes RAM, but ATmega128 has just 1KBytes, which is very limited to run my system. Most boards have ATmega328, but you have to make sure.


One of most common bluetooth modules that you can get are HC-06 main module and the one with interface base board. The latter one has a reset button, the status LED, and it supports both operation voltage(3,3v/5v), so this one is more convenient but the size is rather big, the LED, which is not quite necessary drains the battery and a little more expensive. So I used a HC-06 without the interface board.

To make a SMART WATCH, it would be necessary to find a small, low-power display. I’d given lots of thoughts, then I chose -.96’’ OLED Display. There are various sizes of the displays(0.96’’, 1.3’’, etc), it works on low-power, English font and the image out available, and it supports I2C, SPI, which makes easy to connect with Arduino.

I use LiPo(Lithum-Polymer) battery in this project. 1-cell LiPo battery flows out current in 3.7v, which works perfectly with Arduino Pro mini, and there are many kind of batteries in terms of the size and the capacity. The most ideal battery depends on what size of watch you want to make. I recommend the battery with protection circuit(overcharging, over-discharging safe), and it’s better if it has a removable socket. It might helpful for you if you get a female socket and USB or DC adaptor recharger.

You need wires, soldering iron, a switch and 10K ohm resistance(for a button), and a batter jack. It would be helpful for you to prepare the assembly manual.

Preparing for Android
Android v.4.3 supports the service that is used to get notification information from an app. So RetroWatch app is based on Android v.4.3 to enable notification service. For users who don’t use Android v.4.3 yet, the app without this function is released also. You can download the sources at GitHub, or download the app from Google Play Store. (Search with “RetroWatch” or “RetroWatch LE“)

Step 3: Assembling the watch

Picture of Assembling the watch

Folks who are accustomed to handling Arduino or physical computing would proceed this procedure, but I recommend the others not to assemble Arduino Pro mini board first, but try to make the watch with the board that is easy to connect and use like UNO board. The assembly structure for RetroWatch is here.

# Bluetooth-> Arduino :

  • VCC -> 3.3V
  • GND -> GND
  • TX -> D2
  • RX -> D3

# OLED -> Arduino :

  • GND -> GND
  • VCC -> VCC
  • SDA -> A4(the analog 4th pin)
  • SCL -> A5(the analog 5th pin),

# Button :

You may connect with a button which is small enough for the smart watch and a 10k-ohm resistance. Refer to the picture attached.

# Battery : You can simply connect battery by connecting (+) -> RAW, GND -> GND. You need to put (+) line to RAW pin in case you use any sort of external power supply, such as an external battery, on Arduino Pro mini board. Otherwise, it can damage the board.

# USB to UART module -> Arduino :

  • 3.3V -> VCC
  • TXD -> RXD
  • RXD -> TXD
  • GND -> GND

Step 4: Compile Arduino source for watch and upload.

Picture of Compile Arduino source for watch and upload.

You can download RetroWatch Arduino source on the source tab on the GitHub.

GitHub – RetroWatch project page

And you need to do something before you complie the source code.


# Install graphics driver
You need a graphic library to draw images, shapes, fonts on the OLED. In order to use it, you must install Adafruit_SSD1306, Adafruit-GFX-Library.

(According to your development environment, Adafruit library conflicts with Robot_xxx library. In this case, backup and delete Robot_xxx libraries from arduino library folder.)

# Copying the bitmap image header

You must copy the header file that contains bitmap images to load and use them. You should copy bitmap.h in RetroWatchArduino folder to /Arduino install folder/Arduino/hardware/libraries/RetroWatch. If there’s no such folder, simply make it.

# Modifying the source

Open Arduino IDE and load RetroWtchArduino.ino. Next, set pin numbers that you used when you connect the watch. It’s not necessary to modify if you use Arduino pins that are used in this instruction. But if you didn’t, you need to modify the source codes below.

SoftwareSerialBTSerial(2,3); // Input your TX, RX pin numbers

int buttonPin = 5; // Input your button pin number

display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // Replace Ox3D with your I2C address

# Compile / Upload

If you follow the instruction well, you need to compile the source code. If this procedure fails, you have to check the error message and what went wrong so far.

If upload is completed, the RetroWatch Arduino logo and the Adafruit logo(the OLED manufacturer) have to be display on the OLED. After the logo phase passes and time shows up “00:00″, the initialization perfectly succeeds.

Now, it’s time to check the Bluetooth. Turn on the Bluetooth on your phone(Setting > Bluetooth). Your phone starts to search Bluetooth devices nearby, and the Bluetooth module should show. Once the Bluetooth module shows, you may proceed the pairing phase, and the two devices connect after putting 4-digit password (in my case, default 1234).

Step 5: Android app install & source download

Picture of Android app install & source download

It’s too big to demostrate how to compile and modify the android source. FYI, check /RetroWatch_Android/RetroWatch folder in the source downloaded from GitHub. I registered this app to Play Store, so go download it(search ‘RetroWatch’ or 'RetroWatch LE').

Follow the instruction as below and check the operation of RetroWatch.

If you install the app, turn on the bluetooth first(Setting > Bluetooth) and pair with the module. Next, start RetroWatch app. Choose the second menu(Notification access) on the top and grant RetroWatch the authorization for Notification. Choose the first menu(Choose the device) in the action bar and select the Arduino board that is already paired. If you can’t find it, check the power and the bluetooth module. Or choose ‘device scan’ menu to scan manually.

If the connection is succeeded, you may see “Connected” in connectivity display area at the bottom. Touch the action bar menu(…) and choose ‘Data transfer to Watch’. This menu transfer the data to display time and messages by Bluetooth. If the Bluetooth module works fine with the Arduino board, time information changes to current time. The Bluetooth connection is OK, but time doesn’t display, check the connection between TX, RX. Now, it’s time to have fun with MY OWN SMART WATCH!!! Pictures show the progress so far.

Step 6: RetroWatch Arduino

Picture of RetroWatch Arduino

RetroWatch changes mode in a circle as below.

Initial display:
The phase which the logo shows up when the watch boots.

Clock display:
The basic display which tells you time. You can change the style of the clock in the Android app. Analog, Digital, Mixed styles are supported so far. If you push the button, the display changes to the Emergency message display. It changes to the idle mode in case there’s no data update for 10 minutes.

Emergency message display:
The display that shows when users push the button in the watch display or a new emergency message is updated. If users push the button again or 10 seconds passes, the next message is shown. The display changes to a the normal message display after every emergency message shows.

Normal message display:
The display that shows after emergency message ends or users push the button. The next message shows up when users push the botton or after 5 seconds. The display changes to the clock when the last message shows.

Idle display:
The display that is shown if there’s no data push during 10 minutes. It displays Indicator and time(hh:mm) the display update interval changes to run at minimum power consumption. If you push the button or get a new message, the display changes to the clock display.

RetroWatch module has these features.

Three emergency messages can be stored. The message that the watch is already received is deleted if the messages are over 3. It can’t store lots of data due to memory shortage(2KB RAM).

Normal message stores up to 7. Like emergency messages, the first messages are deleted when the received messages reach to the maximum.

You can change the clock style as you want. Or you can even make your own clock style by altering the source code.

There are 65 icons so the Android app can use them. You can also add your own icons.(need to compile Arduino code)

You can choose whether the indicator would be shown or not in the app.

The internal battery is 140mAh, so the battery time is about 7 hrs at a normal status. I guess the battery time would be longer if I fix the source code for battery save.

Step 7: RetroWatch Android app.

Picture of RetroWatch Android app.

The performance of RetroWatch itself is limited, but I prepared some features to show various of data. The biggest feature is filtering messages sent to the watch. And I put an RSS feed feature to use data from different kind of areas. Try each feature by switching 4 tabs.

Message list tab :

Messages are the information collected from the app. Every message is inactivated except for emergency messages. Inactivated messages are not sent. You can change the status by filtering. By touching each message, you can enable each message or messages from same package.

Filter setting tab:

The RetroWatch app controls every single information by filtering. You can add, fix, and delete filters in this tab. You can change strings of messages(ex. change language Korean -> English since it supports English only), delete messages not to show, or just activate them without a string modification.

RSS tab:

You can register and monitor RSS feeds. The watch can show lots of information by RSS feeds. For instance, if you add a weather RSS and modify strings to filter, you can receive the weather alarm from the watch!!! You can easily search RSS feeds from the web site which I made and add them to the app.(Sorry, it's written in Korean now)

Watch control tab:

You are able to alter styles of the app and watch. If you put your Gmail account here, unread messages are registered in a message list. You can change the clock style and time display indicator to show(Display interval is already set because of power saving, the change applies at interval).



The RetroWatch app collects three kinds of data.


A notification that is registered in the Andriod indicator bar. App uses the Notification service to collect notifications, only over Android 4.3 supports this feature. Please download RetroWatch LE app for other android version. LE app doesn’t have the notification collection feature.

System info:

The system info of the phone such as battery status, RF(LTE, 3G) connection status, WiFi status, recharging progress is collected in the watch. In addition, if you register a Gmail account, it counts unread e-mails.

RSS feed:

If you set RSS title and URL, it periodically read RSS data.


Here are the other minor features.

Messages are sent in two kinds – emergency message, normal message. But users cannot modify them. You can set icon that shows on the watch when it filters messages. You can use 65 icons. All information is updated to the watch every 30 minutes.The RetroWatch service runs in background even if you shut the app.

Need more details about how to use app? See this link: Retro Watch app quick guide.

Step 8: Packaging

Picture of Packaging

RetroWatch Android, Arduino module is done, and if there’s no problem to operate, you need to pack the watch. Make a package as you want.

RetroWatch Specifications:

  • Processor : ATmega328 – 3.3v(8MHz)
  • 32KB Flash (2KB is shared for Bootloader)
  • 2KB RAM
  • Size : Width x Height x Depth = 34mm x 32mm x 12mm (Not packaged)
  • Battery : LiPo 140mAh (idle time 6-7hrs, 1-2hrs for recharging)
  • Connecting with Android app
  • Supports notification, system info, RSS feed
  • Message filtering
  • Open source
  • Hard-case file for 3D printer -> Download here!!

Step 9: Working demo and epilogue

Picture of Working demo and epilogue

You can feel how fascinating and powerful the open source and the open hardware are through this project. The idea comes true even though you are not professional because hardware is getting inexpensive and numbers of people shares source codes and know-how. Let’s try!!!

You can see the working demo at: YouTube link.

More specific how-to document at : RetroWatch project

Download sources at : GitHub RetroWatch page

Retro Watch app quick guide

Hard-case file for 3D printer

RetroWatch Android is based on Apache license, RetroWatch Arduino follows GPL v3.0.

Special thanks to Chang-Han Jeon and Kyung-Rae Park. Jeon translated this text in English and Park made a case for RetroWatch with his 3D printer.

1-40 of 374Next »


I am getting this error when I try compile the arduino code.

Any help would be much appreciated.


This report would have more information with

"Show verbose output during compilation"

enabled in File > Preferences.

Arduino: 1.0.6 (Mac OS X), Board: "Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328"

RetroWatchArduino.ino:36:20: error: bitmap.h: No such file or directory

RetroWatchArduino.ino: In function 'void drawIndicator()':

RetroWatchArduino:670: error: 'IMG_indicator_msg' was not declared in this scope

RetroWatchArduino:679: error: 'IMG_indicator_emg' was not declared in this scope

RetroWatchArduino.ino: In function 'void drawStartUp()':

RetroWatchArduino:693: error: 'IMG_logo_24x24' was not declared in this scope

RetroWatchArduino.ino: In function 'void drawEmergency()':

RetroWatchArduino:719: error: 'ICON_ARRAY_SIZE' was not declared in this scope

RetroWatchArduino.ino: In function 'void drawMessage()':

RetroWatchArduino:745: error: 'ICON_ARRAY_SIZE' was not declared in this scope

RetroWatchArduino.ino: In function 'void drawIcon(int, int, int)':

RetroWatchArduino:892: error: 'ICON_ARRAY_SIZE' was not declared in this scope

RetroWatchArduino:895: error: 'bitmap_array' was not declared in this scope

AdityaB17 days ago

Does this smartwatch have ability to process a voice input?

I have an idea for my final project about using that voice input feature on smartwatch to be an input for moving something. In my case, i use the voice input to move a 6 legged robot. Are those ideas possible?

GodsTale (author)  AdityaB12 days ago

Arduino is not good solution for multimedia processing.

i upgraded arduino IDE to 1.0.5 to latest 1.0.6 but it shows error like

this in provided program that

RetroWatchArduino.ino: In function ‘void drawEmergency()’:

RetroWatchArduino:717: error: ‘ICON_ARRAY_SIZE’ was not declared in this scope

RetroWatchArduino.ino: In function ‘void drawMessage()’:

RetroWatchArduino:743: error: ‘ICON_ARRAY_SIZE’ was not declared in this scope

RetroWatchArduino.ino: In function ‘void drawIcon(int, int, int)’:

RetroWatchArduino:890: error: ‘ICON_ARRAY_SIZE’ was not declared in this scope

i think that variable ICON_ARRAY_SIZE is variable that is not defined .

where it could be a mistake..

i can put value by programming but i dont know what is that value of ICON_ARRAY_SIZE..

thank you

Screenshot from 2014-12-13 10:49:40.png
Mobsy1 month ago

Awesome tutorial GodsTale!

I'm trying to assemble it, but I'm having an issue: The OLED screen it's not turning on.

I'm using this screen:

I've arrange the wires exactly as the diagram (the only change is that SDA went to Data and SCL to Clk)

I've upladed the code to the arduino pro mini 3,3v 8Mhz

I've changed the I2C address in the code: (because the screen is 128x64)

display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64)

But I'm not getting any output in the screen.

Do you have any idea, how to solve this?

Thank you!

GodsTale (author)  Mobsy1 month ago

Hello, Mobsy.

Before making watch, please test OLED display with Arduino and Adafruit library test code. This may inform you what is the problem.

i am having the same problem, the OLED isn't turning on,
MCU is programmed and everything is connected as it should be,
i even see HC-06 module on my phone bluetooth search,

OLED bought from china

Maybe its not compatible with Adafruit? how do i check that?

GodsTale (author)  amir_zohaib27 days ago

Ask to seller that what kind of display driver does your OLED use. OLED I had used has SSD1306 and supports Adafruit library.

Sometimes cheap OLED doesn't have driver in it. Check this also.

the OLED is based on SSD1306 Chip, they have provided documentation but in chinese, i am guessing that it has something to do with the address, i have tried 0X3C and 0X3D what else could i try? it is a 0.96OLED

GodsTale (author)  amir_zohaib9 days ago

Did you try with the Adafruit SSD1306 library? If this doesn't work, try with u8glib.

But in this case you must modify all the graphical function to adapt with u8glib.

Maybe i need to use the reset pin ? how do i check if an OLED is compatible with Adafruit library (i dont want to buy from them because it is very expensive)

HI GodsTale!!

first of all i would like to congratulate you for made such kind of awesome project..

am first of all trying to verify your given Retrosmartwatch.ino code
into arduino ..but, unfortunately it shows error ICON_ARRAY_SIZE not
declared many times.

and other many errors .(you can see in below image)

I am new to arduino but loves to making new hardware projects.I am using ubuntu 14.04 LTS OS.

Do you have any idea, how to fix this errors?

Thank you!

Screenshot from 2014-12-10 21:16:34.png
GodsTale (author)  vçhàùgùlè9 days ago

I dont know what makes this kind of problem. It may be caused by the arduino IDE version (especially GCC version). Please refer below link and update(or downgrade) gcc/arduino IDE version.

ramk714 days ago

i am just trying to make it but i want to add the micro sd card also so that i can save my notifications in it so could you please help me out , i jst wanted to know the coding


GodsTale (author)  ramk79 days ago

If notifications you want to save is not bigger than 1K, use EEPROM instead. In this case you don't need additional SD card module.

TylerYancey25 days ago

Hi I have been having difficulty trying to get my OLED display to turn on after hooking everything up. It is a ( Blue 0.96 inch I2c TWI serial 128x64 OLED display module) I have tested it using the adadfruit library for (ssd1306 128x64 I2C) I was able to get it to work by changing the (display.begin to 0x3c ) However with the smart watch code it does not display any images. Any help will be greatly appreciated.

GodsTale (author)  TylerYancey22 days ago

Compare setup code of Adafruit example with RetroWatch's. I think you would find something different between them.

TylerYancey25 days ago

Hello after some tweaking with my wiring I was able to get the display up and running along with the Bluetooth pairing. My problem that I currently have is that my screen with boot to the Retrowatch arduino v1.0 but from there will not continue to the clock like it should. what can I do to fix this problem? Any help will be appreciated.

GodsTale (author)  TylerYancey23 days ago

Did you have wired up the button? If not, disable the button code.

if(digitalRead(buttonPin) == LOW) isClicked = LOW;

change this into:

isClicked = LOW;

nicogig28 days ago

Hi everybody,

I was trying to to this project, but I mistakenly bought this screen:

It is I2C and has the same 128x64 resolution of an Adafruit screen, but has a SH1106 driver. From some research, it appears that it's very similar to the SSD1306 driver. Will this project work without any rewriting, or I'll need to rewrite it in order to make it work on this screen?

GodsTale (author)  nicogig27 days ago

Unfortunately you have to rewrite every graphical functions.

creator451 month ago

hi there i have this screen --->

but i cant understand how to connect it to the arduino uno and change the code

awsome project

tcuc creator451 month ago

looks like it's basically the same as mine, it supports SPI, not I2C.
check out this, it might clear things up:

if you install the adafruit libraries, wire up your screen in SPI like in the link, then open your Arduino IDE, click: file, sketchbook, libraries, ADAffruit_SSD1306, and ssd1306_128x64_spi

then just upload that code to your Arduino and your screen should display test images.

creator45 tcuc1 month ago

i have connected the screen and upload this code -->

and it works

also ssd1306 works

but with the smartwatch code doesnt

what to do

GodsTale (author)  creator451 month ago

Please show me how you connect the SPI interface OLED to Arduino. How to modify watch code for SPI OLED is at below comment.

the screen boots to the clock like your video but when.insend from app doesnt do anything //i tried on uno chegne the code for bt serial fron 2,3 to A0 A1 ?
GodsTale (author)  creator4527 days ago

I'm using D2, D3 pins for BT module with SoftwareSerial. Change this as you wish.

SoftwareSerial BTSerial(2, 3); // change this if your settings are different

One more thing. Did you connect a button to D5?? If not, display stop at clock screen and doesn't show anything else. To avoid this, enable internal pull-up on D5 or disable button code.(keep it always HIGH, HIGH means there's no button input)

yeahh!! i notice that with the button ,after installing it everything works perfect thanks!!!

tcuc creator451 month ago

i have the same problem, it's because the smartwatch code assumes your screen is wired for I2C communication, and my screen(as well as yours) doesn't support I2C as far as i know.

i looked arround dx and found this, it seems to be able to run via I2C.

i already ordered a new screen that supports I2C, but i'll update you if i find a way to change the code to run with a SPI screen.

creator45 tcuc1 month ago

i think the code can also run for our screens

from dx this screen should also work

GodsTale (author)  creator451 month ago

Because I dont have SPI interface OLED, I cannot test. Please fix codes like below and notify me.


#define OLED_RESET 8

Adafruit_SSD1306 display(OLED_RESET);

== change like below ==>

// If using software SPI (the default case):

#define OLED_MOSI 9

#define OLED_CLK 10

#define OLED_DC 11

#define OLED_CS 12

#define OLED_RESET 13



display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // initialize with the I2C addr 0x3D (for the 128x64)

== change like below ==>



it's working very good,thanks !!!!!

tcuc creator4528 days ago

what does your code look like now?

I'm just getting into
Arduino programming. having a hard time finding where to add the new
lines and what i would have to remove/comment out.

creator45 tcuc28 days ago

i get it working perfectly just godstale said ,this changes you have to make :



#define OLED_RESET 8

Adafruit_SSD1306 display(OLED_RESET);

== change like below ==>


#define OLED_MOSI 9

#define OLED_CLK 10

#define OLED_DC 11

#define OLED_CS 12

#define OLED_RESET 13




display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // initialize with the I2C addr 0x3D (for the 128x64)

== change like below ==>




tcuc creator4527 days ago

Thanks, it boots now, but i have massive sync errors, and it doesn't seem to receive information from the RetroWatch app. i have tried "send data to watch", rebooting, adding/removing filters but no luck.

creator45 tcuc28 days ago

if you still doesnt get it ask to uplaod the working code

it's working very good,thanks !!!!!

amir_zohaib28 days ago

getting this error.
stk500_getsync(): not in sync resp=0x30

avrdude stk500_getsync(): not in sync resp=0x00 <--- 00 was my problem, i wasn't pressing the reset button at the right time, i dont have an auto reset USB to Serial,, no DTR pin, so i was looking everywhere for the right reset method,some said keep holding it untill it shows upload, some said press once right before upload, nothing worked, but somewhere i found that if i turn on verbose output (file-> verbose) then it shows

Using Port : \\.\COM14

Using Programmer : arduino

Overriding Baud Rate : 57600

avrdude: Send: 0 [30] [20]

avrdude: Send: 0 [30] [20] <---"NOW!!" press the reset once, and hard

avrdude: Send: 0 [30] [20]

because it only sends a few such lines and waits for reset, after that it gives a sync error

certeza29 days ago

I got errors after uploading the program to arduino, it was running out of memory. So I reduced the number of messages MSG_COUNT_MAX to 4. If you need even more memory you can reduce the serial buffer to 32 bytes or less, and replace statements like display.print(":") by display.print(F(":"));

1-40 of 374Next »