Turn a ~$20 M5StickC Plus into a live knife-sharpening angle coach. It magnets straight onto the flat of your blade — the stick already has a magnet in its back — and the screen fills with color so you can feel your angle drift without looking up from the stone:
- 🟩 Green — you're holding the target angle
- 🟦 Blue — too low, raise the spine
- 🟥 Red — too high, lower the spine
Plus automatic per-side stroke counting (for balanced bevels), an optional out-of-tolerance buzzer, and an end-of-session summary.
New here from r/sharpening? 👋 The fastest path: pick a supported device (see What you'll need), then flash it in your browser — no coding required.
1.0. The core loop — calibrate, hold the colour, count the strokes, read the summary — has been stable on the bench for months, so this is the release that stops calling itself a preview. One new thing on screen:
- Battery icon in the top-right corner of every screen: four bars, a + beside it while it's charging over USB, a single dash if the reading isn't available. It's polled once every ten seconds, so it costs nothing you'd notice.
The rest of what's below shipped in v0.3.0 and is unchanged here.
The angle reading sits still now. A sharpening stroke pushes the blade sideways, and the filter's guard against that was nearly blind to it: 0.18 g of sweep — the level the firmware already counts as a stroke — tilted its gravity reference 10.2° while barely changing its magnitude, so it sailed through unrejected. v0.3.0 averages the gravity reference before it steers the angle (stroke acceleration cancels out over a cycle, gravity doesn't) and stops the displayed number and the colour from flip-flopping on sub-degree noise. Simulated, that's 2.3–4× steadier depending on how fast you stroke.
Steady mode is on by default, and you can still switch it off on the device — hold B on the TOLERANCE screen — to compare against the old behaviour on the same knife, same stone, in the same session.
Also new:
- Accuracy check — hold A on SET TARGET. Lay the device flat, press A, then stand it on a known angle and read the number at 0.1°. Answers "is this thing actually right?" in about twenty seconds. There are printable wedges if you don't own an angle block.
- Time on-angle — the session summary now shows what share of the session you held inside tolerance. Stroke count says how much you did; this says how well, and it's the number that should climb as your technique does.
- Past sessions — hold B on the summary screen for your last five.
- Gyro bias refreshes whenever the device is verifiably still, so thermal drift doesn't accumulate across a long session.
Fixes:
- A crash, reset, or reflash no longer leaves a zombie session that comes back as RESUME? for the previous knife (and its zero) the next time you sleep and wake.
- Session time now survives Plus / Plus2 deep-sleep resume, same as stroke counts and time-on-angle. It used to reset to
00:00because it was a rawmillis()stamp. - Power-key on Plus2 / S3 no longer treats the wake / power-on press as “off.” Plus2 was going back to sleep when you let go; S3 could power itself off immediately after boot.
From v0.2.1: the 25° and 28° presets (B cycles 12° / 15° / 17° / 20° / 22° / 25° / 28° / CANCEL), a splash that shows the real firmware version, and pinned build dependencies so a release rebuilds byte-for-byte.
⚡ Flash the update in your browser — takes about a minute, no tools needed. What would help most: does green still arrive fast enough? Smoothing trades response for calm — if green now feels late, that's the thing worth telling me. Open an issue either way. The diagnostic builds can measure the old vs. new filter on your own hardware.
This is the part that makes the number trustworthy, and it's easy to miss because it looks like setup friction.
Most digital angle gauges measure raw tilt. Stick one on a blade even slightly skewed — rotated a few degrees toward the tip — and the number is wrong, with nothing on screen to tell you. You'd have to notice by feel.
The two-step calibration captures a flat reference and the cutting edge's hinge axis, then measures the bevel as rotation about that axis. Lengthwise skew drops out of the maths entirely. A crooked mount reads the same as a straight one, and one calibration serves both faces of the blade — flip the knife, keep sharpening.
That's why there are two steps instead of one. It's not setup; it's the reason the reading means something.
This is a hobby project, shared because people asked for it — not a precision instrument. It's a coach to build muscle memory, not a jig that holds the angle for you.
- It tells you where your angle is; you still do the sharpening. Don't trust it blindly on an expensive knife until you've checked it — there's a built-in accuracy check (hold A on SET TARGET) and there are printable angle wedges to check it against.
- Stroke-count and filter thresholds are still being tuned against real sessions — counts may be off by a stroke or two. Feedback welcome (see Contributing).
- Mind the edge: you're handling a sharp knife near a small electronic device. Go slow the first few passes.
Basically just the stick — roughly $20. The M5StickC Plus already has a magnet in its back, so there's nothing else to buy.
| Item | What to get | Search terms | ~Cost |
|---|---|---|---|
| The device — pick one | Three boards are supported. |
— | — |
| M5StickC Plus ✅ | Fully validated on real hardware. ESP32-PICO, MPU6886, 1.14" ST7789V2, AXP192, passive buzzer. | M5StickC Plus ESP32 |
$18–25 |
| M5StickC Plus2 |
Compile-verified + code-reviewed against M5Stack datasheets; needs a community tester — please flash and open an issue. ESP32-PICO-V3-02, MPU6886, same screen, no PMIC, passive buzzer. | M5StickC Plus2 |
$20–28 |
| M5StickS3 |
Compile-verified + code-reviewed against M5Stack datasheets; needs a community tester — please flash and open an issue. ESP32-S3, BMI270, same screen, M5PM1 PMIC, codec speaker. | M5StickS3 |
$25–35 |
| USB-C cable | A data cable (not charge-only) to flash it. You probably already have one. | — | — |
That's the whole shopping list. All three supported sticks have a magnet built into their back, so they stick to a steel blade with nothing extra. If your unit's built-in magnet doesn't grip firmly enough, glue on a small neodymium magnet (~10 × 5 mm N35, a ~$1 add-on) with 5-min epoxy or VHB tape.
Why these three M5Stick models? From v0.2.0 the firmware is board-guarded at compile time (
src/board.h, build flagSG_BOARD_*): each board gets its own binary, built from one codebase, that adapts to its IMU (MPU6886 on Plus/Plus2, BMI270 on S3), power management (AXP192 on Plus, G4 hold-pin on Plus2, M5PM1 on S3), and status LED pin. If you accidentally flash the wrong binary, the firmware shows a red WRONG FIRMWARE screen instead of misbehaving silently. If you already own a Plus, you're set. If you have a Plus2 or S3 — please try it and report back.Board support status: M5StickC Plus — validated on real hardware. M5StickC Plus2 and M5StickS3 — compile-verified and code-reviewed against the M5Stack datasheets, but not yet confirmed on a physical device (the maintainer does not own them). All three share one codebase. If you have a Plus2 or S3, please flash it and open a GitHub issue with your results.
The M5StickC Plus has a magnet in its back, so there's no assembly: just press it onto the flat of the blade, screen facing you. No soldering, no glue, no wiring.
Optional: if the built-in magnet doesn't hold firmly on your knife, glue a small neodymium magnet (~10 × 5 mm N35) to the back with 5-minute epoxy or VHB tape.
- Open miamimoe.github.io/digital-sharpening-guide in desktop Chrome, Edge, or Opera (Web Serial isn't supported on Safari, Firefox, or phones).
- Plug your device into your computer with a USB-C data cable.
- Select your board from the device picker (M5StickC Plus / Plus2 / S3), then click ⚡ Flash it now, pick the serial port (often shown as CP2104 / USB Serial), and hit Install.
- If the device doesn't show up, install the CP210x USB driver and reconnect.
A prebuilt binary is also attached to every GitHub Release if you'd rather flash with esptool yourself (offset 0x0).
Requires PlatformIO:
git clone https://github.com/miamimoe/digital-sharpening-guide.git
cd digital-sharpening-guide
pio run -e m5stick-c-plus # build for M5StickC Plus
pio run -e m5stick-c-plus2 # build for M5StickC Plus2
pio run -e m5stick-s3 # build for M5StickS3
pio run -e m5stick-c-plus -t upload # flash over USB (change -e for your board)
pio device monitor -b 115200 # serial log
pio test -e native # run the desktop unit testsThe only library dependency is M5Unified (pulled automatically).
Once flashed, the device walks you through everything on-screen. A full session:
- Power on. You'll see a
SHARPENING GUIDEsplash, thenSET TARGET. - Set your target angle. Either:
- hold the device at the angle you want and press A to capture it, or
- press B to cycle the presets (12° / 15° / 17° / 20° / 22° / 25° / 28°) and press A to pick one.
- Set tolerance. Press B to cycle
TIGHT ±2°/NORMAL ±3°/EASY ±5°, then A to confirm. (Start with NORMAL or EASY.) - Zero-calibrate (2 quick steps). This is what makes it angle-accurate regardless of how the device is rotated on the blade:
- Step 1/2 — "Lay flat on stone": rest the blade flat on your stone, press A, hold still for the countdown.
- Step 2/2 — "Raise to your angle": lift the spine to roughly your sharpening angle, press A, hold still.
- (If it says "KEEP STILL", just set it down for a second — or tap B to force the capture.)
- Sharpen. The whole screen turns green / blue / red. Chase green. The center number is your stroke count for the current side.
- Switch sides. When you flip the knife to sharpen the other face, press B to switch the device to the other side — that side's stroke count picks up where it left off. (If the angle reads off after re-mounting, short-press A to re-zero in place.)
- End the session. Long-press A →
SESSIONsummary (target, tolerance, strokes per side, time, time on-angle). Press A for a new session, hold B for your last five sessions, or B to sleep.
| Button | Short press | Long press |
|---|---|---|
| A (front) | confirm / capture / re-zero | end session (→ summary) / accuracy check (SET TARGET) |
| B (side) | cycle option / switch blade side | toggle buzzer (ACTIVE) / toggle steady mode (TOLERANCE) / session history (SUMMARY) |
| Power (left side) | sleep / wake | hold 6 s = full power-off (AXP192 / Plus only — see note below) |
⚠️ The "hold 6 s = full power-off" behavior is AXP192-specific and applies to the M5StickC Plus only. On the Plus2 and S3, the power button is managed by the board's own power IC through M5Unified; the long-hold power-off behavior may differ slightly.
- Edge-axis bevel measurement. The two-step zero calibration captures both a flat reference and the cutting-edge hinge axis. The bevel angle is measured as rotation about that axis, so tip-to-heel skew doesn't inflate the reading and a single calibration serves both faces of the blade.
- Mahony AHRS filter fuses gyro + accelerometer at 50 Hz, with per-session gyro-bias capture and a snap-to-raw recovery when the device is verifiably still.
- Motion-based stroke counting. Passes are detected as horizontal linear-acceleration peaks (with hysteresis + a refractory interval) while you're on-angle — not from angle-dwell timing.
- Battery-aware. Idle sleep, screen dimming, an 80 MHz CPU clock, and a one-click power key. On the Plus/Plus2 this is a true deep sleep with the session preserved in RTC RAM, so waking resumes where you left off — strokes, time-on-angle, and session duration. On the M5StickS3 the power button is owned by the M5PM1 PMIC (not a wake-capable GPIO), so the device fully powers off instead — a power-key press turns it back on with a fresh boot (the in-progress session isn't resumed on the S3). Figure on roughly an hour or two of continuous use on the small cell (untuned — your mileage will vary).
More detail lives in docs/ — the design spec, implementation plan, and hardware bring-up checklist.
src/ firmware modules — app state machine, angle math, Mahony filter,
stroke/side/input FSMs, zero-cal capture, UI, power, persistence
test/ native (desktop) unit tests for the pure-logic modules
docs/ design spec, bring-up checklist, and the browser-flasher page
| Symptom | Fix |
|---|---|
| Browser flasher can't see the device | Use desktop Chrome/Edge/Opera, try a different data USB-C cable, and install the CP210x driver. |
| Screen stuck on "KEEP STILL" during calibration | Set the device down on the bench for a second so it can capture — or tap B to force the capture. |
| Angle reads wrong / drifted after re-mounting or flipping the knife | Short-press A to re-zero in place. |
IMU FAULT on boot |
Power-cycle. If it persists, re-flash; this is the documented MPU6886/AXP192 I²C quirk — see docs/. |
| Stroke count is off by a few | Known — thresholds are still being tuned. Please send your numbers (see Contributing). |
| Plus2 wakes, then sleeps when you let go of the power key | Fixed in v0.3.0 — it now ignores that wake press. Re-flash from the flasher. |
| S3 turns on and immediately powers off | Same family as above; v0.3.0 drains the power-on click. If it still happens, the M5PM1 may be hard-resetting on a single click — open an issue. |
| Resume shows the previous knife after a crash / reflash | Fixed in v0.3.0 — a non-sleep boot now discards the leftover session. |
- Stroke-count and Mahony
kp/kithresholds are first-pass guesses still being tuned on real stones. - No companion app, BLE, or logging by design — it's meant to be a glanceable, standalone coach.
- Board support: the M5StickC Plus is validated on real hardware. The M5StickC Plus2 and M5StickS3 are compile-verified and code-reviewed against M5Stack datasheets, but not yet confirmed on a physical device — if you own one, please flash it and open a GitHub issue with results. That includes the battery icon: the Plus2 reads its cell through an ADC divider and the S3 through the M5PM1, neither of which has been checked against a real charge curve yet.
Issues and PRs welcome — especially real-world tuning data (your hand-counted strokes vs. what the device reported, knife/stone/angle). That's the single most useful thing right now. Open an issue with what worked, what didn't, and your hardware. See CONTRIBUTING.md.
MIT © 2026 Another Dumb Idea, LLC. Do whatever you like with it — build one, mod it, sell your own version. Attribution appreciated, not required.