STAY GREEN MACHINE
Print Profile(1)

Bill of Materials
- Servo Screws x 3:
- Dupont Male to Female Wires x 3:
- ESP32 x 1:
Description
🟢STAY GREEN — Automatic Status Presser
😈Passive Aggressive Mode — Passive Aggressive Email Writing Aid
Keep your "active" status green. Let the machine handle it.
A small 3D-printed desk arm built around an ESP32 and a micro servo. It presses a key on a fixed interval so apps like Teams or Slack keep reading you as active — and if you reposition it over your Caps Lock key instead, it doubles as a passive-aggressive assistant for those emails.
⏱️ Build time: under an hour once printed — minimal supports, no soldering, 3 wires, 2 code uploads, and a 15-minute calibration pass to match it to your own laptop.
What It Actually Does
- Powers on, waits 5 seconds so you can get your laptop positioned, then begins a repeating press-release motion on whatever key sits underneath it
- Runs on a fixed rhythm: press, hold half a second, release, wait a second, repeat — indefinitely, as long as it's powered
- Rack-and-pinion arm for a solid, repeatable press
- Snap-fit printed parts, minimal supports needed
Two ways to use it, same firmware both times:
- Status mode — position it over a harmless key (Shift, Scroll Lock, etc.) near your normal typing area to keep presence status active
- Passive-aggressive mode — reposition it over Caps Lock instead, and it'll toggle Caps Lock on the same fixed interval while you're away from your keyboard
Nothing in the code changes between the two modes — it's the same loop either way, just aimed at a different key. Worth knowing: presses happen on a steady, predictable interval, not randomly, so if you're using passive-aggressive mode expect a metronomic toggle rather than occasional surprise chaos.
A quick honesty note: this works by physically pressing a key, not by touching Teams/Slack or your OS, so it won't trip anything network-side. That said, presence status is meant to signal real availability — worth being upfront with your team if you're relying on this daily.
🧰 What You'll Need
Electronics
- 1x ESP32 dev board
- 1x Bambu Lab micro servo with clutch
- 3x Dupont wires (male-to-female)
Hardware
- 3x servo screws (usually included with the servo)
- A small dab of super glue
Printed Parts
- Base, arm, and rack/pinion pieces (STLs attached) — snap-fit, minimal supports
Tools
- Small screwdriver
- USB cable + computer with Arduino IDE installed
- USB power bank or wall adapter (for standalone use afterward)
🔧 Assembly — About 15 Minutes
1. Print the parts (not counted in build time) Minimal supports needed. Standard PLA, 0.2mm layers works fine.
2. Snap the frame together Base, upright arm, and rack all snap-fit. Test the rack-and-pinion motion by hand before you glue anything — it should slide smoothly.
3. Mount the servo Seat it in the arm housing, secure with the 3 servo screws. Only add a dab of super glue if a joint feels loose — never glue the gear teeth themselves, they need to move freely.
4. Wire it up (3 connections)
| Servo Wire | ESP32 Pin |
|---|---|
| Signal (orange/yellow) | GPIO 18 |
| Power (red) | 5V or VIN |
| Ground (brown/black) | GND |
That's the whole circuit — no breadboard, no soldering.
💻 Flashing & Calibration — About 20–30 Minutes
Every laptop is a slightly different height and keyboard depth, so this step tunes the arm to your setup. Do this once, and you're done.
Step 1: Upload the Calibration sketch
Flash the Calibration Code (included below) first — not the main program yet.
Step 2: Open Serial Monitor
In the Arduino IDE: Tools → Serial Monitor. Set the baud rate dropdown (bottom-right) to 115200 — it has to match Serial.begin(115200) in the code, or you'll see garbled text instead of readable output.
Step 3: Position the unit
Put the printed unit where it'll actually sit day-to-day, arm roughly over the key you plan to press.
Step 4: Find your two angles
Type a number from 0–180 into the Serial Monitor input box and hit Enter. The servo jumps to that angle immediately and echoes back:
Servo moved to: 80 degrees
Sweep through values — try 30, then 90, then narrow in — until you've found:
- Release angle — arm lifted clear, not touching the key
- Press angle — arm comes down and fully depresses the key
Write both numbers down. A typical pair might be 60 (release) and 85 (press) — yours will differ based on keyboard height.
Step 5: Enter your numbers into the Main Code
Open the main sketch and drop your two calibrated values into these three spots:
void setup() { fingerServo.attach(servoPin, 500, 2400); fingerServo.write(30); // ← your RELEASE angle (starting position) delay(5000); // 5 sec pause to position your laptop } void loop() { fingerServo.write(80); // ← your PRESS angle delay(500); fingerServo.write(60); // ← your RELEASE angle (same value as above) delay(1000); }
Use the same release angle in both the setup() line and the loop() — that keeps the arm returning to one consistent resting spot instead of drifting between runs.
Step 6: Re-upload and go wireless
Flash the updated main code, then unplug from your computer and switch to a USB power bank or wall adapter. It'll run standalone from there.
How the Code Works
Calibration Code turns your Serial Monitor into a live remote for the servo — type an angle, it moves there and reports back. It exists purely so you can find your two numbers against your real hardware; it's not what runs day-to-day.
Main Code is what actually runs once flashed:
- setup() connects to the servo, moves to the release angle, and waits 5 seconds — your window to slide the laptop into place
- loop() then repeats forever: press down, hold 0.5s, lift up, wait 1s, press again
That's roughly one keypress every 1.5 seconds, nonstop, until it's unplugged. Same code whether it's sitting over Shift for status, or over Caps Lock for chaos — the only thing that changes is where you physically place the arm.
Print Settings
- Minimal supports (small overhangs on the rack/gear area only)
- 0.2mm layer height
- Snap-fit tolerances built in — no post-print sanding should be needed
Questions or found an issue with the fit? Drop a comment and I'll help troubleshoot.
- If you enjoy this model, please consider buying me a coffee
- Or follow me so i can get to 200 followers and join the Commercial License membership Program
Boost Me (for free)
Documentation (2)
License
You shall not share, sub-license, sell, rent, host, transfer, or distribute in any way the digital or 3D printed versions of this object, nor any other derivative work of this object in its digital or physical format (including, but not limited to, publishing derivative works outside the Makerworld platform or hosting on other digital platforms). The objects may not be used without permission in any way whatsoever in which you charge money or collect fees. Subject to the above restrictions, derivative works may be published only within the Makerworld platform, and all such derivative works must be licensed under the same SDFL‑C license, without modification or additional terms. You may download the digital versions of this object, 3D print it, and display images, videos, or usage demonstrations of 3D printed versions of the object on personal social media platforms or Makerworld official channels, provided that no digital versions of the object are shared or distributed.















Comment & Rating (2)