Introduction: ATtiny85 Ring Watch

Picture of ATtiny85 Ring Watch

Base on the previous Instructables - ATtiny Watch Core and more, I have made a real gadget, an ATtiny85 Ring Watch.

Step 1: Preparation

Picture of Preparation


Today core subject, ATtiny85. Someone suggest me to use SOIC version to reduce the watch size and I found the coin cell mAh calculation method will count the battery voltage down to 2.0 V, so this watch require a low voltage version MCU to keep it stable. So I have ordered an ATTINY85V-10SU. (much expensive $_$)


Any ISP that can program ATtiny85, this time I am using a Digispark act as a littleWire. (,160.0.h...)


In order to meet the ring size, I choose CR1220, I expect it can last over half an year.


(Quote from previous project) Since the number of IO pins of ATtiny85 is very limited, I design display and further modules should all run in I2C. Power consumption and source availability are also important factors. I choose an OLED screen drive with SSD1306. It can find in 4 different sizes, 64x32 is the smallest one. (another sizes are 128x64, 128x32 and 64x48)

Watch Body

(Quote from previous project) It should be more stylish if make it by wood, but I am lazy one, so just print it out.

Transparent Cover

(Quote from previous project) A small piece of transparent PET plastic plate. It is transparent, provide enough support and very easy to get from many product packing.

Other Parts

  • A SOIC ISP clip for program ATTINY85V-10SU
  • 3 pieces of M2 screws
  • 3 buttons
  • 2 various resistors (more than 1k)
  • coated copper wires
  • thin mental plate for making a tailor-made battery holder
  • a SOP8 to DIP8 board
  • a little piece of multipurpose PC board for building button panel

Step 2: Setup Arduino With ATtiny85, EEPROM and TinyWireM Support


Download Arduino 1.6.5 (1.6.6/7 have known compatible issue - "contains deprecated")

Download ArduinoTiny (if you not familiar with GitHub, simply click Download ZIP button)

Install Arduino

Run Windows installer / copy to Applications folder / simply unzip the file

Locate the Arduino path

If you install with Windows install, it should be:

C:\Program Files\Arduino

If you are using OSX, it should be:


Or any path you unzipped to.

Add ArduinoTiny Support

  1. Unzip
  2. Copy tiny folder to the hardware folder under Arduino path

Add EEPROM support

In Arduino path, copy hardware\arduino\avr\libraries\EEPROM\EEPROM.h to hardware\tiny\avr\cores\tiny folder.

Install TinyWireM Library

  1. Run Arduino
  2. Select Sketch Menu -> Include Library sub-menu -> Manage Libraries...
  3. Search TinyWireM
  4. Select TinyWireM and click Install button
  5. Close Library Manager and close Arduino

Debug TinyWireM

TinyWireM have an know issue but not yet fixed, you can fix it easily:

  1. Locate TinyWireM library path (Windows: "My Documents\Arduino\libraries\TinyWireM"; OSX: "~/Documents/Arduino/libraries/TinyWireM")
  2. Modify "TinyWireM.cpp" line 53, save and close the file


if (USI_BufIdx >= USI_BUF_SIZE) return 0;       // dont blow out the buffer


if (USI_BufIdx >= USI_BUF_SIZE - 1) return 0;       // dont blow out the buffer

Step 3: Download Latest Source Code

Download the latest source code here:

If you are not familiar with GitHub, simply press Download ZIP button.

You may find further details in the following materials:

Step 4: Create Watch Body

Say it again, it should be more stylish if make it by wood, but I am lazy one, so just print it out.

Attached the Sketchup and STL file for reference.


Step 5: Solder MCU

Picture of Solder MCU

This step is not essential, but it can make further solder work and reprogram easily.

Solder SMD reference:

Step 6: Create Tailor-made Button Board

Picture of Create Tailor-made Button Board

In previous project, I use 2 pins to handle 2 buttons input. It is too expensive for using an ATtiny85 IO pin for each input button. This time I try to use 1 IO pin to handle 3 buttons input.

Here is my setting:

set button - GND -> button -> PIN 2 (PB3, ADC3)

up button - GND -> 6.8k resistor -> button -> PIN 2

down button -> GND -> 68k resistor -> button -> PIN 2

Various resistors value should be ok, over 1k is recommended. 3 buttons have different resistor values, so it can use analogRead() function to distinguish which button pressed. I have measured some common resistor analog value for reference.

You may change the threshold value in ATtinyWatch.ino file if you use different resistor.




Step 7: Solder Circult

Picture of Solder Circult

Since the ring watch have a curved surface, it cannot solder all component on a single PC board. MCU, OLED, button panel and battery holder all connected by coated copper wire. VCC and GND coated copper wire should around 6-8 cm and require remove the coating at the middle connect point by sand paper. Other wires are a little bit shorter.

Here is the connection summary:


Pin 2: Button Panel

Pin 4: OLED GND -> Button Panel ->Battery Holder



Pin 8: OLED VCC -> Battery Holder

Step 8: Create Tailor-made Battery Holder

Picture of Create Tailor-made Battery Holder

The ring is small and it can not fit a normal CR1220 battery holder. So we need some thin mental plate to tailor-made a smaller one. My thin mental plate is re-cycling from Dupont line header wastage, you may find other near you.

Cut a short piece of mental plate and solder to a coated copper wire.

Bent it and slot it to the ring body, do it both at positive and negative terminal.

Slot in the battery and test the connective.

Step 9: Program MCU

Picture of Program MCU
  1. Plug your ISP to the computer
  2. Run Arduino
  3. Open ATtinyWatch.ino from unzipped ATtinyWatch folder
  4. Select Tools menu -> Board sub-menu -> select ATtiny85
  5. Select Tools menu -> Clock sub-menu -> select 1 MHz (internal oscillator; BOD disabled)
  6. Select Tools menu -> Programmer sub-menu -> your ISP
  7. Remove CR1220
  8. Connect the SOIC ISP clip to ATtiny85 and press Upload button

ISP -> ATtiny85

MISO -> Pin 6

VCC -> Pin 8

SCK -> Pin 7

MOSI -> Pin 5

RESET -> Pin 1

GND -> Pin 4


If you have SSD1306 screen other than 64x32 resolution, you can change resolution define in ssd1306.h


// custom screen resolution by define SCREEN128X64, SCREEN128X32, SCREEN64X48 or SCREED64X32 (default)
#define SCREEN_128X64 //#define SCREEN_128X32 //#define SCREEN_64X48 // not tested //#define SCREEN_64X32

Other program ATtiny85 reference:

Step 10: Debug Screen

Picture of Debug Screen

Press up or down button while no any date time field selected will enter Debug Screen.

The value means:

Row 1 (I): Watch Dog Timer(WDT) interrupt count, this value will be reset for each set time operation that over 1 hour interval

Row 2 (M): Auto tuned value of micro-second per WDT interrupt, this value will be updated for each set time operation that over 1 hour interval

Row 3 (V): Calibrated value of battery level in millivolt

Row 4 (T): ATtiny85 internal temperature sensor raw value, this value is accumulated last 64 sample values

Step 11: Calibrate Time

Press set button will switch selected Date and time fields, selected field will be highlighted.

Press up and down buttons to change the selected field value. Press set button while highlighting SECOND fields will finished set time operation.

For each set time operation that over 1 hour interval, the micro-second per WDT interrupt value will be auto tuned.

In my experience, holding voltage and temperature condition stable, it should not drift over 1 minute each day after auto tune :P

Step 12: Calibrate Voltage Reference

  1. Comment the #define lines of DEBUG_SCREEN_V and MULTI_METER_VOLTAGE in WDT_time.h
  2. Program the watch
  3. Record the debug screen V reading and multimeter measured voltage
  4. Uncomment and fill the DEBUG_SCREEN_V and MULTI_METER_VOLTAGE reading value
  5. Re-program the watch


#define DEBUG_SCREEN_V 4979 // put your screen reading here

#define MULTI_METER_VOLTAGE 4740 // put your multimeter reading here (in millivolt)

Step 13: Calibrate Temperature Reference

  1. Record the debug screen T reading and real temperature value 2 times in different temperature condition
  2. Uncomment and fill the DEBUG_SCREEN_T_1, TEMPERATURE_1, DEBUG_SCREEN_T_2 and TEMPERATURE_2 values
  3. Re-program the watch


#define DEBUG_SCREEN_T_1  21823L
#define TEMPERATURE_1     52000L
#define DEBUG_SCREEN_T_2  18757L
#define TEMPERATURE_2     12000L

Step 14: Assembly

Picture of Assembly

Slot the OLED screen in the pit and place all the component at the right place.

Step 15: Screw Up

Picture of Screw Up

Assembly the ring and screw up the M2 screws to the ring body.

Step 16: Transparent Cover

Picture of Transparent Cover
  1. Cut a 16 mm width and 82 mm long PET transparent plastic plate
  2. Cut a little bit at 4 corners for easiler slot in
  3. Stick a 1.5 mm width double sided adhesive tape at 2 borders
  4. Slot in the transparent cover to the ring body at one side
  5. Stick the transparent cover to the ring body
  6. Slot in another side

Other transparent cover reference:

Step 17: Happy Time!

Picture of Happy Time!

It's time to show what you have done to everyone!

What's next:

  • Slimmer ring body, as many one knows, SOP8 to DIP8 board is optional and the button panel can be smaller by replacing to SMD one
  • Add other I2C modules
  • Amber sensor to fine tune brighter screen under the sun
  • Research sync time method, GPS, WiFi + internet, BLE + mobile phone and more


MatthewS21 (author)2017-10-10

Hi, This project is awesome! I am having a small issue, though. When I plug in the battery and the watch starts, it continually switches between debug mode and the time mode on the screen, like it loads time mode, then debug mode, then time mode, etc. Any ideas as to what this is caused by and how I can fix it?

陳亮 (author)MatthewS212017-10-10

It should be related to the buttons signal. Try disconnect the buttons (pin 2) and then test again.

fmarkf made it! (author)2017-06-22

Hi! Great job! Thank you for sharing!

I used similar display that I bought here:

It works good, however there are some random pixels on the screen. It seems like code "oled.fill(0x00);" does not actually clean the screen leaving some pixels.

Do you maybe have any idea what to check and how to get rid of these random pixels?

P.S.: I have also noticed that display somehow remembers it's last displayed image after I disconnect and connect power - is it normal.

Thank you!


陳亮 (author)fmarkf2017-10-07

Hi fmarkf, sorry for a late reply. I have just flashback what is the problems, it may caused by this issue:

You should get rip of this after update TinyWireM to latest version. :>

陳亮 (author)fmarkf2017-06-27

Hi, I encountered same problem when the battery drops voltage around 2 V. But I found your display show battery full, I guess this problem may caused by wire contact quality. You may use shorter wire or breadboard to test again.

陳亮 (author)陳亮2017-06-27

and also, in my previous experience, white OLED draw more power then blue OLED.

matthewfelgate (author)2017-03-24

Hi. Nice project! Won't this lose time accuracy very quickly without a RTC or a crystal?

Also how long does the battery last?

陳亮 (author)matthewfelgate2017-03-24

In my latest test, it can last around a month with coin cell and last ten days more with Lipo battery. It may drift around ten seconds within that period after some auto tune.

KevinDesigns (author)2017-02-24

How hard would it be for someone of minimal electrical background to attempt this project? Would I be able to learn how to build this fairly easily from this starting point, or does it require a lot of knowledge for this build? Thanks!

陳亮 (author)KevinDesigns2017-02-25

you may try this first:

SteveMann (author)2016-02-12

Its great to see some wearable computing.

This is a really nice example of the true spirit of wearable computing.

Not another closed-source piece of carceral jailware, but instead a wonderful piece of free-spirited Humanistic Intelligence!

SamG11 (author)SteveMann2016-10-30

Blimey, it's Steve Mann! This guy wandered round in the early 1980s with a little CRT monitor and an aerial stuck to his helmet, with a backpack full of lead-acid batteries and home-made computers stuck to his waist. And this ring probably has more power and a better display than Steve's whole setup.

I remember your early website, Steve. Future's coming along nicely so far eh? At least in some ways.

christherock23 (author)2016-08-18

Where did you buy the 64 X 32 OLED screen? All of the ones im finding only have the flex cable not something i can solder wires to.

陳亮 (author)christherock232016-08-18

something like that:

christherock23 (author)陳亮2016-08-18

Any chance you have a link to a page in english? I cant figure out with button is the buy button.

Zwerg2000 (author)2016-06-25

I've got a question. I'm new in this topic and my english isn't very good: if we/you use an 128x64 oled display the ring would be bigger. So it would be possible to built in more Features and an another Attiny. Things like heartfrequenze, timer,..... if it is possible, would you help me to prepair it?

陳亮 (author)Zwerg20002016-06-26

Hi, this instructables just show how small a DIY Arduino watch can be. Actually, more feature isn't constrained by the screen size but the program size limit. 64x32 can show 4 rows information with 8 pixels height font, and you can also use function button to switch displaying details.

this is so cool

nqtronix (author)2016-03-01

I've just seen this in the atmel newsletter! Congratulations! :D

kengamine (author)2016-02-29

how complex, but really impressive

RICKAKRON (author)2016-02-23

What is that black clip called used to program the

ATtiny85? I want one.

陳亮 (author)RICKAKRON2016-02-23

try google "soic isp clip"

arpimatic_lab (author)2016-02-17


DoctorWizard (author)2016-02-16

I think this could be a marketable product! Keep working on shrinking it down and perfecting it.

Jfieldcap (author)2016-02-15

Ahah! I suppose I should have know this would have been coming soon! Now I might have to make it myself to see how much I can shrink it down... The screen and battery probably will be where most of the size is accumulated, I wonder if there's a smaller IC2 compatible OLED display. Then, a smaller/slimmer battery wouldn't be too hard to find, but you'd sacrifice battery life. What about a small solar panel to charge it? Then I suppose you could have a much smaller rechargeable battery, and since the person would be wearing it on their hand most of the time, it should get a decent amount of sunlight. And then, what about a more powerful MCU? If you managed to fit an ATMEGA chip and a accelerometer/gyro, then you'd almost have an apple watch, and you could even make a game or two using the LCD, maybe a fitness tracker, save battery by sensing when the person isn't looking at the watch, ect. Lots of possibilities!

陳亮 (author)Jfieldcap2016-02-16

Great! looking forward for your work!

I have further imagination: I can find a 18mmX38mm thin bendable OLED; some MCU that contain RTC inside; finger skin can measure more accurate heart rate than arm skin...

Jfieldcap (author)陳亮2016-02-16

Yeah, if you could find some sort of integrated MCU with a gyro and RTC, that would be perfect. And yes, a bendable OLED would be pretty awesome. You could make a bendable circuit board, but it would have it's limits, seeing as the components wouldn't be able to bend, but I think it could still save some space.

nikarlo (author)2016-02-15

I'm looking for a 64x32 Oled, but I can't find it. Any suggestion?

陳亮 (author)nikarlo2016-02-16

The one I buy is out of stock, seems remain this one.

nikarlo (author)陳亮2016-02-16


Newark CA Locksmith (author)2016-02-16

great nice work

plctim (author)2016-02-14

Unique and so sweet. A++.

ohoilett (author)2016-02-14

This is awesome. Good job.

Niaz morshed (author)2016-02-14

can i use attiny85 20su ?? and oled128*64???

do i need to change code??

by the way great instructable :) looking forward to make mine :)

陳亮 (author)Niaz morshed2016-02-14

Yes, it is compatible. You can find how to change the screen resolution at step 9.

killerjobean (author)2016-02-14

I'd like to buy one of these!

Tech Works (author)2016-02-12

Great Idea.. But where to buy all the items.. I want to build it.

陳亮 (author)Tech Works2016-02-12

try / /

Tech Works (author)陳亮2016-02-13


le-Sid (author)2016-02-13

Wow, Awesome job! Very detailed. Keep up the good work!!-

deba168 (author)2016-02-12

Wow !

Nice work.Thanks for sharing.

pinheadBE (author)2016-02-12

Really impressive! Congratulations!

One suggestion to make things even smaller: use smaller tactile switches, such as these ones (3x6mm, half the size of the common 6x6mm you used here)

Onyx Ibex (author)2016-02-12

Well done getting it down to such a small form factor!

nqtronix (author)2016-02-11

Cool project and nice execution!

I've planned something similiar, a bracelet featuaring the 128x32px version of the display. I wanted to make mine rechargable, so I go the smallest lipos (301015) I could find. They're about 17x10x3mm including protection circuit and have a (claimed) capacity of 25mAh. I had to order them in a pack of 10, so I got plenty of spare parts. If you want one just drop me a PM :)

Looking forward to your project nqtronix :)

I'm afraid that it'll take a while, please be patient :)

陳亮 (author)nqtronix2016-02-12

time doesn't matter, I have try near 1 year

陳亮 (author)nqtronix2016-02-11

thx, but I am afraid it is too expensive to delivery lipos to Hong Kong.

MattsInstructables (author)2016-02-12

Very nice project,
I have enjoyed your work using these small displays.
Keep up the good work :)

xberger (author)2016-02-12

Hello, where did you buy your OLED display ?

About This Instructable




Bio: Do it yourself if you cannot buy one!
More by 陳亮:Circuit VisualizationNanoblock McDonald's FriesFlapping Paper Plane (Print Version)
Add instructable to: