-
1Supplies
![]()
![]()
Electronics:
- 1× ESP32 Dev Module — any standard 30/38-pin dev board works; this runs the Morse engine, display, and ESP-NOW beacon
- 1× SSD1306 OLED, I2C, 0.96", 128×64 — the standard 4-pin I2C version (SDA/SCL), not SPI
- 1× momentary tactile push button — the only input on the device
- 1× buzzer, passive or active (optional) — passive is preferable since it can tone at a specific frequency rather than just clicking
- 9V battery, or USB power for bench testing
- Jumper wires, breadboard for initial wiring
Enclosure (cardboard prototype):
- Corrugated cardboard (an old shipping box works)
- Black and white paper for the panel finish
- Hot glue gun + glue sticks
- Craft knife and a pencil for marking cutouts
The same electronics stack drops into a PVC or 3D-printed shell later with no changes to wiring or firmware.
-
2Wiring
![]()
_________________________________________ | Component | Pin | ESP32 | |-------------------|-----------|-------| |OLED VCC | — | 3V3 | |OLED GND | — |GND | |OLED SDA | — |GPIO 21| |OLED SCL | — |GPIO 22| |Button leg 1 | — |GPIO 4 | |Button leg 2 | — |GND | |Buzzer + (optional)| — |GPIO 19| |Buzzer − (optional)| — |GND |The button relies on the ESP32's internal pull-up resistor, so no external resistor is needed — it just needs to pull the pin to ground when pressed. If using a passive buzzer, polarity generally doesn't matter; active buzzers are sometimes polarized, so check the datasheet if unclear. A quick continuity check with a multimeter before powering on is worth doing to rule out shorts. -
3Flashing the firmware
- Install the Arduino IDE (2.x) from arduino.cc.
- Add ESP32 board support:
File → Preferences → Additional Boards Manager URLs→https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.jsonThen install esp32 (Espressif Systems) via Boards Manager. - Install the U8g2 library (by oliver/olikraus) via
Sketch → Include Library → Manage Libraries. This handles all OLED rendering — menu highlighting, the Morse light-guide box, and beacon status. - Near the top of the sketch, set:
#define BUZZER_IS_PASSIVE true // false = active buzzer
- Select your board and port under
Tools, then upload.
On reset, the OLED should show the SIGNAL splash screen. If the display stays blank, double-check SDA/SCL wiring and confirm the I2C address in code (
0x3C) matches your module — some 0.96" boards ship on0x3Dinstead. -
4Cutting the enclosure
![]()
Cut from a single sheet of corrugated cardboard against a cutting mat:
- 2× side strips — 2cm × 8.5cm (left/right walls)
- 2× plain panels — 3cm × 8.5cm (front and back, corners clipped at an angle for a cleaner, sturdier profile)
- 3× small squares — 2.5cm × 2cm (internal standoffs)
- 2× small squares — 2cm × 2cm (additional standoffs/reinforcement)
- 1× small rectangle — 3cm × 2cm (buzzer mounting tab)
Rather than working from fixed measurements, trace the actual OLED module and button cap directly onto the front panel before cutting — component sizes vary enough between suppliers that a fixed template will fight you. The OLED window sits centered near the top of the panel; the button cutout sits below it, sized just under the button cap so it seats against the cardboard.
-
5Powering on and testing the menu
![]()
![]()
![]()
- Glue the two side strips to the base panel first, standing upright along its long edges.
- Attach the front panel (with cutouts) and the plain back panel, aligning the clipped corners so seams sit flush.
- Glue the small squares in as internal standoffs, holding the electronics stack at the height where the OLED presses flush against its window.
- Mount the buzzer against its grille cutout using the mounting tab (skip this if building without a buzzer).
- Glue the OLED into its window cutout, and the button through its hole.
- Mount the remaining electronics (ESP32, wiring) to the back panel, then dry-fit and power on before sealing the final seam — much easier to trim cardboard than add it back once glued.
-
6Assembly
![]()
On boot, the OLED shows the SIGNAL splash screen, then drops into the main menu — SOS, MED, FIRE, LOST, HERE, OK, and 2.4G BEACON — with the selected preset shown in an inverted highlight bar. Single-click cycles through the list; a long press (~600ms) activates whichever preset is highlighted; a double-click at any point returns to this menu.
-
7Morse pacer in action
![]()
Once a preset is activated, the display switches into pacing mode. The top bar shows the active message; the center alternates between a filled "LIGHT ON" block and an outlined "LIGHT OFF" box, synced exactly to that message's Morse timing. Hold a flashlight and toggle it in time with the display — SIGNAL handles the Morse translation and timing, so no prior knowledge of the code is required. The bottom of the screen shows the current symbol (dot, dash, or pause) for reference, and the buzzer (if wired in) beeps in sync with the same pattern. The message loops continuously until double-clicked to stop.
-
82.4GHz beacon mode
Selecting "2.4G BEACON" and long-pressing switches SIGNAL into continuous ESP-NOW broadcast. Every 2.5 seconds, it transmits a distress packet — device name, status string, and an incrementing counter — to any nearby device listening on the same channel, with no router, access point, or pairing required. The OLED shows a live transmission count and TX status, with a short buzzer chirp per broadcast if one is wired in. Double-click to stop broadcasting and return to the menu.
Maulik








Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.