Plate 1 · Black, then orange
Base
Build guide
A 96 × 66 × 46 mm black desk block with an orange button. When something needs you, a servo opens the front flap, an orange band shows and an LED stick glows behind it, and a buzzer chimes. Press the button to answer. ESP32-C3 inside. Bring your own firmware.
Your kit contains the printed parts, electronics, screws, hinge pins, servo arm and fastener, bus pins, leads, connectors and insulation. Start with the checklist below; you do not need a 3D printer. Firmware is up to you: see Make it yours.
| Size | Qty | Where | |
|---|---|---|---|
| M2 × 4–6 pan head | 4 | C3 frame, into the posts beside the board | |
| Supplied hinge pins, 1.75 mm × ~7.5 mm | 2 | Flap hinge pins, push fit in the back half |
No screws for the servo, no inserts or magnets. A drop of super glue holds the horn tip; hot glue holds the buzzer and the bus pins.
The C3 SuperMini has one 5V and one GND pin, so a small printed power bus next to it shares them. None of these pins are strapping pins (2, 8, 9) or UART0 (20, 21).
| Part | Pin | Goes to |
|---|---|---|
| SG90 servo | signal | GPIO 10 |
| + | bus 5V | |
| − | bus GND | |
| WS2812 LED stick | DIN | GPIO 4 |
| 5V | bus 5V | |
| GND | bus GND | |
| MX switch | leg 1 | GPIO 3 (internal pull-up) |
| leg 2 | GPIO 6 (drive LOW: its ground) | |
| Passive buzzer | + | GPIO 5 |
| − | bus GND | |
| Power bus | 5V row | C3 5V (one jumper) |
| GND row | C3 GND (one jumper) |
Fasteners hot glue
The base with the C3 frame, power bus, servo cradle and horn tip in place (electronics not drawn).
Fasteners 4× M2 pan head
Fasteners no screws
Fasteners 2× supplied hinge pins
Breathe ships without firmware. The hardware is a standard ESP32-C3 with a servo, a WS2812 stick, a button and a passive buzzer, so you decide what makes it open. Two ways:
pip install esphome on a computer.secrets.yaml, never in a file you share.Minimal skeleton, written for this guide. Adjust it and check the ESPHome docs for your version. If the servo jitters while the buzzer plays, move the buzzer to another LEDC timer (they share frequency per timer).
esphome:
name: breathe
on_boot:
priority: 800
then:
- output.turn_off: key_gnd # the switch's second leg acts as ground
esp32:
board: esp32-c3-devkitm-1
framework:
type: esp-idf
logger:
api:
encryption:
key: !secret api_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
output:
- platform: gpio
id: key_gnd
pin: GPIO6
- platform: ledc
id: servo_pwm
pin: GPIO10
frequency: 50 Hz
- platform: ledc
id: buzzer_pwm
pin: GPIO5
servo:
- id: flap
output: servo_pwm
transition_length: 2s # slow moves draw less current
auto_detach_time: 1s # limp and silent when still
number:
- platform: template
name: Flap
min_value: -100
max_value: 100
step: 1
optimistic: true
set_action:
- servo.write:
id: flap
level: !lambda 'return x / 100.0;'
rtttl:
output: buzzer_pwm
light:
- platform: esp32_rmt_led_strip
name: Glow
pin: GPIO4
num_leds: 8
rgb_order: GRB
chipset: WS2812
color_correct: [35%, 35%, 35%] # it glows through 1 mm of orange
binary_sensor:
- platform: gpio
name: Button
pin: { number: GPIO3, mode: INPUT_PULLUP, inverted: true }
filters:
- delayed_on: 15ms
Any AI coding assistant can draft firmware (ESPHome YAML, Arduino or ESP-IDF) from a clear hardware description. Paste this and change the “Write firmware that” part:
I built a desk notifier on an ESP32-C3 SuperMini (USB-C, 3.3 V logic).
Hardware and pins:
- SG90 servo: signal GPIO10, powered from USB 5V.
It opens a hinged flap. Move it slowly (~2 s per move) and detach it when still.
- WS2812 LED stick, 8 LEDs: DIN GPIO4, 5V. It glows through 1 mm of orange plastic.
- MX switch (the button): one leg GPIO3 with internal pull-up, the other leg GPIO6
driven LOW as its ground.
- Passive 12 mm buzzer: GPIO5 to GND (needs a PWM tone, not just on/off).
Avoid GPIO 2, 8, 9 (strapping) and 20, 21 (UART0).
Write firmware that: opens the flap and breathes a colour on the LEDs when an event
arrives over Wi-Fi (e.g. a webhook or MQTT message), chimes on the buzzer, closes the
flap when I tap the button, snoozes on a double tap and mutes on a long hold.
Include a way to calibrate the closed and open servo positions and store them.
Keep Wi-Fi and keys in a separate secrets file.
Skip this section if you bought the kit: the printed parts are supplied. If you bought the digital files, follow the settings supplied with your download. The plate layout below describes the pictured reference print.
Print time is the slicer estimate for a Bambu Lab P1S; Bambu Studio's GUI may show more. No AMS needed: the base's colour change is a manual pause.
Bambu Lab P1S, 0.4 mm nozzle · 0.20 mm layers · 2 walls · 4 top / 3 bottom · 20 % cubic · no supports · auto brim · Textured PEI · eSUN PLA+, black and orange (#FF6A13).
Base
Split top flap, Split top back, Horn tip, C3 frame, Servo cradle, Power bus holder
Button
Orange, the same as the base’s band. Prints top down.