The $45 Focus Dial That Actually Works: M5Stack Dial
Build the ultimate DIY Focus Timer for $45, no soldering required! We turned the M5Stack Dial into a physical productivity tool that automates "Focus Mode" on macOS and Windows via USB. Master the Pomodoro technique with this plug-and-play guide
Sponsored by OpenELAB
If you have been chasing the perfect focus timer for way too long. You know the type something physical that sits on your desk, lets you twist a dial to set a timer, and triggers your entire workspace into "Do Not Disturb" mode without ever touching your phone. The idea isn't new. There was even a Kickstarter project called TimeChi that promised exactly this. Spoiler: it never shipped.
When we came across this Instructables guide, we were excited, finally, someone had built it! But then we looked at what it actually required: 15+ components from different suppliers, hours of soldering, 3D printing both FDM and resin parts, mixing silicone rubber with titanium dioxide for a diffuser (yes, really), and a firmware setup that looked incredibly complex. The guide was comprehensive, but let's be honest, it was way too much of a commitment.
Fast forward to a few months ago when OpenELAB reached out with a list of products they could sponsor. As soon as we saw the M5Stack Dial on that list, the focus dial idea immediately clicked. This was it, a 1.28" round touchscreen, rotary encoder with a button, ESP32-S3 with WiFi and Bluetooth, USB-C connectivity, and it costs $45. Everything we needed, already assembled.
This was our chance to finally build the focus dial properly, without the weekend-consuming assembly process.
A Word on Our Sponsor
OpenELAB is a Munich-based company that distributes electronic development modules in AIoT and robotics. Their online shop is openelab.io. As an official European partner and trusted collaborator, they work with leading IoT hardware manufacturers such as Seeed Studio, Ai-Thinker, M5Stack, LILYGO, and Waveshare to deliver reliable, cutting-edge components with competitive pricing and dependable delivery. OpenELAB empowers all developers, from beginners to professionals, helping you turn ideas into reality.
What Makes a Good Focus Dial Anyway?
Before diving into code and automation, we needed to figure out what actually makes a focus dial useful versus just another desk toy that collects dust after two weeks.
The core idea is simple: you need something physical that starts a focus session without touching your phone. That's the whole point. Your phone is the problem, it's both your productivity tool and your doom scroll machine. Using your phone to trigger "Focus Mode" is like trying to diet while living in a bakery.
But it can't just be a timer. If it only does one thing, it'll end up in a drawer. So the M5Stack Dial needed to be a clock, an alarm, a Pomodoro timer, and a focus trigger, all in one device that looks good enough to keep on your desk.
The automation part was critical too. When you press that button, your MacBook should go into Do Not Disturb mode, lights to dim to a warm white, and some background music to start. When the timer ends, everything reverses. No manual steps, no "remember to turn off notifications", just press the button and the workspace transforms.
And here's the kicker: it needed to work on both macOS and Windows. The original DIY build only worked with iOS through shortcuts, which locked out half the potential users.
The Development Hell: Four Failed Attempts
Getting this to work took longer than we want to admit. We tried four different approaches before landing on the solution that actually works.
Attempt 1: Bluetooth Audio Emulation
Our first idea was to make the ESP32-S3 pretend to be a Bluetooth headphone. iOS Shortcuts can auto-trigger when specific audio devices connect, so in theory, the dial could connect via Bluetooth and iOS would recognize it and run the automation.
Except the ESP32-S3 can't emulate a Bluetooth audio device. It does only BLE (Bluetooth Low Energy) for data transfer, but it can't pretend to be AirPods. iOS never saw it. Dead end.
Attempt 2: HomeKit Integration
Next, we tried using the Arduino HomeKit library to register the dial as a HomeKit accessory. Then we could trigger automations through the Home app like any other smart home device.
This... did not go well. We spent days editing the library code, wrestling with certificate generation, and debugging errors that made no sense. When it finally showed up in the Home app once, iOS immediately flagged it as "Not Compatible" and refused to pair. After that, it never appeared again no matter what we tried.
Lesson learned: Apple's smart home protocols are landmines. Apple changes HomeKit constantly.
Attempt 3: NFC Tags
The M5Stack Dial has built-in NFC, so we figured we could use it to trigger iOS Shortcuts via NFC automation. Except the NFC module can only read or write NFC tags, it can't emulate one, which is what iOS needs to trigger automations. You'd need to stick a physical NFC tag on the device, which defeats the entire purpose of having the NFC module in the first place.
Attempt 4: Bluetooth HID Keyboard
Getting desperate, we tried making the ESP32 act as a Bluetooth keyboard and send hotkeys wirelessly. The library documentation even warned that macOS support was "very funky," which should have been the first red flag. In practice, key presses didn't register consistently, the behavior was unpredictable. It felt janky, exactly what we were trying to avoid.
The Solution: USB HID (Or Why Wired Actually Works Better)
After weeks of failed wireless experiments, we went back to basics: what if the dial just pretends to be a USB keyboard?
The ESP32-S3 has native USB support. Using the USB.h and USBHIDKeyboard.h libraries, we could make the M5Stack Dial emulate a wired keyboard that sends specific key combinations when the timer starts or stops.
The implementation is surprisingly simple:
#include "USB.h"
#include "USBHIDKeyboard.h"
// When timer starts
Keyboard.press(KEY_LEFT_CTRL); // Hold Control
Keyboard.press('1'); // Press '1'
delay(50);
Keyboard.releaseAll();
// When timer ends
Keyboard.press(KEY_LEFT_CTRL); // Hold Control
Keyboard.press('2'); // Press '2'
delay(50);
Keyboard.releaseAll();
That's it. The dial sends Ctrl+1 when a focus session starts and Ctrl+2 when it ends.
And here's why this works so much better than we expected: there's no pairing, no connection issues, it's just a USB device. Plug it in and it works. Both macOS and Windows recognize USB keyboards instantly. You can bind these key combinations to anything: macOS Shortcuts, Windows PowerToys, AutoHotkey scripts, Alfred workflows, BetterTouchTool triggers. And it's rock-solid reliable, no dropped connections, no latency, no weird pairing bugs.
The pivot from wireless to wired turned what felt like a limitation into the most versatile feature. Sometimes simple is better.
DIY vs M5Stack Dial: Not Even Close
The original DIY build cost around $80-100 in parts and took 8-12 hours to assemble if you were fast and knew what you were doing. You needed soldering skills, access to a 3D printer (ideally two different types), and patience to debug inevitable issues. The M5Stack Dial costs $45 from OpenELAB, takes 5 minutes to flash the firmware, and requires basic computer skills at most.
The DIY version only worked with iOS and even then, the Bluetooth automation was hit or miss. The M5Stack Dial with HFOS works on macOS, Windows, and Linux with rock-solid USB HID reliability.
Hardware
All you need is one device, the M5Stack Dial v1.1
- M5Stack Dial v1.1 - OpenELAB $45.00 (Use Couple
adrelienfor 5% OFF) | Aliexpress $50.64
Software
If you want to build this yourself, you'll need an M5Stack Dial V1.1, a USB-C data cable, and either Arduino IDE or VS Code with PlatformIO installed.
Installation Steps
Download HFOS Firmware: GitHub: HFOS M5Stack Dial
- Clone the repository:
git clone https://github.com/HarborScale/hfos-m5stack-dial.git
cd thos-m5stack-dial
- Open in your preferred IDE
- Add M5Stack board to Arduino IDE
- Go to File → Preferences
- Add to "Additional Board Manager URLs":
https://static-cdn.m5stack.com/resource/arduino/package_m5stack_index.json - Go to Tools → Board → Board Manager
- Search "M5Stack" and install "M5Stack by M5Stack"
- Select board: Tools → Board → M5Stack → M5Stack-DIAL
- Install required libraries:
- M5Dial
- M5GFX
- Configure your settings in
HFOS.ino:
const char* WIFI_SSID = "YOUR_SSID";
const char* WIFI_PASS = "YOUR_PASSWORD";
#define TIME_ZONE_OFFSET_HRS +3 // Your UTC offset
- Build and upload to your M5Stack Dial
The device will boot, connect to WiFi, and you're ready to go. Navigate to Settings to sync the time via NTP and toggle 12/24-hour format if needed.
Once HFOS is installed, the device acts as a USB Keyboard. Because of this, it may not come as a COM port again
To fix this, you must manually enter "Download Mode":
- Locate the two buttons on the back of the M5Stack Dial. One on the sticker labeled "BTN" and one on the side labeled with rotating arrow.
- Hold down the button labeled BTN.
- While holding BTN, press the RESET button once.
- Release the BTN button. The screen will remain black, but the device will now appear as a COM port on your computer, ready for a new upload.
Setting Up the Automation
On macOS:
- Open the Shortcuts app
- Create your "Focus Start" automation
- Click the (i) info icon → Add Keyboard Shortcut →
Ctrl+1 - Create your "Focus End" automation
- Assign
Ctrl+2hotkey
On Windows:
- Use PowerToys Keyboard Manager or AutoHotkey scripts
- Assign your automation scripts to
Ctrl+1andCtrl+2
If you want to customize the firmware, change the hotkey combinations or add features, it's all in HFOS.ino . Change the key definitions, rebuild, and upload. The code is open source and designed to be hackable.
HFOS: The Firmware
We built a custom firmware called HFOS specifically for this project. It's designed to be multi-functional, not just a focus timer, but also a clock, alarm, and visual indicator of your current state. The full source code is on GitHub.
When you first power it on, the device connects to WiFi using the credentials you've configured in the code. From the main menu, you can navigate between four apps by rotating the dial: Clock, Timer, Alarm, and Settings. Tap the screen or press the rotary button to enter an app, and press the rotary button to go back to the menu.
Clock Mode
The clock displays the current time with a simple, clean interface. The date appears below in a smaller font. You can switch between 12-hour and 24-hour format in the Settings app.
Timer Mode
This is where the focus dial magic happens. Rotate the dial to set your duration (10 seconds to 59 minutes in 10-second or 1-minute increments depending on how fast you turn). The screen shows your set time with a progress gauge around the edge. Tap to start the timer.
When the timer starts, the dial sends Ctrl+1 to your computer and begins tracking. The gauge count down with orange ring as time progresses, showing exactly how much time remains. When the timer completes, it sends Ctrl+2 and plays an alert tone. The screen displays "TAP TO STOP" until you acknowledge it.
You can pause the timer mid-session by tapping once, it remembers where you left off.
Alarm Mode
Set an alarm by rotating the dial through hours and minutes. Tap to cycle through setting the hour, setting the minute, or toggling the alarm on/off. When the alarm is enabled, the outer ring turns orange. When it rings, you'll see the same alert screen as the timer with an audible tone. Tap to Stop.
Settings App
The Settings app has two functions. Tap the top half of the screen to sync time via NTP over WiFi, this pulls the current time from internet time servers and updates the clock. Tap the bottom half to toggle between 24-hour and 12-hour time format. A small indicator shows which mode is active.
The Stand: Making It Actually Usable
One thing we discovered pretty quickly: the M5Stack Dial doesn't sit flat on a desk very well. We found this 3D-printable stand on Printables that props it up at a perfect angle for desk use.
But with one suggestion: laying the dial on its back (with the USB-C port pointing up) was actually more stable than the typical orientation. So you can rotate the screen 180 degrees in the firmware (SCREEN_ROTATION 2) so the display shows right-side-up even though the device is flipped. This way, the cable comes in from behind, the stand keeps everything stable, and the dial sits at the perfect viewing angle on your desk.
Does It Actually Help?
We've been using this setup daily for a few weeks now, and honestly, it's made a bigger difference than we expected. The physicality matters more than we thought it would. Having a dedicated device to start focus sessions creates a ritual. Twist the dial to 25 minutes, press the button, and the brain knows: "Okay, it's work time." The lights dim, music starts, phone goes silent, all without touching the phone.
The Pomodoro Technique actually sticks when there's a physical device enforcing it. If you are terrible at taking breaks, when the timer ends and the alert plays, it's harder to ignore than a phone notification you can swipe away. The physical device demands acknowledgment.
There are some quirks. The USB cable is visible, which isn't as clean as a wireless device would be. You need to be at your computer since it emulates a USB keyboard, you can't trigger focus mode from across the room. And occasionally on macOS, the system doesn't recognize the hotkey immediately after waking from sleep (unplugging and replugging fixes it, but it's annoying).
But overall? It works. And it works reliably, which is more than we can say for any of the wireless attempts.
Why Physical Tools Still Matter
We live in a world drowning in productivity apps. There's a browser extension for everything, a phone app for every problem, a SaaS solution for every workflow. But here's the thing: the device running those apps is also the source of infinite distraction. Your phone has both your todo list and TikTok. Your computer has both your work documents and Reddit.
Using the same device to fight distraction is fundamentally broken. Physical separation works. The Focus Dial creates a boundary, it's a dedicated tool with one job. It doesn't have notifications. It doesn't have social media. It doesn't have "just one more video." It's a dial. You twist it, press it, and go to work.
In a weird way, it brings back the simplicity of analog productivity tools, kitchen timers, desk clocks, and bells, but with the power of modern automation. It's the best of both worlds.
Final Thoughts
The original DIY Focus Dial was a beautiful idea trapped in a nightmare of execution. The M5Stack Dial with HFOS is that idea actually realized, a plug-and-play productivity tool that works out of the box.
For $45, you get a functional desk accessory that's also a clock, alarm, and Pomodoro timer with real automation that works across platforms. No soldering, no 3D printing, no weekends lost to debugging Bluetooth pairing issues.
This is the Focus Dial that should have existed from the start. If you're tired of fighting your phone to stay focused, if you've tried every app and browser extension and still find yourself doom scrolling, if you just want a simple tool that works, this is it.
Comments ()