3D Printed Rotary Time Tracker for Task Management

Track your tasks at your desk when working from home using magnets!

Public Chat
Similar projects worth following
Working from home has made it incredibly easy to get distracted on the computer. I like to organize and structure the objectives I spend time on while at my desk.

I've seen those time tracker programs and/or gadgets like Timeflip2 that you can buy suited for this need, but why use waste money when you can hack your own?

Lastly, I didn't really like the rotate a cube for a task. I wanted something more...magical, with magnets of course.

This gadget rotates between different tasks/activities using magnets to lock in place, records the status on the computer, and then can be viewed on a daily basis the distribution of tasks.

Tasks are in a circular pattern, identified by a 3D printed gray encoder inside the device. The LED in the center is filtered through the gray code and read by the photoresistors to identify the status of the task.


I found myself struggling with structuring my time when the new work from home life began. I don’t think I’m the only one whose gaming desktop has now become their work desktop too! It’s mighty tempting when that StarCraft icon is right next to your Outlook icon. Nevertheless, I needed a solution to structure and compartmentalized my time accordingly. I wanted a sleek way to record my time spent between work functions (meetings, coding, writing, email,  and project management) and personal functions (hardware hacking and gaming).

There are tools out there that do this on the software side and hardware side. But why would I overpay someone to do that when I wanted to make an open-source, free solution available for everyone? Also, those devices I saw didn’t use magnets, and I wanted to make something with magnets in it.


The gadget consists of two main 3D printed parts a base and a top. The base contains three photoresistors, and a spindle in the center with a green LED inside to shine light into the top. The top of the device rests on a spindle in the center with a 608 bearing to rotate freely. Inside the top, there is space for the LED light to shine and reflect off the inside surface to be filtered by a simple 3D printed 3-bit gray encoder (info on a gray encoder: Light is blocked from the encoder that is in between the light source and the photoresistors, where the signal from the photoresistors can be filtered to a binary code using an Arduino to identify what ‘task/activity is being represented. As I mentioned, I wanted to use magnets in this project, no I needed to use magnets. There was a problem with how to ‘lock’ the task in the correct coordinate, but I was pleased with the rotation along the spindle and wanted the top to be separate from the base. My problem was solved by eight evenly spaced magnets inside the top and bottom translated in between each other with the magnets in a repelling orientation (i.e. North facing North). This ensures that the top spindle will stay fixed in a specific location and is very satisfying to move from one position to another with subtle haptic feedback.

Look at that awesome rotation, all thanks to magnets.


I wrote some simple software to record the device's status from a serial output to the computer and record the time and task to a file for display. The second piece of software was written to display the daily task breakdown.        


Lid connects to Encoder Disc. Label fits over lid.

netfabb - 211.21 kB - 07/16/2021 at 19:14



This is the 3-bit gray encoder disc. Line the 3 bits off position with task 0 on the lid.

netfabb - 398.13 kB - 07/16/2021 at 19:14



The label model sits on top of the top lid, meant to be changed for individual needs. Pause print for filament change on icons.

netfabb - 452.23 kB - 07/16/2021 at 19:14



First design was to keep photo sensors shielded but that didn't work, opted for just photo sensors placed at hole location.

netfabb - 248.81 kB - 07/16/2021 at 19:14



With locations for pin drops for the photo resistors and LED.

netfabb - 176.35 kB - 07/16/2021 at 19:14


View all 6 files

  • 1 × Green LED
  • 1 × Breadboard Electronic Components / Misc. Electronic Components
  • 10 × Male 2 Male Jumper Wires
  • 3 × 300k Resistor
  • 1 × 330 Resistor

View all 10 components

  • Designing the Gray Encoder Top.

    quincy07/17/2021 at 18:58 0 comments

    Let me start this by saying:

    I’m not an expert on anything I’m about to talk about.

    But I do think it’s worth having an in-depth look at how I got this device to work and how the Gray Encoder works.

    When I first sat down to design the Task Tracker. I had two constraints:

    • I didn’t want it to be some rotation cube or dodecahedron like what you can currently get commercially. I also struggle to see how this is different than an accelerometer with some fancy frontend.
    • I didn’t want it just to be a ‘knob turn’ There would be plenty of ways for me to just 3d print something on top of some pre-existing knob or dial indicator. Where is the fun in that? That was when I first thought of using photons as my signal. This would allow me to be able to keep the top floating (with magnets, of course) and not reliant on any actual mechanically rotating shaft. So I added an LED and some photoresistors. The two photos below show the proof of concept I was working with 8 digits (3-bit resolution).

    In the first photo, we see that light emits onto all photoresistors sending the value to ‘1 1 1’ or 7 when converted to decimal. In the second photo, the middle sensor is blocked, corresponding to ‘1 0 1’ or 5. Here lies the interesting problem in implementing this practice. The rotation of the dial in the device should correspond to eight specific positions; in ideal conditions, it should just count as position 0, 1, 2, … to  7. Let's see what that looks like in just binary around a circle.

    (photo credit:

    Here white means 0, and black means 1. Starting at the top, going counter-clockwise, we see our immediate problem: ‘000’, 001’, ‘010’ (read from the center of the circle to the outside). Right there. Transitioning from ‘001’ -> ‘010’ means you have to switch two bits at once. If you have an imperfect system (for example light shining through a small slit and detected with a photoresistor) the signal-to-noise ratio is very high, and switching two bits at once can confound results. So we need a system that only turns one bit at once while still being addressable to ensure we know we changed states. Enter the Gray Code (

    New design:

    (photo credit:

    Here, we start in the same sequence: ‘000’, ‘001’, but next is ‘011’. So this next state of ‘3’ is only a one-bit movement away from ‘1’ and this applies for all numbers from 0-7, even 7->0 is very convenient when we want to ensure that we know when a state transition happens.

    Lastly, I want to ensure I translate the sensor values to a position that is interpretable back to the human, so I must convert the gray code back to a number. In code, this looks like this:

    int gray_to_num(int s[])
      int num = 0;
      //convert array to int
      for (int i = 0; i < 3; i++)
        num += s[i] << i;
      // Convert Gray Code num to Decimal
      int mask = num;
      while (mask)
        mask >>= 1;
        num ^= mask;
      return num;

    The overall code (under the Arduino file TaskTrack.ino in the resources section) posts to the serial what position is the device in, the only thing left for the user to do is to make sure the Lid.stl icons are aligned with the correct code status, and that the order in the software on the computer (to be posted is correct).

    The next update will be about the sensor results and getting the signal conditioning correct.

  • Project License

    quincy07/16/2021 at 19:32 0 comments

    project license: Attribution-ShareAlike (CC-BY-SA)

View all 2 project logs

Enjoy this project?



EK wrote 07/19/2021 at 21:04 point

Clever trick with the lights and encoder disk!

  Are you sure? yes | no

quincy wrote 07/19/2021 at 23:28 point

I'm glad you like it, I thought it was better than some boring dial!

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates