Cass-E Design

Design, Experiments, Games, Resources

Wireless Home Office Doorbell with Feedback

I built a wireless home office doorbell of sorts with feedback! It gives my father a do-not-disturb indicator for when he's on calls and lets him respond when I ring it without having to mute his microphone. It utilizes ESP-NOW with two ESP8266s.

I styled these after parts of the intercoms in Star Trek: The Original Series for a few reasons. Firstly, my father and I have watched a lot of Star Trek together. Secondly, trek devices had abstract & tactile interfaces which compel me. For example, buttons are coloured & shaped, not labeled. This isn't always practical, but it inspires me to think about the different ways we interact with tech. How can I accomplish this message and this function most efficiently?

Here, 7 LEDs, 4 buttons, 2 microcontrollers, and 1 speaker can tell me when my father's in a call, and when I can bug him about dinner. And I'm hopeful the functionality is pretty intuitive.

I believe the functionality of my device is substantially different from the functionality depicted in the show, and I've made some alterations to the design. Still: I DO NOT OWN STAR TREK, NOR WAS THIS PROJECT AFFILIATED WITH PARAMOUNT IN ANY WAY. Paramount owns the design for their intercoms. If you represent Paramount or an affiliate and you'd like me to remove these images, please contact me.

For more details on this fancy home office feedback doorbell, and more pictures, read on:

Client/Visitor (Doorbell)

The client has one button for "May I come in?" which I call Request.

See above disclaimer about Paramount.

Hub/Occupant (Feedback)

The Hub sits upright on your desk for visibility & easy access. When someone outside hits Request, it plays a notification beep from the MicroSD card, which lets the user change or disable the sound effect.

The hub has 3 buttons, ordered closest to farthest by how often I expect they'll be used.
◻ - Wait
: Most often. The square is for stop or pause
◖ - No: Second most often. A down arrow which points to the Do-Not-Disturb light.
⬤ - Yes: Least often. A circle for Accept!

See above disclaimer about Paramount.

If you hold the 'No' button, it enables Do Not Disturb.

See above disclaimer about Paramount.

To help communicate the function of the inputs, both units show the effects in sync. When Request is pressed, both devices flash blue. When Decline is pressed, both devices flash red. This reinforces the functions with use.


  • Hub/Occupant can indicate when they're busy
  • Client/Visitor should be able to request entrance unobtrusively
  • Hub/Occupant should be able to respond easily and quietly



I didn't have PLA that matched the light blue, so I took the opportunity to try painting PLA. I used acrylic, and I believe this had mixed results. It works, and it made the devices look wooden rather than plastic, but I was hoping the paint would help smooth things. While I sanded the PLA significantly before and slightly after priming, the paint formed a shell that remains unfortunately fragile. Rather than filling in and smoothing surface imperfections, it exaggerated them. Using a white primer underneath helped a lot in the end.

Microcontrollers & Firmware

This project is powered by two ESP8266 microcontrollers, programmed in C++. I use PlatformIO, but stuck with the Arduino framework. They communicate over ESP-NOW, which was fairly painless to implement once I got over the gotchas. ESP-NOW already includes features like receive-confirmation, so I built a minimal shared communication library with message structures and a few fun features.

The communications library for this project addresses potential interruptions in a few ways. These include state-based rather than event-based updates, a buffer for repeating the last message, and keep-alive messages. Rather than using event-based messages (ie. "button_one pressed") I'm sending the entire device state every update (ie. "button_one: true; button_two: false"). This way updates can be safely skipped, and only the newest message is needed to get back on track. The buffer & message failure tracking makes sure that if the latest update has failed, it'll keep trying until it goes through, even as that buffer is overwritten with newer state information. And the keep-alive messages provide a way of notifying the user if there's no longer anyone listening on the other side even without the user pressing buttons.


While I originally planned to use old-fashioned discrete LEDs and transistors, as I developed the project I expanded the number of colours & animations I wanted. Implementing these changes with discrete transistors became overly complex.

Learned for Next Time

  • I didn't include enough depth in the Client/Visitor device for the LEDs to diffuse properly, so the LEDs themselves are quite visible. I'm happy with the final dimensions, but a few more millimeters might have been killer.
  • The ESP8266 (Or at least this D1 Mini breakout) had barely enough GPIO for this project. More advanced projects might need an IO expander or a less bare-bones breakout.
  • ESP-NOW is relatively easy to use if you can work inside the 250 byte packet limit.
  • I should come up with a cooler project name than 'doorbell'
  • My intent was for this to be used within speaking distance, as a less obtrusive method of saying hello. My father's actually deployed the devices much farther apart, so I've had to make a few modifications. This usage has suggested a few unincluded features:
    • Notification sounds at the client/visitor side
    • I've already significantly improved the message loss handling to address the larger distance
    • Possibly an external antenna for greater reliability

Bill of Materials

  • 2x Wemos D1 Mini ESP8266
  • 2 MicroUSB Cables (Power/Programming)
  • 7x WS2812b Addressable LEDs
  • 4x Omron B3F-4155 Buttons
  • Speaker
  • DFRobot DFPlayer
  • MicroSD Card
  • M3 Bolt
  • Wax Paper (Diffuser)
  • Wire
  • Solder
  • Primer
  • Acrylic Paint
  • ~100g of PLA Filament


  • 3D Printer
  • Wire Cutters/Strippers
  • Soldering Iron
  • PlatformIO & C++

This is the first post in the new Maker category! You can expect more projects in this category in the future.

Previous Post

p5.js WordPress Legacy Update

Next Post

WebP & WebM Adobe Plugins