A complete escape room on MR Physics, as presented at the 2025 ESMRMB Annual Meeting.
Assembly photos and step-by-step operating instructions for every puzzle are
in Documents/Master/Escape Room Solution.odt. Documents/Player contains
player-facing material (a sequence booklet and a gyromagnetic-ratios sheet)
that can be printed and handed out during the game. BOM.ods is the bill of
materials for all the electronics.
The room is built around six ESP32 nodes that talk to each other over
ESP-NOW (see Arduino_Libraries/MREscapeRoomLib), plus one standalone
utility. Each node has its own top-level folder containing the Arduino
sketch, the Eagle PCB design, and 3D-printable/CNC parts for its enclosure:
Keypad— 3x4 matrix keypad + RGB LED; player enters a secret code.Scale— load cell (HX711) puzzle; checks the weight of objects placed on the scale.SequenceComposer— 10 RFID readers under a board where players place physics-concept tiles in the right slots/order.Speaker— plays idle/success/failure/sequence audio from SPIFFS.Timer— e-Paper countdown display for the whole room.Monitor— TFT status console for the game master; shows live status from every other node and can reset the game.SPIFFSTool— standalone sketch + Python script used to upload audio files onto a node's SPIFFS filesystem over serial (used bySpeaker).
Other top-level folders:
Arduino_Libraries— third-party libraries (see below) plus the project's ownMREscapeRoomLib, shared by all node sketches.Eagle_Libraries— custom Eagle component library used by the PCB designs.Documents— assembly/operating instructions, player handouts, and label artwork.BOM.ods— bill of materials.
- Fabricate the PCBs from the
Eaglefolder of each node usingBOM.ods, and build/print the enclosures from each node's3D Files(and, forSequenceComposer,CNC Files). - Flash each node's sketch onto its ESP32 once to read out its MAC
address (printed to
Serialon boot), then update the corresponding*_MACconstant inArduino_Libraries/MREscapeRoomLib/MREscapeRoomLib.hand reflash. All nodes must be flashed with a copy of the library that has the full, correct set of MAC addresses. - SequenceComposer: choose the RFID tags for each physics-concept
tile, read their UIDs (enable
DEBUG_OUTPUTinEscapeRoom_SequenceComposer.inoto print the UID seen by each reader instead of just a match indicator), and set theTILE_*constants andtile_mappingarray accordingly. - Scale: pick the 4 objects that must be placed on the scale to solve
the riddle, place them on the scale, and adjust
scaleFactorand/ortarget/toleranceinEscapeRoom_Scale.inountil the node reportsSAFETYOK(seeScale/README.txt). - Speaker: prepare the audio assets before flashing the final sketch.
Source clips are in
Speaker/Arduino/Original audio; the sequences used are listed inSpeaker/Arduino/Sequences.txt(cine bSSFP, MPRAGE, ASL, EPI). Convert each clip to raw, unsigned 8-bit, mono, 16000 Hz PCM (matchingsampleRateinEscapeRoom_Speaker.ino), e.g. with ffmpeg:Then, perffmpeg -i input.m4a -f u8 -ar 16000 -ac 1 output.raw
SPIFFSTool/README.txt:- Flash
SPIFFSTool/SPIFFSTool.inoonto the Speaker's ESP32. - Use
SPIFFSTool/serial-upload-script.pyto upload the converted.rawfiles (pump.raw,success.raw,failure.raw,sequences.raw— seeSpeaker/Arduino/datafor the files already used in this build) onto its SPIFFS partition. - Reflash the ESP32 with
EscapeRoom_Speaker.ino; the previously uploaded SPIFFS files are preserved across this reflash.
- Flash
- Timer: set
INITIAL_TIME_SECinEscapeRoom_Timer.inoto the desired game duration. Only regenerate thechar_*.h/bg_black.h/ry_success.h/ry_failure.hbitmap headers (andCHAR_X/CHAR_Y) if you change the display artwork or model. - Keypad: set
SECRET_CODE/SECRET_CODE_LENGTHto the desired code and adjustSWITCH_MAPPINGif the physical key layout differs. - Monitor: adjust
RESET_DURATION(how long the reset button must be held) andLINE_LENGTHif needed, then use it to verify that every node shows up green (i.e. answers ESP-NOW pings) before running the room.
The Arduino_Libraries folder contains third-party Arduino libraries used by
this project. MREscapeRoomLib is custom code written for this project and
is not a third-party import.
-
TFT_eSPI by Bodmer — https://github.com/Bodmer/TFT_eSPI Originally based on Adafruit's
Adafruit_ILI9341/Adafruit_GFXlibraries (MIT/BSD licensed, Copyright (c) 2012 Adafruit Industries). Original contributions are licensed under the FreeBSD License, Copyright (c) 2023 Bodmer. SeeArduino_Libraries/TFT_eSPI/license.txt. -
MFRC522 by GithubCommunity / miguelbalboa et al. — https://github.com/miguelbalboa/rfid Released into the public domain under the Unlicense. See
Arduino_Libraries/MFRC522(1)/UNLICENSE. -
HX711 by Rob Tillaart (based on work by Bogdan Necula) — https://github.com/RobTillaart/HX711 MIT License, Copyright (c) 2019-2025 Rob Tillaart, Copyright (c) 2018 Bogdan Necula. See
Arduino_Libraries/HX711/LICENSE. -
waveshare-e-Paper by Waveshare — http://www.waveshare.net/search.html?kw=e-paper GNU Lesser General Public License v2.1, Copyright (C) 1991, 1999 Free Software Foundation, Inc. See
Arduino_Libraries/esp32-waveshare-epd/extras/License.txt.