DIY Digital Wristwatch


The main incentive behind this project was to see how much I could cram, in terms of both hardware and software, into a wristwatch-like device that is no larger than the display itself. An OLED display was chosen for being only 1.5mm thick and not requiring a backlight (each pixel produces its own light), but mostly because they look cool. The watch was originally going to have a 0.96″ display, but this proved too difficult to get all the things I wanted underneath it. Going up a size to 1.3″ was perfect.



Wristwatch schematic

Wristwatch schematic

On the hardware side the watch contains an Atmel ATmega328P microcontroller, 2.5V regulator, Maxim DS3231M RTC, 1.3″ 128×64 monochrome OLED, 2 LEDs (red and green), a buzzer sounder, 3 way switch for navigation, powered by a 150mAh LiPo battery which can be charged via USB and 2 PCBs (though one PCB is just used as a raiser for the OLED).

The ATmega328P uses its internal 8MHz oscillator and runs on 2.5V from a linear regulator. Its current draw is around 1.5mA when active and 100nA in sleep mode.

The DS3231M RTC is an excellent chip, housed in a small 8 pin package which includes a built-in temperature compensated MEMS resonator with an accuracy of ±5ppm (± 2 minutes 40 seconds per year). Only a decoupling capacitor and a few extra pull-up resistors were required. The RTC is wired up so that instead of having power applied to the VCC pin, it’s applied to the Vbat pin which reduces its current draw from around 100uA down to 2.5uA.
Unfortunately this chip seems to be very hard to get hold of at a reasonable price if you’re not in the US. I had to get mine as samples.

The battery charging circuit uses a Microchip MCP73832 along with some additional components for load sharing, where the battery can charge without the rest of the watch interfering with it.

You might have noticed in the schematic that the LEDs are directly connected to the microcontroller without any resistors. The internal MOSFETs of the microcontroller have an on resistance of around 40Ω, so with a 2.5V supply voltage and LEDs with 2Vf, around 12.5mA ends up through the LEDs. I would have liked to have a blue LED, but the voltage drop for those are usually more than 3V which would have required some additional resistors and a MOSFET.

As the microcontroller is running on 2.5V the battery voltage needs to be brought down a bit to obtain an ADC reading. This is done by a simple voltage divider. However, with the voltage divider connected across the battery there would be a current of around 350uA constantly flowing through it, this is a huge waste of power. A P-MOSFET (and some voltage level conversion for it, which I forgot about in the first version so it was always stuck on) was added so the divider can be turned on only when needed.

The 2.5V regulator being used is a Torex XC6206, primarily chosen for its tiny quiescent current of just 1uA.
Why a linear regulator and not a switching regulator? The switching regulators I looked at had an efficiency of at least 80% with a 2mA load, but that efficiency quickly dropped off to less than 50% with loads of 100uA. Since the devices connected to the regulator draw 2-3uA in sleep mode, a switching regulator would have performed incredibly poor compared to a linear regulator. The 2.5V linear regulator efficiency is 60% with 4.2V input going up to 83% with 3V input.



Top side, under display

Top side, under display


So we’ve got a nice OLED display and 32KB of program space at our disposal, surely we can have more than just the time and date?

Almost everything is animated

A lot of time was spent optimizing the rendering code which, in short, involves copying bitmap images from flash to the frame buffer in RAM and sending the frame buffer over SPI to the OLED. The end result was being able to maintain 100+ FPS in almost all areas of the watch with an 8MHz AVR. However, since the animations are frame based instead of time based and to save power, the frame rate is limited to 60FPS.

Some of the main animated things:

  • CRT animation when entering and exiting sleep mode (similar to the CRT animation that some Android smartphones have).
  • Main time numbers have a ticker effect.
  • Menus have a scroll left/right animation and selecting an option will cause the current menu to fall off the screen and the next thing to fall on.


  • Set up to 10 alarm times.
    Number of alarm times is only limited by the amount of available EEPROM.
  • Each alarm has the hour, minute and which days of the week it should be active on.
Alarms menu

Alarms menu




Car dodge

Car dodge




Turns on all OLED pixels and LEDs, also has seizure strobe mode




Plenty of options

  • 3 Channel volume control
    • UI
    • Alarms
    • Hour beeps
  • Sleep timeout
  • Display brightness
  • Animations
    You’re not going to turn them off, right?
Volume settings

Volume settings

Power saving

In ‘active’ mode the microcontroller tries to go into idle sleep as much a possible. In idle sleep the controller is woken each millisecond to see if anything needs to be updated, if not then it goes back to idle sleep, this usually takes less than 100us if the display doesn’t need to be updated. In this mode the current draw can be anywhere between 0.8mA and 2mA, depending on how long it takes to draw frames (fast frame draw time = more time in idle sleep).

In ‘sleep’ mode the microcontroller turns the OLED off and goes into power-down sleep mode where it is only woken by either a button press, an RTC alarm or USB being plugged in. In this state the microcontroller draws ~100nA.

Power consumption

In sleep mode the overall current draw of the watch is around 6uA. In active mode the current draw can vary from 2mA to over 70mA, though 10mA is the typical current draw.

Battery life in various modes
Battery capacity: 150mAh

(sleep mode)
(main time display)
2.85 years
15 hours
2 hours, 20 minutes

If the watch is in active mode for an average of 1 minute per day (with a 5 second sleep timeout that would be checking the time 12 times a day) and all volume channels set to minimum the watch should last for around 1 year and 4 months on a single charge.

Current draw breakdown (typical)

Part Current
ATmega328P (sleep / active) 100nA / 1.5mA
OLED (sleep / active) 500nA / 8.5mA
DS3231M RTC 2.5uA
Schottky diode (D1) (reverse leakage) 1uA
Regulator (quiescent current) 1uA
Other (MOSFET and capacitor leakage etc) 1uA
Total (sleep / active) 6.1uA / 10mA

v1 to v1.1 changes

The first version had a few problems:

  • Added level conversion for the ADC P-MOSFET.
    Without level conversion the P-MOSFET was always stuck on. To turn of the P-MOSFET off the gate voltage needs to be at around the same level as its source voltage (which is connected to the battery), but the microcontroller was only providing 2.5V.
  • Added a gate pull-down resistor for the MOSFET driving the sounder.
    The MOSFET gate was floating when the microcontroller was being programmed which was causing the MOSFET to turn on and allow non-pulsed current to flow through the sounder, which probably wasn’t good for it.
  • Larger solder pads for MicroUSB connector.
    Normally SMD MicroUSB connectors have solder tabs at the sides and should have extra solder pads underneath, but since this is soldered by hand the underneath is unreachable. With out the extra solder pads the USB connector was wobbly so some of the connector pins eventually broke their solder joints. To fix this issue I enlarged the side solder pads so that the connector can be soldered all along its side instead of just the tab. No more wobbly connectors.


Other problems

Out of 3 OLED displays, 2 died after a few minutes of being attached to the watch. One from Ebay and the other from AliExpress. I’m still not sure why they died, maybe just China quality? The one that worked was also from Ebay.

Future improvements

  • Programming via USB.
    At the moment 4 wires need to be poked into the board (SPI programming) and then hope they don’t fall out while programming.
  • Add a fuel gauge IC.
    At the moment the battery level is determined by its voltage, this isn’t a very accurate method of getting the remaining battery charge.
  • Different microcontroller.
    The current firmware is using ~28KB out of the 32KB of available program space in the ATmega328P, a different microcontroller with more program space and probably more RAM would be needed to add more things like a calculator (floating point stuff eats up a lot of program space). However, the ATmega328P has the most program space for an AVR in a 32 pin TQFP package, to have more program space I would have to use a 44 pin AVR. The ATmega1284 looks interesting.
  • Switching regulator, charge pump regulator or maybe a hybrid solution?
    The linear regulator in use at the moment isn’t particularly efficient and switching regulators don’t seem to be very good with low current draw. Perhaps a charge pump regulator or a hybrid solution to swap between a linear regulator for sleep mode and a switching regulator for active mode?
  • A case of some sort?

Sources available at GitHub

Parts list

Schematic Part/value Description Quantity
U1 Atmel ATmega328P Microcontroller 1
U3 MCP73832 Lithium battery charger IC 1
U4 XC6206P252MR 2.5V LDO Regulator 1
U2 DS3231MZ+ RTC 1
Q1, Q2 DMP1045U P-MOSFET 2
Q3, Q4 DMG6968U N-MOSFET 2
D1 ZLLS410 Schottky diode 1
D2 TS4148 High speed diode 1
C5 4.7nF Capacitor 1
C4, C6, C7 100nF Capacitor 3
C3, C8, C9, C10 1uF Capacitor 4
C12 2.2uF Capacitor 1
C1, C2, C11 4.7uF Capacitor 3
R4, R8, R10 100R Resistor 3
R6 2.7K Resistor 1
R5 7.5K Resistor 1
R7 10K Resistor 1
R1 22K Resistor 1
R2, R3, R11 47K Resistor 3
R9 390K Resistor 1
RN1 10K network Resistor network (4x resistors) 1
LED1 LED (green) LED 1
LED2 LED (red) LED 1
LS1 Sounder Magnetic sounder 1
SW1 3 Way navigation switch 1
MicroUSB connector (Ebay) 1
OLED1 OLED (Ebay / AliExpress) 1
Battery (Ebay) 1
Main PCB 1
Display raiser PCB 1
Watch strap G10 NATO 22mm 1

Featured at
Atmel, HackADay, Electronics Lab, adafruit

Water proof down to 0m!


18 pings

Skip to comment form

  1. Awesome awesome project. I am going to have to order some of your PCBs and try my hand at it. I see you started a calculator for it as well. I am guessing you didnt add that functionality due to a lack of user input buttons?

    sort of reminds me of Dave Jones’ uWatch project. I really want a proper scientific calc watch to come out again. This is a wonderful step towards that for a different target audience. I really like the party mode

    1. Thanks 🙂
      I didn’t finish the calculator because all the floating point stuff was using up too much program space. Having only a few buttons isn’t too much of a problem, it just slows down user input as they’d have to traverse through an onscreen keypad.

    • Jim on October 9, 2013 at 2:12 pm
    • Reply

    I’d like to buy one too, but more importantly I’d like to contribute if you want.

    • Jack Tramiel on October 23, 2013 at 9:37 pm
    • Reply

    USB connector is used only to charge… Fake! Bullshit! You fail!
    Use ARM Coretx-M (STM32 as ex.):
    -Integrated RTC
    -Integrated USB2.0 controller
    -Huge amount of Flash and RAM
    -Low power consumption
    -Cheaper than AVR

    Why on AVR? ARM is it so difficult for you?

    Why? Why would you want to buy this bullshit? I do not understand you people …

    1. I’m sorry that you think everything must use an ARM controller. The watch runs great with an AVR, instead of just throwing more MHz/flash/RAM at it a little bit of thought had to be put into the code.
      In sleep mode, AVR current draw is in the nA range, while STM32s are in the uA range.
      Only the very low end STM32 chips are cheaper than an ATmega328P (for me, at least).

      But don’t worry, I will start using ARM controllers, I just don’t have any projects on the to-do list that need the power of ARM just yet.

        • Jack Tramiel on October 25, 2013 at 2:30 pm
        • Reply

        I do not think that everyone should use the ARM, I say that in your project ARM is preferred. If you’re planning to add a firmware update via USB, you have two ways: use expensive FTDI chips (or less expensive CP2102), or to realize the USB by software via v-usb, but it will take a significant amount of flash ROM. If you plan to add a firmware update via USB, you also have to find space in the flash ROM to bootloader. If you did not plan, then at least take the trouble to attach to your gadget AVR programmer and instructions for flashing.

        The output you have one – to move to ARM. Not because ARM is fashionable and popular, just for your project ARM the most cost-effective solution. Let’s count: ATmega328P + DS3231MZ + FT232 ~ €3 + €8 + €5 ~ €16. I think you will agree that the functional of ATmega328P + DS3231MZ + FT232 overlaps by one STM32L151C8 at ~ €4.

        Current consumption of STM32L1XX in standby mode + RTC ~ 900nA, this is less than ATmega328P + DS3231MZ. But you’re talking about the low consumption of picoPower AVR, although the are using 2.5V LDO Regulator. LOL

        • Vincenttech on October 31, 2013 at 9:07 pm
        • Reply

        Zak, ignor this idiot, you did an awsome Job, Man!
        I don’t know what Jack from a watch, its not like you need a super computer on your wrist 😉

        • Jack Tramiel on November 5, 2013 at 9:03 am
        • Reply

        Dude, I’m an idiot do not listen to me, you’re doing the right thing. Good luck!

    • Antoine on October 28, 2013 at 12:38 pm
    • Reply

    Excellent project and description Zak, thanks a lot for this your nice publication!

    Looking at the OLED display documentation (WiseChip UG-2864KSWLG01 from eBay) I am missing something: how is it possible that the display is working when connecting the VCC (Supply Voltage for Display) to the ground (through C12 2.2uF) while 12V should be provided to this pin according to the datasheet?

    1. The OLED can either run from an external 12V or use its own internal charge pump circuit. My project uses the internal charge pump since it requires fewer components, but the display is not quite as bright as using an external 12V. For some reason the UG-2864KSWLG01 datasheet doesn’t have much info about the charge pump, but the datasheet for the 0.96″ version (UG-2864HSWEG01) does.

    • charlezkwan on October 29, 2013 at 5:49 am
    • Reply

    Hi there, it is a awsome project.
    Im just having a problem when opening the project under atmel studi 6. It says me i got an error on Flavour AVR-GCC 4.7.2 does not exist, how can i open it? Thanks so much for the irrelevant

    1. That seems to be a problem with 6.1 (I’ve been using 6.0), open watch.cproj with notepad or something, search for “AVR-GCC 4.7.2” and change it to “Native” (without quotes).

    • Markus Gritsch on November 3, 2013 at 12:48 pm
    • Reply

    “If the watch is in active mode for an average of 1 minute per day the watch should last for around 30 days on a single charge.”

    Shouldn’t it last about 0.150 Ah / ( 0.01 A * 1h / 60 + 6E-6 A * 24 h ) ~ 483 days?

    1. Yes you’re right! Thanks for that, I think I worked it out as if the watch was on for 1 minute per hour, instead of per day!

    • Mark M on November 28, 2013 at 9:02 am
    • Reply

    Hello.Very nice project.I was reading your introduction,and in the Future improvements,you’re mentioning, about using ”fuel gauge IC”.
    if you can, take a look at bq34z100,i think,it’s perfect for your watch.

    1. Hmm, BQ34Z100 seems to have a lot of extra features which the watch doesn’t really need, I think a much smaller 6 pin IC would have all the things needed.

    • Thomas on November 30, 2013 at 5:53 pm
    • Reply

    Very impressive work. Your menu/UI system is quite a piece of work. I’m working on a project using that OLED and similar low-power techniques. A few things I’ve come up with;

    1). You can save 1uA quiescent using Microchip’s MCP1710 LDO Iq~20nA (Yes, nano). I don’t know how they managed to get it that low.

    2). is the cheapest place I’ve found to buy the 1.3″ OLED. I believe its the manufacturer’s (EastRising) shop. They emailed me to enquire about further business, so I expect they’d be quite a responsive source if you provide a kit for sale.

    3). I use the OLED module in SPI and parallel modes. I’ve noticed leakage currents on the SPI bus of several uA when asleep. May be worth checking nothing comparable occurs using I2C.

    4). Although too bulky for you perhaps, I’ve had good luck with NXP’s PCF2129 TCXO RTCC. It’s comparable to the non-MEMS DS3231 but much cheaper and more easily sourced, and at Iq~0.7uA it saves a couple of uA.

    Anyway, really just wanted to congratulate you on the good work.

    1. Thanks 🙂
      20nA is very impressive :O I’m going to need some practice with soldering IC packages that don’t have pins. has been mentioned by a few others too, I’ll be trying them out soon. So far I haven’t had a any problems with excessive leakage on the SPI bus and I2C is kinda slow and would limit the frame rate to ~48FPS. I can’t seem to find any stores in the UK that stock PCF2129 and it does seem to be a bit on the large side for the watch.

    • Mike on December 2, 2013 at 3:05 am
    • Reply

    Excellent project. One thing in not clear in is why +5v is on the oled display? It looks like the +5v comes from the charger which is only on when charging the battery. Shouldn’t the +5v on this display be +2.5v for it to work?

    1. The +5.0V from the charging circuit isn’t really 5V (I should probably change it to just VCC or something). When it’s charging the +5.0V is 5V from USB minus D1 voltage drop (~0.3V). When it’s not charging then it’s at whatever voltage the battery is at (3V – 4.2V).
      The OLED takes 2 voltage inputs, one at pin 9 for the digital circuitry which should be between 1.65V and 3.3V and the other at pin 6 for the internal DC/DC converter for lighting up the pixels which should be between 3.5V and 4.2V (absolute max 5V).

    • Rick on December 22, 2013 at 11:00 am
    • Reply

    Hey, could you explain more about how you program it?

    1. There are some holes labeled MI, MO and CL just next to the switch and another hole labeled RST near the USB connector. Poking some wires into them and connecting the other end of the wires to an ISP programmer will allow you to program the watch.

        • Rick on December 25, 2013 at 10:41 am
        • Reply

        Hmm. But do you have the battery attached when programmed?

        1. It can be powered by battery or USB when programming it, though if you don’t have USB connected you also need to connect the GND hole (near nav switch) to GND of the ISP (or croc clip onto the USB connector, just as long as the 2 grounds are connected somewhere). Also make sure the ISP IO voltage is no more than 3.3V.

    • Mike on December 24, 2013 at 9:04 am
    • Reply

    Hi! Lets say I want to change the RTC to something more accessible like ds1307z. Would i need to change the code or not?

    1. Only a few code changes will be needed as the control register is slightly different. However, the DS1307 does not support alarms, requires an external crystal, uses a lot of power (the watch will only last for 1 week max with a 150mAh battery) and has a minimum supply voltage of 4.5V (LiPo max voltage is 4.2V). So really the DS1307 won’t work as an easy replacement.

    • Mirko on December 29, 2013 at 8:46 am
    • Reply

    Hi, amazing work! After seeing your watch I want to start studying electronics 🙂
    How is the sunlight readability?

    1. Hi, it’s not too hard to see in sunlight, if it’s very bright then shading it with your other hand usually makes it readable.

    • Manny on December 31, 2013 at 4:46 pm
    • Reply

    This is an amazing project! I was wondering if there’s a way that it can be modified to be able to play music with headphones instead of playing the apps?

    1. Thanks 🙂
      Playing music would require a much faster processor, a DAC and some form of storage. It would need a complete redesign.

    • I Like on January 2, 2014 at 6:11 pm
    • Reply


  2. Regarding future improvements: Some sort of a case? WHY! It looks damn gorgeous! lol, okay, but I guess it does depend on how easy dust get in and if it feels clunky on your arm, but just like that it looks VERY good! And with prices like those at BuyDisplay I guess I should try a project like this too 🙂

    Nice build!

    • Prakash15 on January 7, 2014 at 9:58 am
    • Reply

    DIY and clean making of digital wrist watch. Thanks for the video. Here The digital wrist watch programming is a bit tough.

      • Wes on January 9, 2014 at 12:26 am
      • Reply

      Programming can indeed be tricky sometimes. To make mine, I bought a cheap USBASP programmer off ebay and used avrdude to put the code onto the MCU. The only bump in the road that I encountered was when I tried to burn the fuses.. where avrdude told me the chip signature was null (0x00000). I found that I could fix this by adjusting the programming frequency using the command “-B5” (see below). I suspect that this issue was specific to my programmer, however if you use the commands below I would leave out “-B5” first, and go from there.

      avrdude -c usbasp -p atmega328p -P usb -B5 -U lfuse:w:0xD2:m -U hfuse:w:0xDF:m -U efuse:w:0xFE:m

      Then, the flash and eeprom can be programmed using the following two lines:

      avrdude -c usbasp -p atmega328p -P usb -U flash:w:watch.hex
      avrdude -c usbasp -p atmega328p -P usb -U eeprom:w:watch.eep

      Then you should be good to go! Zak might have more to say.. afterall, he’s the expert 🙂

      1. Hehe 😛 The controller comes clocked at 1MHz brand new (forgot about that), so you need to reduce the programmer clock a bit, like you did. But once the fuses are set so it runs at 8MHz you don’t need the -B5 anymore.

  3. Apart from the great looks of this project, this blog is a real gem in terms of clarity and depth of information. I have read lots and lots of similar posts about AVRs, MOSFET switching, load sharing etc when designing my own projects, but I did never came across such a great level of detail. So, again, thanks a lot for sharing Zak !

    Please allow me to ask a few more questions (additional to my other ones in the load sharing post) regarding this schematic :

    1) I may be missing something, but why didn’t you choose a low-side N-MOSFET switching for enabling the R5/R6 divider (BATT_LVL) – similarly to the buzzer (LS1) switch – in order to avoid level-shifting and to use fewer components ?

    2) Did you have any problems programming the AVR due to the SPI bus sharing between the programmer and the OLED ? When the AVR is on reset state during programming, SS_OLED may be floating and messing things up. What I usually do is placing external pullups (10K) on all SPI peripheral SS pins (or pulldowns, depending on the chip).

    3) What is the use of D2 ? Why is C5 necessary ? These are some theoretical details that I cannot easily find answers to, since I am a hobbyist and try to learn by myself 🙂

    4) Why did you choose the internal 1.1V reference for the ADC (which is not very accurate) instead of the external VCC=2.5V ? In the second case, if you choose a 1:2 divider (e.g. 10K/20K) you get a much greater range in possible ADC readouts and hence better accuracy for the remaining battery percentage.

    5) This is not a question, just a good idea for programming space-limited PCBs like yours. It’s a bit overpriced but great, I have bought one : It’s compatible with the AVRISP mkII I am using. There are ready footprints for EAGLE of course.

    Thanks a very lot in advance Zak !

    1. Thanks 😀

      1) If it was an N-MOSFET then turning it off would disconnect R6 from GND and stop the diving part from working causing BATT_LVL to see full battery voltage.

      2) Only SCK and MOSI SPI pins are connected to the OLED, AVR042 section 3.1.1 says that you should put resistors (1K should be enough) on lines that devices other than the AVR might try to drive, but since the OLED doesn’t have MISO (the pin that a slave will try to drive) there’s no need for the resistors. Though sometimes the OLED will read the ISP data as normal commands/data, but that doesn’t really matter since the controller will reset the OLED back to a known state at start up.

      3) The reset pin has an ESD protection diode missing because it needs to support 12V being applied to it for HV programming. D2 adds back the ESD protection and C5 is to help prevent random resets caused by noise. See AVR042 section 2.

      4) Other than the 1.1V being a little bit inaccurate, there’s no difference between using internal or external (with the correct resistor values). Internal gives a smaller voltage range, but can measure smaller voltage changes (1.1/1024 = 1.074mV | 2.5/1024 = 2.441mV). I can’t remember why I chose the internal, but I think I’ll change it to external 😛

      5) Ah yeah, I was thinking of moving the holes around a little bit and making a pogo-pin adapter thing to make it easier to program for when I get kits ready.

      1. 1) True, full VBAT (4.2V) may damage the ADC input, is that right ?

        2) I agree, however I have read somewhere that series resistors on SPI lines may affect the bus speed. In my case I have four peripherals sharing the same SPI bus, which are disabled during programming using external pullup resistors (10K) on their SS pins that tristate their MISO pins (works a treat).

        3) Do you really need HV programming for the watch ? 🙂

        4) Yes, you are right, I did a mistake in the calculations, it doesn’t really matter which VREF you use 🙂 Your divider is wasting max 412 uA, however this could get lower with higher resistor values. I prefer a percentage-type output (instead of mV that I saw on the watch), here’s the Excel I am using :

        1. 1) The ADC would probably be alright, it will just read as 1023. But the internal ESD diode will conduct the battery voltage up to the 2.5V supply.

          2) Yeah, resistors can effect the max SPI speed (won’t be able to charge/discharge all the stray capacitance fast enough), but you’ll have to be running it at pretty high speeds before it starts being a problem. Your SS pullup would probably be the best all-round solution, though… or at least until you start having more than 1 master on the bus >.<

          3) No no, with the extra ESD diode HV won’t work (‘it’ was meant to mean the controller, not the watch).

          4) The divider is only turned on for ~500us and usually only once a minute while the watch is on. I did a kind of percentage thing with the battery icon (full, high, low, empty). Battery discharge isn’t linear so it’s hard to get a good percentage reading without a coulomb counter.

  4. Check these SPI transfer functions that I have, maybe they’re a little bit faster (the “loop_until_bit_is_set” has an extra byte typecast I think). Also the first one does not need a “data” input.

    inline static uint8_t getSPI(void) {
    SPDR = 0xFF;
    while (!(SPSR & (1 << SPIF)));
    return SPDR;

    inline static void sendSPI(uint8_t spi_data) {
    SPDR = spi_data;
    while (!(SPSR & (1 << SPIF)));

    1. Those functions are similar to the usual ones I use, but they can be improved (which I did for the watch).
      The normal functions would load a byte from RAM (2 cycles) into the SPI register (1 cycle) than wait for transfer completion. The function I did for the watch loads the next byte from RAM while the transfer is happening so it only takes 1 cycle instead of 3 to begin the next transfer. Well, it’s a bit more involved than that, but the general idea is to do stuff while waiting for a transfer to complete instead of after or before.

      1. Wow, amazing trick !!! you don’t loop, just wait a predefined time for the transfer to finish 🙂 it reminds me of a similar question I once had about SPI transfer for SD cards here :,113904.0.html. I am so happy that there are always so kind people out there to share their knowledge. Thanks a million Zak 🙂

    • Ryan on January 17, 2014 at 10:28 am
    • Reply

    I can’t wait to get one on my work bench then on my wrist

    • Lakes on February 1, 2014 at 10:06 am
    • Reply

    Amazing work!, saw this on AdaFruit Show n Tell. 🙂

    What form will the kit (you will sell loads of these!) take?, smd soldering?

    Add something that turns on the display when you tilt the watch to look at it?

    Could you have the software load a picture (Deluxe Colour watch version?) and draw analog watch hands over it?

    1. Thanks! Have you got a link to the show n tell video?
      There will be 3 options for the kit, unassembled, PCB assembled and fully assembled. I’ve also updated the PCB design for the kit; there are exposed pads for power, I2C and UART so you can add your own little module things like bluetooth, accelerometer (tilt to turn on), GPS etc. Analog watch hands can be done, though I probably won’t be adding them to the official firmware since there’s not much program space left on the microcontroller :/

  5. I would Like to buy one. Its very outstanding. Please let me know when you start selling them.

    • HD on February 26, 2014 at 3:40 am
    • Reply

    A small question, how do you manage to calculate the FPS? I’m making a simular watch with arduino but anything I try only resulted in 14-15, that is incrementing a value constantly every draw the restating every second.

    1. Hey, millisecond time is recorded at the start of all the rendering and then again at the end: FPS = 1000 / (endTime – startTime)
      It’s not very accurate for high frame rates, 2.5ms render time (400 FPS) will actually be worked out as 500 FPS since it gets the milliseconds as a whole number (2ms).
      14-15FPS is probably about right for Arduino libraries, they aren’t very fast.

        • HD on February 26, 2014 at 11:36 pm
        • Reply

        I tested it by recording the milliseconds taken to draw it then averaged it, basicly the same way, I was able to get 32 FPS just with the time shown, thanks for the answer!

  6. Hi,

    I’ve just received your MailChimp email concerning the kit. Just wondering if you set a price yet.


    1. There will be 3 options:
      Unassembled around £35 (64.94 CAD).
      Partially assembled (just PCB soldered) and fully assembled will be around £50 – £70 (92.77 – 129.88 CAD).
      Shipping to Canada will probably be £4 (7.42 CAD).

    • Pao Nan on March 9, 2014 at 2:25 pm
    • Reply

    I’ve read your ultimate OLED wrist watch posting with pleasure.
    The only thing you’d missed was some musical element in your project.

    This could be a small help for you to upgrade your firmware with some musical tunes with current hardware wiring.

    Please, check my posting on the youtube.

    You could find more on my old posting.

    Good luck!

    1. Hey, nice work on the RTTTL player 😀
      I’ve actually implemented tune playing functionally for the next firmware version, though it’s much more basic than RTTTL to keep program size down. Notes are stored as binary rather than text and each note just has frequency and duration specified.

      1. Oooo! Will this be in the Batch 2?

        1. Yup, it was also in batch #1 😛 There’s no full tunes, just things like the single beeps from pressing a button are now double beeps.

  7. What parts do I need to solder if I buy the kit? I’ve got fine point tips for my Hakko but no flow tools or oven.

    ( and I HATE unreadable dumb stupid Captcha – it sucks big time – there are better tools now!)

    1. You’ll need to solder everything if you buy the unassembled kit (0805, SOT-23, SOIC-8 and TQFP-32 packages, the hardest part would probably be the microUSB connector), or if you buy the PCB assembled option then you’ll only need to solder the battery and if you get the completely assembled option then you won’t need to solder anything. I use this iron and plenty of flux.

      Yeah, I’ll see about changing the captcha thing.

    • Jay on April 11, 2014 at 5:52 am
    • Reply

    Hi Zack

    I have being reading HaD and was directed to your blog. I have a baby brother who really likes electronics and he is only in secondary school. I know I am too late but was wondering if you might have any extra watch and components left he will be very happy if I can give it to him in his bd



    1. There might be enough parts left for a few more watches once the current batch is done, you can subscribe to updates here about it and possible future batches.

    • kosthala on May 15, 2014 at 11:52 am
    • Reply

    Hi Zack,

    I can’t understand the purpose of the R7/R8 divider. From the schematic i can see that when the Q3 is off, the Q2 gate voltage is equal to the VBAT (so Q4 is off) and when the Q3 is on, the Q2 gate voltage is ~42mV by the divider (Q4 on). Without the divider the Q2 gate voltage would be ~0 volt, so the Q2 would be on again. So what is the difference?

    1. R7/R8 isn’t really meant to be a divider in this case, R8 is to limit Q2 gate discharge current when turning on.

        • kosthala on May 15, 2014 at 12:09 pm
        • Reply

        Hi Zack,

        I was confused because you mentioned that without the divider, the p-mosfet was always stuck on.

        1. Without level conversion the P-MOSFET was always stuck on.

          It’s without the level shifter R4, R7, R8 & Q3 that the P-MOSFET was stuck on (R7 and Q3 are the main parts, R4 and R8 are just to limit gate currents).

    • Jerod on May 27, 2014 at 5:01 am
    • Reply

    Honestly amazing. If that watch were for sale, I would buy it. In a heartbeat. The alarm seems looks awesome. Thanks for showing it off!

    • Sergey on May 31, 2014 at 9:30 pm
    • Reply

    Good afternoon, I saw your watch and ecstatic, it’s excellent. Immediately wanted them repeat for yourself trying to open downloaded archive “watch.sch” program P-CAD 2006 but can not open writes error. Tell me how to open the PCB or could you give in a different format. Thanks in advance.

    1. Hey, you need to use EAGLE.

        • Sergey on June 4, 2014 at 6:57 pm
        • Reply

        Thanks already figured out, now waiting for an updated version of PCB and HEX

    • Necbettin on June 16, 2014 at 11:45 am
    • Reply

    You should add BLE to communicate with smartphones.

    • Sergey on July 2, 2014 at 8:55 pm
    • Reply

    Zack and where you can buy DS3231MZ + searched but could not find, could you provide a link.

    1. RS-Online
      You might be able to get samples from Maxim

  8. Hi Zak!

    Please tell us Farnell part number for the momentay switch buttons!

    thank you!

  9. Hello, Awesome Project!
    Problem encountered,
    .brd file unable to open (Using Allergo Free Physical Viewer)

    how would i program the mcu? will it be programmed after assembly ? which programmer and what software should be used?

    Suggestion : Proximity based screen on, wave your hand over it to see the time, (maybe LDR based?)
    Accelerometer based screen on, shake it to see the time,
    Gyroscope, Tilt based,, or touch based screen on, Stay on feature for screen, dock charging pogo stuff?
    Add BLE 4.0 to display cellphone notifications?

    1. You need to use EAGLE to open the .brd and .sch files.
      On the latest PCB version (1.3) the MCU bootloader and fuse settings can be programmed by soldering connections to the SPI breakout pads (MI, MO, CL). Once the bootloader is programmed you can use the pogo adapter to program the main watch code (see this post for more pictures).
      I use a USBasp to program the bootloader and a normal USB-to-serial converter for the main watch code. Avrdude would be the software for uploading the code from your computer to the watch.

      Good suggestions, but all of that would be difficult to hand solder (accelerometers and gyros are usually in QFN packages) and not very friendly on battery life. Though bluetooth will likely be added soemtime.

      1. Can we using the USBasp (and the 10pin-6pin converter) to uploading the bootloader and the main code also? Or should using the SPI pads first time? Can you explain please, Zak. Thank you!

        1. The microcontroller in your kit already has the bootloader and main code programmed. To update the main code you would use the USB-to-serial converter and pogo adapter that came with the kit like this.
          To update the bootloader or change fuses then you will need to solder connections from a USBasp to the SPI pads, but you shouldn’t need to change those.

          1. oh, and what do you mean by “Changing fuses”, why?

          2. The fuses are low-level AVR microcontroller settings for things like the clock source, you will need to change the fuses to the correct values using the USBasp programmer, see on the github repo.

      2. Hey,Thanks for the reply
        forgot to ask, is this opensource? can i make one for myself without any fear of lawsuits? 😛
        on your FTP there is a file named “watch_20130925”, what is that?
        should i follow the “NWatch-master” 1.3 version instead?
        i have once worked with 8051 microcontroller for a friend of mine, it had a programmer where you could just put the whole chip in socket and program it, this would be my first “normal” microcontroller project

        and yeah, i figured out that i needed EAGLE to open those files,but the PCB manufacturers want gerber files instead,so i am in the process of learning how to use “CAM” to export, not sure which layers to select

        you mean to say, that the bootloader must be programmed to atmega328p which doesnt already have a bootloader?
        because some already have arduino bootloader loaded, or you have a specialbootloader for it?
        difference between USBasp and USBtoSerial?, USB to RS232 TTL? a little confusion here

        so far what i understood,
        Step1:Buy all parts,MCU without bootloader
        2:Make PCB, assemble everything on it
        3:use pads to solder wires to burn a bootloader using usbasp
        4:solder again for USB to Serial to program it
        5: use it! and feel awesome

        P.S.: QFN packages could be assembled using heat gun,and solder paste masking

        1. Yup it’s all open source, you’re free to make one for yourself. The code is GPLv3 so any changes you do to it must also be made open source.
 is the first version (old), use whatever is on GitHub with the highest version number.
          Look here for the usual layers to export, should be similar for other manufactures. OSHPark can also take plain EAGLE .brd files if you decide to use them.
          A bootloader is only needed if you want to be able to program via serial and to protect the fuse settings from getting messed up (messed up fuses can be a real pain to fix). The bootloader for the watch is a slightly modified Arduino bootloader (optiboot), I just added EEPROM reading and writing support and changed the LED pin.
          USBasp is an actual AVR programmer. USB-to-serial is just a converter for USB to RS232 TTL, but with the bootloader installed on the AVR the converter can be used to program the watch.

          Those steps should work, apart from #4, what do you mean by solder again?

          I’ll have to have a look into using a heat gun, I’ll probably make soldering normal SMD parts easier too 😛

          1. Okay, so
            do i have to put the modified bootloader on a new bought blank chip using USBASP?
            and after doing that , program it?

          2. That’s right.

          3. Sorry for so many Questions, i am a newbie in the world of AVR, 😛
            so, there are SPI pins for usb2serial TTL, and then there are other pins to be used with AVR,
            the modified optiboot goes into the AVR? or in the MCU?
            on the Github are 3 files,
            where and in what order do these files go?

            it would be much appreciated if there was a step by step tutorial “after” assembling the components together,
            like instructables, 😀

          4. AVR is the type of MCU in the watch.
            optiboot.hex is the bootloader, use a USBasp to program that onto the watch.
            watch.eep and .hex is the main program, program that using a USB-serial converter.

            See THIS for installing drivers.
            Google image search for “avr isp” and connect wires from the USBasp header to the pads on the watch (MOSI -> MO, MISO -> MI, SCK -> CL, GND -> GND). RST goes to R, don’t solder that one though, just hold it on the pad.
            See last 2 steps in link below for programming, but choose USBasp as the programmer.

            This will help with the serial part:

          5. Thanks a lot for your support!
            in the time it took my comments to be moderated, i made myself busy learning about MCUs and arduinos, and i have a better understanding of it now,

            1:Atmel chip is at the heart of Arduino

            2:Arduino has their own programming language that works with their bootloader on Atmel

            3:Atmel has their own “Hardcore” programming language, and some pins are assigned differently

            4:An ATmel chip with Arduino (or optiboot) bootloader can be programmed using USB2Serial/TLL Adapter (using arduino IDE
            and/or AVRdudes).In your case, using the pogo Adapter.

            5:A blank ATmel chip is bootloaded using the AVR/USBASP programmer on SPI pads (using Avrdudes)
            in your case, using the pads you provided

            6:Fuses control the internal clock n stuff,they can be changed using AVR Programmer

            7:i assume that your code is written in normal ATmel language, basically this watch has nothing to do with Arduino(it was confusing me all the time)

            8:According to the screenshot on the link, you are programming the main code using an Arduino on AVRdudes
            can both the USBasp and USBtoSerialTTL can be used with AVRdudes to program/burn the MCU?
            can you also post a screenshot of burning the bootloader with all the fuses n stuff filled correctly?

            i will probably solder and desolder everytime , because i dont like holding onto cables while frimwares are being programmed, just the fear of Bricking devices.

            What do you think about this “Retro Watch”?

            Just refer to the line number, makes answering easy
            Have a nice day!

          6. Sorry for taking so long to reply!
            All of those points are correct.
            Well, #3, the Atmel language is just normal C/C++, while the Arduino language is C/C++ made easy.
            #7: Yeah, the watch uses normal C, no Arduino stuff.
            #8: The programmer is set to ‘Arduino’ which tells avrdude that we are using serial to communicate with an optiboot bootloader. The USBasp needs to have USBasp chosen as the programmer (near the bottom of the list).


            You can set the bit clock back to 1.5MHz once the fuses are set.

            Retro watch… not too keen on the way the strap is done 😛 Nice that it’s got bluetooth, but doesn’t seem to have any battery charging stuff.

          7. Haha, its okay, fast replies arn’t necessary

            yes,i found the retrowatch strap ugly aswell. but it is easier to make, instead of onboard RTC, the time data and other stuff is transferred through bluetooth,and for battery i was thinking something like TP4056, but i am note sure about the load sharing,

          8. TP4056 would work, load sharing circuit would be the same, just the additional MOSFET, resistor and diode. More info here.

        2. Oh, and, what do you think about using a cellphone battery?
          they are thin, lightweight and they have enormous capacities (1500mAh ~ 3600mAh)
          i think the classic “BL-5C” from Nokia would fit the size perfectly
          perhaps with a Qi wireless charger sticker taped to the back.

          1. Cellphone battery should work, though I’m not sure how safe it would be to solder wires onto the contacts.

          2. i think it would be safe, a few seconds of heat doesnt hurt, just dont heat the battery itself, only the terminals

  10. Hey! I’ve been building my own OLED watch too, I came across your project while looking for other makers. I quite like your design, and I’m pretty impressed you managed to get 60FPS! (Mine can only do ~20FPS, but it’s probably because it’s 128×128 RGB)

    I went the Microchip PIC24 route in my watch instead of AVR, and added bluetooth and some sensors. Admittedly I should have chosen a lower-power MCU, it uses around 2mA on standby… You should check it out:

    PS. If you want to get into ARM, have a look at EnergyMicro’s EFM32 ARM chips. They’re very low power, and I’ll probably use one in my next version!

    1. Heya, thanks 😀 I think I saw your watch on HackADay, great work! That colour display looks much nicer than my monochrome one 😛
      I was looking at those EFM32 controllers not too long ago, though it seems the smaller TQFP versions don’t have USB support. Atmel and ST have some good stuff, power consumption probably isn’t quite as low, but it would only be only a few uA difference for the things a watch needs to do.

    • ryan on August 6, 2014 at 12:00 pm
    • Reply

    just wondering could i upgrade the battery as long as i made sure it was a single cell 3.7v lipo battry but with a different capacity.

    1. Yup, Li-Ion should also work too. Make sure it has at least undervoltage protection though.

  11. and, what is RN2? (473)

    1. RN2 is a resistor network, it contains 4x 47K resistors.

    • Kian on August 27, 2014 at 9:53 am
    • Reply

    HI Zak,

    Great work here. Pardon me for my amateurish question, what is the reason for using 2.5V instead of 3.3V to power the MCU? Is it because current consumption is lower at a lower voltage? A lot of sensors out there has a 3.3V requirement.

    1. Thanks 🙂

      A number of reasons for 2.5V:
      Lower power consumption.
      It’ll be pretty much always be under the battery voltage which ranges from 4.2V to 2.4V, so no drop out issues.
      It’s close to the OLEDs recommended logic voltage of 2.8V (max 3.3V, min 1.65V).
      Nothing else in the watch needed 3.3V.

      Most 3.3V devices can read a 2.5V signal, though you’ll need some level conversion for 3.3V -> 2.5V back to the microcontroller, a simple resistor divider can be used or for higher speed and lower power consumption use an OR gate.

  12. Nice thing to build. I will surely try to build it myself.
    But one thing that didn’t made a sense to me is battery life and the use of atmega, If we use other light weight chips it will be more better and consume less power.

    1. In sleep mode the ATmega consumes ~100nA and while awake the OLED is the main battery drainer. We’d probably only see a ~10% battery life improvement if we were to swap the ATmega for some ultra low power controller.

    • K on October 7, 2014 at 9:02 pm
    • Reply

    First of all I want to say that this is amazing and I want to build some thing just like this but I don’t have access to a 3 way switch so could u please chnag the code to use three small momentary push btutor switches and then send the code to thank you.

    1. The 3 way switch is already just 3 individual push buttons, so no need to update the code.

    • Mike on October 8, 2014 at 9:45 am
    • Reply

    Loving the watch so far. However, I’ve recently been having an issue. My alarms have stopped going off for no apparent reason. It appears that when one goes off, it is immediately stopped, and no sound is made, regardless of the sound settings. I know the watch is still capable of making sound, as the menu sounds still work, so this appears to be some sort of bug in the code. Any help would be appreciated.

    1. It is indeed a bug, updating the firmware will fix it, see HERE.

        • Mike on October 20, 2014 at 10:06 pm
        • Reply

        Thanks for the response. I’ve updated the firmware, and the alarms still stop working after the first one.

        1. Ah, found another bug, see if the latest firmware fixes it.

            • Mike on October 25, 2014 at 8:17 am

            This update appears to have fixed it. Thanks!

    • Dave on October 8, 2014 at 11:35 am
    • Reply

    Hi Zack,

    My watch has started misbehaving. I really can’t explain why…. the beeps for the alarm and pressing buttons have disappeared. When the alarm goes off there is a brief “click” but that’s it.
    The beeper still works though because when I play either of the games I get all the sounds.

    The second issue is that the battery meter always reads 5001mV. This corresponds to an ADC reading of 1023 I believe (having looked at the source code).

    Any ideas what is going wrong? I’ll let the battery drain down and see if it works when re-powered up.

    Big Dave

    1. The disappearing beeps is a bug, updating the firmware will fix it, see HERE. You can also short together R and G pogo pads to reset the microcontroller instead of waiting for the battery to run out.
      For the voltage reading check around RN3 and C6 area for shorts, though if you’ve epoxy’d the display it might be a bit difficult to do that now 😛

    • Dave on October 9, 2014 at 10:50 am
    • Reply

    Okay, I’ll update the firmware. Looks like I’ll have to live with the battery voltage problem. Maybe the display will start misbehaving when the voltage is low? Can’t believe I didn’t spot it before!

    1. The battery has it’s own cutoff at about 2.4V, the display might start going a bit dim as the voltage goes down but should otherwise work normally. If there is a short you might find that stand by battery life is now only around 7 days :/

        • Dave on October 9, 2014 at 3:10 pm
        • Reply

        Well presumably the short won’t be a significant problem if the ADC input is “high” impedance. Thanks for clarifying DTR.

        1. The ADC input is also connected to a voltage divider with one of the 10K resistors connecting to ground, that’s what will cause the reduced battery life.

            • Dave on November 3, 2014 at 12:22 pm

            Still going as of today without a recharge. I don’t think the 10k short was at fault after all.

          1. Oh, I forgot about the transistors which turn the divider on and off only when needed, so that’s probably why battery life is still ok 😛

    • Dave on October 9, 2014 at 1:57 pm
    • Reply

    By the way, in that link to reprogramming the firmware you refer to “DTS” however I only have “DTR” and “CTS” on my dongle. Which is it? Thanks.

    1. Ah fixed, should be DTR.

  13. Zak, Can you share with us the finished manual, or its just for the members, who bought the kit? thanks.

    1. The manual/wiki is for anyone, but it’s still a work in progress –

      1. Great! 🙂 Can you make for us an offline version, like in pdf format?

        1. I don’t ave an offline version, but you can go the pages and CTRL+S to save them, or there might have a PDF option if you CTRL+P to print. There’s also websites that can convert pages to pdf, google “web page to pdf”.

  14. Got my watch as a Birthday gift 😉 and it was spot-on 🙂
    though due to my shitty smd soldering skills i had to use another usb socket… (and i will not be showing them off to the world)
    but this is how it looks like 😉
    and it’s awesome :))

    1. Awesome 😀 Looking good!

      • Sergey on November 3, 2014 at 8:40 pm
      • Reply

      vibro you can manually set the buzzer instead. True Zak

    • Sinan Akkoyun on November 24, 2014 at 8:12 pm
    • Reply

    Hi Zak,
    I can’t do anything with the .hex and .eep files. Please give me your arduino code so I can modify the code. I hope you awnser me in short time.
    Sry for bad english, I’m german.

    1. Replied to the email you sent, but I’ll also put here:

      All code is available at
      You should be able to upload the .hex and .eep files to the microcontroller and if everything is wired up the same as in the schematic ( it should just work.

  1. […] This is all displayed on what looks to be a very crisp OLED display. Frankly, I’m impressed – while it’s not something I myself can put together, I can certainly appreciate the effort that went into packaging this watch (and it’s functionality). Sure, it’s not a smartwatch, but this is one of the cooler digital watches I’ve seen in some time, mass-produced or not. If you’d like some more information on this project, check out the original project page here. […]

  2. […] and 1.3″ 128×64 monochrome OLED screen. For more information on this awesome project, follow this […]

  3. […] Vorgeschichte: Vor ein paar Monaten bin ich im Internet auf eine tolle kleine Eigenbau Armbanduhr namens N|Watch (unbedingt ansehen) gestoßen. Ein kleiner atmega328p mit RTC und einem OLED Display, ein paar […]

Leave a Reply

Your email address will not be published.

Are you human? *