Sep 25 2013

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 20mA 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 Android CRT animation).
  • 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 and RAM.
  • 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 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 30 days 1 year and 4 months on a single charge. (Oops, 30 days is if the watch is on for 1 minute per hour, not day).

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!


16 pings

Skip to comment form

  1. Mirko

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

    1. Zak Kemble

      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.

  2. Manny

    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. Zak Kemble

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

  3. I Like


  4. DigiGram

    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!

  5. Prakash15

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

    1. Wes

      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. Zak Kemble

        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.

  6. vpapanik

    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 : http://www.tag-connect.com/TC2030-IDC-NL. 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. Zak Kemble

      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. vpapanik

        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 : http://www.sendspace.com/file/bm4cul

        1. Zak Kemble

          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.

  7. vpapanik

    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. Zak Kemble

      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. vpapanik

        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 : http://forum.arduino.cc/index.php/topic,113904.0.html. I am so happy that there are always so kind people out there to share their knowledge. Thanks a million Zak :)

  8. Ryan

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

  9. Lakes

    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. Zak Kemble

      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 :/

  10. chris J

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

  11. HD

    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. Zak Kemble

      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.

      1. HD

        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!

  12. andrei


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


    1. Zak Kemble

      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).

  13. Pao Nan

    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. Zak Kemble

      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. RobG

        Oooo! Will this be in the Batch 2?

        1. Zak Kemble

          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.

  14. William

    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. Zak Kemble

      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.

  15. Jay

    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. Zak Kemble

      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.

  16. kosthala

    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. Zak Kemble

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

      1. kosthala

        Hi Zack,

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

        1. Zak Kemble

          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).

  17. Jerod

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

  18. Sergey

    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. Zak Kemble

      Hey, you need to use EAGLE.

      1. Sergey

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

  19. Necbettin

    You should add BLE to communicate with smartphones.

  20. Sergey

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

    1. Zak Kemble

      You might be able to get samples from Maxim

  21. Peter Sztojanov Jr.

    Hi Zak!

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

    thank you!

  22. Zohaib Amir

    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. Zak Kemble

      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. Peter Sztojanov Jr.

        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. Zak Kemble

          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. Zohaib Amir

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

          2. Zak Kemble

            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 README.md on the github repo.

      2. Zohaib Amir

        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. Zak Kemble

          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.
          watch_20130925.zip 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. Zohaib Amir

            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. Zak Kemble

            That’s right.

          3. Zohaib Amir

            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. Zak Kemble

            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: http://forum.zakkemble.co.uk/thread-1-post-2.html#pid2

          5. Zohaib Amir

            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. Zak Kemble

            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. Zohaib Amir

            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. Zak Kemble

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

        2. Zohaib Amir

          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. Zak Kemble

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

          2. Zohaib Amir

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

  23. Jared

    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: http://jared.geek.nz/2014/jul/oshw-oled-watch

    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. Zak Kemble

      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.

  24. ryan

    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. Zak Kemble

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

  25. Zohaib Amir

    and, what is RN2? (473)

    1. Zak Kemble

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

  26. Kian

    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. Zak Kemble

      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.

  27. Electronics Subash

    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. Zak Kemble

      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.

  28. K

    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 menur3@icloud.com thank you.

    1. Zak Kemble

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

  29. Mike

    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. Zak Kemble

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

      1. Mike

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

        1. Zak Kemble

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

          1. Mike

            This update appears to have fixed it. Thanks!

  30. Dave

    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. Zak Kemble

      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 😛

  31. Dave

    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. Zak Kemble

      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 :/

      1. Dave

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

        1. Zak Kemble

          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.

          1. Dave

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

          2. Zak Kemble

            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 😛

  32. Dave

    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. Zak Kemble

      Ah fixed, should be DTR.

  33. sztojanov

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

    1. Zak Kemble

      The manual/wiki is for anyone, but it’s still a work in progress – https://github.com/zkemble/NWatch/wiki/

      1. sztojanov

        Great! :-) Can you make for us an offline version, like in pdf format?

        1. Zak Kemble

          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”.

  34. Max

    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. Zak Kemble

      Awesome 😀 Looking good!

    1. Sergey

      vibro you can manually set the buzzer instead. True Zak

  35. Sinan Akkoyun

    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. Zak Kemble

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

      All code is available at https://github.com/zkemble/NWatch/tree/master/firmware/src
      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 (https://github.com/zkemble/NWatch/blob/master/hardware/watch/1.4/schematic.png) it should just work.

  36. Hangman

    Hi Zak,

    I finally finished something like a case for your watch. It’s 3d printed in 2 parts and I tried to make it as minimalist as possible.
    If anyone is interested, on my website are some pictures and the .stl files (and everything in german).
    -> http://kekse23.de/2014.12.05/309/ein-gehaeuse-fuer-die-nwatch/

    1. Zak Kemble

      That looks really good, I like it! 😀

  37. marcello

    Could you send me a file of the pcb and code so i could make my own? At gravesmarcello@gmail.com if posable.

    1. Zak Kemble

      Everything is available at https://github.com/zkemble/NWatch

  38. Marcello

    I cant find the gerber files for the pcb.

    1. Zak Kemble

      Use EAGLE to open watch.brd/.sch (here) and use the CAM processor to create gerber files in the correct format for your PCB manufacturer.

  39. Alexander

    Hi Zak, I use display chip SH1106, runs a line from the top of the display, I can not fix the code that worked full Screen, please podskazhyte that must be corrected, thank you in advance.

    1. Zak Kemble

      Hi, I don’t have a SH1106 display so I can’t do much at the moment, but I do plan on buying one and getting it to work sometime.

  40. BitAbbas

    Pcb & hex email for me?

    1. Zak Kemble

      They can be found here – https://github.com/zkemble/NWatch

  41. Greg

    You can also use flat/slim battery (1.5-2mm) which costs about 10$, (at the capacity 100-200mAh) :)

  42. Henry

    Your oled died because his VBAT = 3.3V to 4.2V, but you put the USB voltage and it is 5V (pin 6 of oled).

    1. Zak Kemble

      The absolute max for Vbat is 5V. There is also a schottky diode which drops the voltage by at least 0.2V.

  43. Tuur

    Dude this is amazing! The only question i have is:
    Does it receive notifications? And if it does with what Android version?
    And would it be compatible with Android 4.2.2

    1. Zak Kemble

      No, the watch doesn’t have any kind of connectivity.

  44. Jack Harwood

    i wish this would come back

  45. Lewis

    Awesome job! This is one of the best DIY projects I’ve seen. I’ve used a couple of these OLED displays for other projects and I was wondering if you ever had problems with horizontal bands of differing brightness?

    1. Zak Kemble

      Thanks :)
      I’ve only had issues like that from bad power, things like a bad connection or supply voltage being too low.

  46. Hare

    Hello Zak,I’m doing a watch like you.I want to know how to make it knows it is charging,and when in sleep, alarm clock does not work until I wake it up.What should I do?
    I use arduino,but I hope you can tell me something.
    Forgive me for my poor English.

    1. Zak Kemble

      Battery charging can be detected by reading the STAT pin on the charging IC (or whatever pin has a charging state output). For alarm wakeup the RTC needs to have an alarm interrupt output connected to an interrupt input on the microcontroller (similar to how a button can wakeup the microcontroller).

      1. Hare

        alarm interrupt output isSQW PIN? Do I need to start the alarm interrupt in code? Thank

        1. Zak Kemble

          Yes (but check the datasheet for your RTC IC) and yes.

          1. Hare

            Do you create a Arduino project? I saw you writing TODO

          2. Zak Kemble

            The Arduino part is about making some kind of library for interacting with the rest of the hardware on the watch (RTC, detect USB, detect charging and battery voltage etc). I’ve not started working on it yet, though.

  47. Ben Hur


    I’m trying to make a watch like you but I want to add accelerometers and other sensors. However, you used the DS3231. On its datasheet it says it consumes 110uA standby plus a 575uA temperature conversion current. How is it possible to use it with just 2.5uA? Does its precision get compromised? Wasnt it suposed to waste a lot more power than that? Does it communicate correctly that way?

    Thanks in advance,
    Sorry for the bad english, I’m brazilian XD

    1. Zak Kemble

      The 2.5uA figure is when the RTC is being powered by Vbat instead of VCC. According to the datasheet the only difference between the two is that the temperature compensation conversion is done every 10 seconds instead of every 1 second when on Vbat. Having a lower sampling rate might effect accuracy if the temperature changes a lot in those 10 seconds, but other than that there are no issues.

  48. Surachai

    I compiled but it error.

    Build started.
    Project “optiboot.cproj” (default targets):
    Target “PreBuildEvent” skipped, due to false condition; (‘$(PreBuildEvent)’!=”) was evaluated as (”!=”).
    Target “CoreBuild” in file “C:\Program Files (x86)\Atmel\Atmel Studio 6.2\Vs\Compiler.targets” from project “C:\Users\tevada2010\Downloads\Compressed\NWatch-master\firmware\src\optiboot\optiboot.cproj” (target “Build” depends on it):
    Task “RunCompilerTask”
    Shell Utils Path C:\Program Files (x86)\Atmel\Atmel Studio 6.2\shellUtils
    C:\Program Files (x86)\Atmel\Atmel Studio 6.2\shellUtils\make.exe all
    Building file: .././optiboot.c
    Invoking: AVR/GNU C Compiler : 4.8.1
    “C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.1061\avr8-gnu-toolchain\bin\avr-gcc.exe” -x c -mcall-prologues -funsigned-char -funsigned-bitfields -DF_CPU=8000000L -DBAUD_RATE=57600 -DLED_START_FLASHES=3 -DDEBUG -DLED=D6 -DLED_DATA_FLASH=1 -Os -fno-inline-small-functions -fno-split-wide-types -fno-tree-scev-cprop -ffreestanding -fno-exceptions -maccumulate-args -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -mshort-calls -mrelax -g2 -Wall -mmcu=atmega328p -c -std=gnu99 -Wstrict-prototypes -Wextra -MD -MP -MF “optiboot.d” -MT”optiboot.d” -MT”optiboot.o” -o “optiboot.o” “.././optiboot.c”
    avr-gcc.exe(0,0): error: unrecognized command line option ‘-mshort-calls’
    make: *** [optiboot.o] Error 1
    The command exited with code 2.
    Done executing task “RunCompilerTask” — FAILED.
    Done building target “CoreBuild” in project “optiboot.cproj” — FAILED.
    Done building project “optiboot.cproj” — FAILED.

    Build FAILED.
    ========== Build: 1 succeeded or up-to-date, 1 failed, 0 skipped ==========

    1. Zak Kemble

      The compiler that comes with Atmel Studio doesn’t support ‘-mshort-calls’. I’ve been using AVR-GCC 4.7.2. Right click on optiboot in the top right side window > Properties > Toolchain tab > AVR/GNU C Compiler > Optimization > Untick ‘Use rjmp/rcall (limited range) on > 8K devices (-mshort-calls)’.

  49. John S

    Hi I really like your project. I’m thinking of doing something similar myself. Question: wouldn’t a two diode setup work for the load sharing instead of your switching mosfet? Sure you have a voltage drop, but you’re dropping the V from 3.7 or so down to 2.5 anyway. Just wondered if you thought about this or not. Your project seems very well thought out.

    1. Zak Kemble

      Thanks :) Yeah you could replace the MOSFET with a diode, though the OLED and buzzer run straight from the battery so they won’t be quite as bright or as loud. It’s personal preference I suppose, MOSFET method works better but adds a little more complexity.

  1. How Much Can You Cram Into a Wristwatch

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  2. rndm(mod) » How Much Can You Cram Into a Wristwatch

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  3. How Much Can You Cram Into a Wristwatch - RaspberryPiBoards

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  4. How Much Can You Cram Into a Wristwatch — Blog of MPRosa

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  5. IT青年舍 » How Much Can You Cram Into a Wristwatch

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  6. What I found worth reading on the interwebs ;) 28/09/2013 | godzillor labs

    […] functional and not overly bulky is very, very hard. [Zak], though, makes it look easy. He started his DIY digital wrist watch to see how much he could cram into a watch-sized device. The finished product is really incredible, […]

  7. CJ Labs » Impressive DIY Digital Wristwatch

    […] I’ve been wanting to make something like this for a long time but I never did. This is truly impressive. It’s very nice looking and keeps a decent size. He has posted the schematics and source code on his website. […]

  8. ATmega328P powers this slick DIY wristwatch | Bits & Pieces from the Embedded Design World

    […] “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,” Kemble wrote in a recent blog post. […]

  9. DIY Digital OLED Wriswatch with an ATmega328P | labratsgonewild

    […] watches are grand – been there for many years and I prefer them over digital watches, well this watch from Zak Kemble might just be an exception (Yes! its an exception!). Zak’s goal was to fit as much features […]

  10. DIY Digital Wristwatch #WearableWednesday « adafruit industries blog

    […] DIY digital wristwatch would come in handy in many situations but i especially like the ability to set up to 10 alarm […]

  11. DIY Watch uses OLED screen and ATMega328 - Hackalizer

    […] anticipated too huh?   How’s 1.5mm thick sound ?   Sounds pretty good to me too.  Zak has a really awesome writeup of him rolling his own […]

  12. WristWatchReview.com >> A Very Impressive DIY Watch

    […] 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. […]

  13. Developer I/O » Awesome DIY watch

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

  14. Ein Gehäuse für die N|Watch

    […] 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 […]

  15. I call it the Blue PIXie board…… (part 1) | bagaloozy

    […] A lot of the inspiration for this project came from the excellent work done by Zak Kemble at his blog. […]

  16. OLED WATCH | Christian Arnø

    […] couple of weeks ago i saw this project by Zak Kemble here:http://blog.zakkemble.co.uk/diy-digital-wristwatch/. I emediately wanted to build one myself using off-the-shelf […]

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>