Arduino on the ID100HR fitness tracker

posted in: BLE, Bluetooth, nRF51822 | 20

Some time ago…, Goran Mahovlic commented about how he was trying to run Arduino on an IDo 003, fitness tracker / smart watch which uses the nRF51822. As I’ve been interested in smart watches for some time, I thought I’d buy the same watch, and join in the fun.

Unfortunately the first watch I bought didn’t contain an nRF51822 (see my other post about nRF51 based smart watches), so I ordered 2 more of different types, and finally after another 2 weeks, an ID100HR arrived and to my relief it did use an nRF51822, even even better it was the QFAC variant which has 256k flash and 32k RAM.





The spec for this watch are:

MCU: Nordic nRF51822QFAC (256k flash , 32k RAM)

Operating clock frequency: 16Mhz

Realtime clock crystal : 32khz

Display: 0.49 inch OLED display (64×32 pixels) which uses the SSD1306 display controller

Motion sensor: Kionix kx022-1020

Heart rate sensor: Silicon labs Si1142

Battery: LiPo 60mAH

Charger: USB cable with 3 pins (5V, GND, 5V), (No PSU is supplied). The cable just connects 5V from the USB cable, so the battery charge controller must be inside the watch.

One push button and a vibration alert (motor)


Pin Assignments for the most of these watches seems to be as follows

RX pad P0.17
TX pad P0.18
Vibrate P0.07
Button P0.04 Needs input_pullup
Accelerometer (I2C)
P0.10-16 possible range of pins used
P0.16 SCL
P0.15 Possibly IRQ
P0.14 SDA
P0.0  Data/Command
P0.1 Reset
P0.2 Chip select



Whats great about this watch, is that they have labelled the SWDIO and SWCLK pads, and also that they have even broken out 2 pins to 2 pads labelled TX and RX.


So its easy to connect either a JLink or Blackmagic probe to the SWD pins to reprogram it.





I also like to thank Goran Mahovlic for his work on the ID003 smart watch, and in turn to thank the Espruino guys for giving Goran something to work from…


michael.thomas has requested the source coded I used in the Youtube video. The video was done around 18 months ago, so I don’t know whether this code still works as libraries and cores change all the time

But here is some code I found on my hard drive related to the ID100HR

20 Responses

  1. sandeep ponnuru

    Wow, this is amazing Roger! I am astonished at your curiosity and discovery nerve. I was wondering if you have any advice on their bracelet version ID115HR.

    Do you think this might also be re-programmable?

    Thank you very much,

  2. Roger Clark

    Its very hard to know if a product listed on these sites like geekbuying is reprogrammable.
    I have wasted money buying 4 watches which were not what they claimed to be.

    Theoretically the ID115HR contains a nRF51822 which should be reprogrammable, but you are not guaranteed to get a nRF5x based device from that supplier, as the MCU part number of not listed in the advert, so you would have no recourse to get a refund if it didnt have a nRF51 of nRF52

    Even if a product is listed as containing nRF51 or nRF52, the only way to know for sure is to open the watch, and doing this will mean you will have difficulty getting a refund if you need to send the watch back.

    I know someone who recently bought a ID107HR Plus, which contains a nRF52 but when he received the watch he found it was the older ID107HR (nRF51). He know straight away that it was a different model, as they look different, but even then I’m not sure if he managed to get a refund.

    So its pretty much pot luck when you buy these.

    Additionally, I don’t think anyone has reverse engineered the peripherals e.g display, and motion sensor and HR sensor, on that watch, so you would have to do this yourself, which is not an easy process, especially with the display, as they rarely have meaningful part numbers on them

  3. Mark Cooke

    Hi Roger, i was wondering if you could tell me the pinout of the rear ribbon cable (going to the si1142). Thanks!

  4. Roger Clark

    I don’t have any more information than what I’ve already written in this post

  5. Jim

    I have a RedBear BLE device transmitting temperature which can be shown on an Android device using Nordic’s nRF toolbox.
    Has anybody been able to receive and display data from a BLE device on these watches?

  6. Anon

    Ya know … why don’t you just suck out the code and start reversing a little bit of it (for the DFU boot loader at least)? Yes, the part is read-back locked, but there is a flaw in the SWD interface on the nRF51 … google it.

  7. Roger Clark

    Did that last year, but I don’t post about those sorts of things as they can result in sites getting taken down by DCMA requests

  8. acassis

    Hi Roger,
    Very interesting! I will try to get one of this watch to install NuttX on it (but I didn’t finish the nRF52 port yet).
    Do you know for sure some watch that will come with nRF52 instead of nRF51?

  9. Roger Clark

    Yes. The ID107HR Plus uses a nRF52832

  10. acassis

    Thank you very much Roger!

  11. Roger Clark

    I don’t know if anyone has done any actual BLE programming with these devices.
    Things are in very easy stages of reverse engineering and have been focussed on getting the external peripherals working.

    However I see no reason why things like Nordic’s beacon examples should not work

    But it may be easier just to use Nordic’s SDK to build these, rather than RBL’s or Sandeeps version of the BLE examples

  12. West Coast UAV

    Hi Roger, I was wondering you the code you put together for the example on the youtube video could be made available please?
    Thanks, Michael

  13. Roger Clark

    Michael, I’m not sure if this a duplicate comment. But I’ve posted a link in the bottom of the article….

  14. wassfila

    Hi Roger,
    I just got a smart band N108 from Amazon clearly mentionning nrf52832, nRF connect shows a firmware update service.
    Would that mean it is possible to flash own sw without opening it, or would it require the knowledge of a particular bootloader ?

  15. Roger Clark

    You can try flashing a new application, however the problem is that some of these watches do not use the standard updating bootloader.
    They use a different application or bootloader-update address

    But if you are lucky they will have used the default address.

    See if you can find a firmware update file for the watch, because they normally contain the soft device and if you compare with the soft devices you can download from Nordic’s site, you can figure out what version of the SDK they used to build the application.

    Then you could build your own firmware using the same API version.

    However, normally the application needs to have code in it to get back into firmware update mode, as this is part of the bootloader (well an extension to the bootloader), which your application has to jump to when the user requests to update e.g. via a command via a custom service

  16. Michael Thomas

    Hi Roger
    Many thanks for this great guide, and also sharing your code.
    We are having trouble getting the OLED Display examples to compile.
    We get the following error:
    no matching function for call to ‘MicroOLED::MicroOLED(mbed::SPI&, PinName, PinName, PinName)’
    Just wondering if you knew what the issue might be?
    We are using the RBL core.
    Many thanks for your help.

  17. wassfila

    Thanks for all those hints, I’ll start by practicing firmware update on an open nrf52 dev kit, then attempt on closed devices, if this works, it would be a great alternative to opening the watch.

  18. Roger Clark


    Its not something I’m actively working on at the moment, so I can’t remember the details of the that.

    I recommend you use Sandeep Mistry’s Arduino nRF5 core which is downloadable from github and perhaps post a bug to that repo if some libraries don’t work

  19. Michael Thomas

    Thanks Roger. We got it to work by adding #include “mbed.h” to the start of SFE_MicroOLED.h library.

    We’re using RBL core as this supports BLE Central role. Unfortunately Sandeep’s Arduino nRFF5 core doesn’t seem to support BLE Central role.

  20. Roger Clark


    Thats good.

    Thanks for letting me know…

    I find RBL’s code a confusing mash-up as it mixes both MBED and also Arduino methods, but at least it works 😉