ESP32 Weekend Prototype: Closing a 10-Year Loop

An experiment in embedded systems, fast iteration, and revisiting an old promise with better tools.

Animated loop of the final ESP32 buzzer prototype demo with transmitter and receiver active
Final demo loop: press button, send packet, buzz.

My YouTube feed is currently a steady stream of oscilloscopes, dev boards, firmware walkthroughs, and "$12 microcontroller does WHAT?" thumbnails. I'm not fighting it.

A few weeks ago I stumbled across this video: A first look at: Elegoo ESP32 Starter Kit.

I had already been sketching ideas that required more than resistors and LEDs in the Maker Box. The ESP32 kit looked like the right level of friction: inexpensive, capable, and just enough parts to build something real.

I ordered it. And then I did what I always do: mentally filed it under "future experiment." That didn't last long.

Elegoo ESP32 starter kit box on a desk before opening
The project starts with a box and a hunch.

How Did the ESP32 Escape Me?

I've owned almost every Raspberry Pi generation. I've built multiple Arduino-based projects. Somehow, the ESP32 just never entered my workflow.

That changed the moment I read about ESP-NOW.

  • Peer-to-peer wireless.
  • No router required.
  • Low latency.
  • Broadcast or targeted messaging.
  • Runs on a board that can be as cheap as $1.80.

That is not a dev board. That is a product substrate.

I immediately ordered more boards: a few from Amazon for speed, a few from China for economics. If you're building distributed embedded systems, you don't buy one.

Three ESP32 development boards lined up for multi-node prototyping
One board proves a concept. Multiple boards build a system.

Unboxing: Physical Constraints Matter

The Elegoo kit arrived. First task: unwrap, inventory, and re-pack.

The components barely fit back in the case. People complain about that online. They are right, but you can solve it: rotate modules 90 degrees, stack vertically, move jumpers to the side. Mechanical packing is just another constraint to optimize.

That small exercise is part of the game. Hardware always pushes back.

ESP32 kit parts laid out for inventory before first build
Inventory pass against the kit sheet.
ESP32 starter kit contents unwrapped and rearranged inside the case
Re-packed after reorientation and stacking.

Tooling Setup

I already had Arduino IDE installed, so the setup was straightforward:

It worked out of the box. That matters. The faster you get a clean signal, the more momentum you build.

Initial ESP32 breadboard placement and quick-start setup before integration
First bench layout before integration work.
Two ESP32 boards connected over USB for side-by-side TX and RX development
Early dual-board bring-up: TX and RX powered side by side.

A Story from 10–15 Years Ago

My wife once had a product idea she was practically obsessed with.

She wanted to press a button, on a device or from her phone, and have a durable wrist-mounted device on a child vibrate to alert them to come back.

The use case was painfully practical: sitting on a park bench, kids at the noisy playground, tired of yelling.

It was a good idea.

At the time, I told her I couldn't help. I could build backend services. I could architect distributed systems. But I knew nothing about mechanical design, power electronics, motor drivers, enclosures, or how to manufacture even a prototype.

She was disappointed. And she remembered.

Fast Forward: 2026 Is a Different World

  • ESP32 boards as cheap as $1.80
  • Integrated WiFi + Bluetooth
  • ESP-NOW peer-to-peer networking
  • Cheap vibration motors
  • 3D printers
  • ChatGPT
  • AI-native coding workflows (Cursor + Copilot)

The constraints collapsed. So of course this had to be the first project.

Architecture: A Two-Node Distributed System

The system is conceptually simple:

Close-up of transmitter-side ESP32 wiring with button input path visible
TX (parent device): button input and ESP-NOW command source.
Close-up of receiver-side ESP32 wiring with transistor stage and signal wiring visible
RX (child device): packet receive, actuator drive, and ACK response.

That's it. But even simple systems have layers:

  1. Hardware input
  2. Wireless transport
  3. Message protocol
  4. Power switching
  5. Actuation
  6. Feedback and acknowledgment

Each layer is independently testable.

Two-node ESP32 prototype layout with transmitter button and receiver actuator wiring
Physical system view of TX and RX on one bench.
ESP32 two-node setup with vibration motor connected for full path validation
End-to-end setup with actuator attached.
Use case flow diagram showing parent transmitter and child receiver interaction pattern
Use-case flow for TX to RX signaling.
Sequence diagram of ESP-NOW command and ACK handshake between boards
Command and ACK handshake.
Data flow diagram showing button input, ESP-NOW transport, and receiver output chain
Data flow from trigger to actuation.

Development Strategy (Systems First)

I ran two Arduino IDE windows side by side, one for TX, one for RX. That allowed simultaneous flashing and serial monitoring.

Screenshot of two Arduino IDE windows open side by side for TX and RX firmware development
TX and RX sketches side by side in Arduino IDE.
Live demo: button press on TX, RX receives and acts.

Minor tooling note: do not open the same files in Cursor and Arduino IDE at the same time. Arduino IDE does not like file contention and will happily freeze itself into oblivion. Once most of the code was stable, I switched to copy/paste workflow from Cursor into Arduino.

Build Timeline

  1. Verify ESP-NOW communication: serial logging on both boards, then command send/receive with ACK path from RX to TX.
  2. Confirm TX button input: GPIO with INPUT_PULLUP, state transitions measured, debounced trigger verified.
  3. Test an active buzzer from the kit: quick actuator sanity check on RX before moving to motor hardware.
  4. Build the motor driver stage: 2N2222A low-side switch, 1k base resistor, flyback diode, and debug through real measurements.
Dual ESP32 setup with physical button wired for transmitter input test
Button input test on TX.
Bench setup for active buzzer test with ESP32 board and external power supply
Buzzer test bench before playback and timing tuning.
Active buzzer test before motor integration.

The RX side eventually drove a 3V N20 vibration motor through a textbook transistor stage. It didn't work at first.

After measuring base voltage and walking through the circuit, I discovered I was off by one breadboard row on the transistor collector pin. That was it. One pin misaligned.

That's the kind of bug that used to take me hours years ago. With structured debugging and AI assistance walking through expected voltage readings, it was resolved in minutes.

Motor driver components including transistor resistor diode and vibration motor laid out for assembly
Motor stage components.
Debugging step with voltage measurements on ESP32 motor driver breadboard circuit
Voltage-first debugging found the misalignment quickly.
Corrected ESP32 two-node wiring with motor path active after transistor row fix
After the row correction, the end-to-end path worked.

What Surprised Me

It mostly worked on the first full pass. Wireless. ACK handling. Buzzer check. Motor driver. Button trigger.

That is not because hardware is easy. It is because constraints are better documented, reference patterns are abundant, AI can sanity-check assumptions instantly, and iteration cycles are short.

The difference between "I cannot build this" and "This took a Saturday" is tooling.

Full final demo clip.

Physical Iteration and Range Testing

I found a clean printable case for the ESP32: Thingiverse model.

Printed it in pink as a test. Obviously. It fit well and leaves antenna clearance, which matters for range.

Mechanical packaging is next:

  • Integrate vibration motor
  • Ensure antenna end is not buried in plastic
  • Design for wrist strap integration
  • Consider power and charging

ESP-NOW claims solid indoor range. I have not formally tested it yet. The plan:

  • Line-of-sight distance
  • Through-wall tests
  • Park simulation
  • Measure packet loss rate with sequence IDs

I expect indoor attenuation to be the limiting factor, not the protocol itself.

The Emotional Part

My wife was there for several of the "It worked!" moments.

Ten years ago I told her I couldn't build this. Now, in a few focused hours on a weekend, we had a functioning prototype.

Not production-ready. Not optimized. Not miniaturized. But real. And buzzing.

That matters.

What This Project Represents

This isn't about an ESP32. It's about capability compression.

Ten years ago:

  • I had the software skills.
  • I lacked the hardware literacy.
  • Tooling was fragmented.
  • The barrier to entry felt high.

Today:

  • Microcontrollers are system-on-chip powerhouses.
  • Wireless stacks are built in.
  • Power electronics are $0.10 components.
  • AI accelerates debugging.
  • 3D printing removes mechanical gatekeeping.

The surface area of what a single motivated person can prototype has expanded dramatically.

Artifacts

Repo: github.com/warreneblackwell/esp32-buzzer

GitHub repository screenshot for esp32-buzzer showing tx and rx project structure
Repo snapshot from this build iteration.

Next iteration:

Closing Thought

This project was not technically difficult. But it closed a loop.

Sometimes growth isn't about learning something new. It's about revisiting something old with better tools.

And pressing the button. Buzz.