BUILD GUIDE
Step-by-Step Assembly
Complete assembly instructions for the Void Core ESP32 prototype. Make sure you have all parts from the bill of materials.
BEFORE YOU START
Print Settings
All parts print on a standard FDM printer with a 220x220mm bed. PETG is strongly recommended for the final build due to humidity resistance. PLA is acceptable for test prints only. ABS is not recommended (warping on curved surfaces).
MATERIAL TIP
One 1kg spool of PETG is sufficient for the entire build (~380-440g total) with margin for test prints. Budget ~30-40 hours of unattended print time across all parts.
ASSEMBLY
Build Instructions
Five phases from inspection to final dome assembly. Each phase has a go/no-go checkpoint -- do not skip verifications.
Pre-Assembly Inspection
5 minInspect all printed parts before committing to wiring and gluing. Catching fit issues now saves hours of rework.
- Lay out all printed parts: base housing (203mm dia x 89mm), dome (full or split), substrate platform (140mm dia), and 4 vent caps (16mm dia each). Check for warping -- the base must sit flat with no rocking.
- Test-fit vent caps into dome exhaust holes. Each cap should friction-fit with slight resistance from snap-fit tabs. If too tight, sand lightly with 220-grit. If too loose, reprint at 0.1mm less tolerance.
- If using split dome: dry-fit upper and lower halves together. The 1mm alignment step ring should register cleanly with less than 0.5mm visible gap. Do NOT glue yet.
- Verify platform seats correctly on the support ledge at z=45mm inside the base housing. The 8 drainage ribs (1mm tall) should face up.
- Check connector cutouts on base housing: USB-C cutout (9mm x 3.5mm), button hole (12mm), and LED indicator hole (3mm). Clean any stringing with flush cutters.
CHECKPOINT
Base sits flat, vent caps friction-fit, split dome halves register cleanly, platform sits flat, connector cutouts are clean.
Magnet & Reed Switch Installation
10 minInstall the dome magnet and base reed switch that form the UV-C hardware safety interlock. This interlock physically prevents UV-C radiation when the dome is removed.
- Press-fit the 6x2mm neodymium magnet into the dome seating lip pocket (6.5mm diameter x 2.5mm deep). The magnet should sit flush or slightly below the lip surface. Secure with CA glue if fit is loose.
- Mount the reed switch inside the base housing wall, aligned with the magnet position (0 degrees on the base rim). Solder two 150mm wire tails using signal-colored wire. Heat-shrink all solder joints.
- UV-C SAFETY INTERLOCK TEST: Place dome on base, set multimeter to continuity mode, and touch probes to reed switch wire tails. Dome seated = beep (closed). Dome lifted = open circuit (no beep).
SAFETY
DO NOT proceed if the interlock test fails. Check magnet polarity, reed switch alignment, and magnet-to-switch distance (must be <10mm when dome is seated).
CHECKPOINT
Magnet flush in pocket, reed switch mounted and aligned, continuity test passes: closed when seated, open when lifted.
Electronics Wiring
45-60 minWire all electronic components following WIRING.md exactly. Wire in order: I2C bus, LED MOSFETs, UV-C interlock, fan, humidifier, button, indicator LED, power. Power connections come last.
- Wire BME280 sensor: VIN to ESP32 3V3, GND to GND, SDA to GPIO 21, SCL to GPIO 22. On-board pull-ups handle I2C.
- Wire 3 LED MOSFETs (IRLZ44N): Q1 (UV-A, GPIO 25), Q2 (Blue, GPIO 26), Q3 (UV-C, GPIO 27). Each gate gets a 220 ohm resistor from ESP32 GPIO. Sources to GND bus, drains to LED cathodes.
- Wire UV-C series interlock: 5V rail to UV-C LED, UV-C LED cathode to reed switch terminal A, reed switch terminal B to Q3 MOSFET drain, Q3 source to GND. Also connect GPIO 16 to reed switch terminal A for firmware monitoring.
- Wire fan through Q4 MOSFET: Fan+ to 5V rail, Fan- to Q4 drain, Q4 source to GND, GPIO 14 to 220 ohm to Q4 gate. GPIO 14 provides 25 kHz PWM.
- Wire humidifier through Q5 MOSFET: Humidifier+ to 5V rail, Humidifier- to Q5 drain, Q5 source to GND, GPIO 13 to 220 ohm to Q5 gate.
- Wire button between GPIO 17 and GND. Internal pull-up handles the logic -- no external resistor needed.
- Wire red indicator LED: GPIO 2 to 220 ohm to LED anode, LED cathode to GND. This lights during UV-C sterilization.
- Connect power: CH224K USB-C PD sink provides the 5V component rail. ESP32 is powered separately via micro-USB. All GND connections share a common ground bus.
- Pre-power verification: Use multimeter to check no shorts between 5V and GND, no shorts on GPIO pins, each gate resistor reads ~220 ohm, and all solder joints are clean.
SAFETY
Verify no shorts with a multimeter before connecting any power. A shorted MOSFET or bridged solder joint can destroy components instantly.
CHECKPOINT
All 10 GPIO connections wired, 5 MOSFETs with gate resistors installed, UV-C series interlock wired, no shorts detected, all joints insulated.
Component Mounting
20 minMount all electronics and components into the base housing. Route wires through cable channels and secure everything before dome assembly.
- Mount ESP32 DevKit V1 on the +X side standoffs using M2 screws. The micro-USB port should face the USB-C cutout in the base wall.
- Mount BME280 breakout elevated ~20mm on its sensor shelf near the wall. The sensor needs air circulation, not contact with the base floor.
- Position fan centered in the base housing, oriented to blow upward into the dome cavity. Secure with M3 screws on the 4 standoffs.
- Place humidifier piezo disc in the humidifier well on the -X side of the base (40mm diameter x 25mm deep). Fill with distilled water to 15mm for testing.
- Route all wires through cable channels (3mm wide x 2mm deep) in the base floor. Secure with cable ties or hot glue. Keep wires below the platform ledge at z=45mm.
- Place substrate platform on the support ledge. Drain slots and drainage ribs should face up.
CHECKPOINT
ESP32 mounted securely, BME280 elevated, fan centered and blowing up, humidifier seated, wires routed below platform ledge, platform flat on ring.
Dome Assembly
5-10 minFinal assembly: join split dome halves (if applicable), insert vent caps, and seat dome onto base. Perform final safety verification before first power-on.
- If using split dome: Apply medium CA glue to the alignment step ring on the lower half. Press upper half firmly, hold 30 seconds. Apply accelerator spray and let cure 5 minutes.
- Insert 4 vent caps into dome exhaust holes. Push each cap inward until the flange seats flush. Secure with a dot of CA glue if they fall out.
- Seat dome onto base: align the dome alignment notch (5mm wide) with the base notch. The seating lip should drop into the base channel. Install optional silicone gasket O-ring first if using.
- Verify dome stability: no wobble, repeatable fit over 3-4 lift/seat cycles. Total assembled height should be approximately 254mm (10 inches).
SAFETY
Before first power-on with dome seated, you MUST perform the UV-C interlock test again: trigger UV-C (3-second button hold), then lift dome. The red indicator LED must immediately turn off.
CHECKPOINT
Split dome glued and cured (if applicable), vent caps seated, dome stable in base channel, no wobble, ~254mm assembled height.
ELECTRONICS
Wiring Reference
Complete GPIO pin assignments for the ESP32 DevKit V1 (38-pin). Safety-critical pins are highlighted in magenta.
UV-C SAFETY INTERLOCK
The reed switch is wired in series with the UV-C LED power path. This is a physical circuit break, not a software check. If the dome is removed, the circuit is broken and no current can flow to the UV-C LED -- even if firmware crashes or GPIO 27 is stuck HIGH. Always verify the interlock before first use.
Refer to firmware/WIRING.md in the GitHub repo for the full ASCII wiring diagram.
SOFTWARE
Flash the Firmware
Upload the Void Core firmware to the ESP32 using PlatformIO. Flash before assembly so you can verify the boot sequence with the board accessible.
Install PlatformIO
Install Visual Studio Code, then install the PlatformIO IDE extension from the VS Code marketplace. PlatformIO manages all ESP32 toolchain dependencies automatically -- no manual SDK installation needed.
Clone the Repository
Clone the Void Grows firmware repository from GitHub. The firmware source lives in the firmware/ directory.
git clone https://github.com/elastik/void-blueprints.git
Open Firmware Directory
Open the firmware/ directory in VS Code with PlatformIO. PlatformIO will detect the platformio.ini configuration and download the ESP32 Arduino framework and all dependencies automatically.
cd void-blueprints/firmware && code .
Connect ESP32 via USB
Connect your ESP32 DevKit V1 to your computer using a data-capable micro-USB cable (not charge-only). Verify the serial port appears in Device Manager (Windows), System Information (macOS), or /dev/ttyUSB* (Linux).
Upload Firmware
Click the PlatformIO Upload button (right arrow icon) in the VS Code status bar, or run the upload command from the terminal. PlatformIO compiles the firmware and flashes it to the ESP32 automatically.
pio run --target upload
Verify Boot
Open the PlatformIO Serial Monitor at 115200 baud. You should see the 'Void Core' ASCII banner and [Init] startup messages. Connect to WiFi AP 'VoidCore' (password: 'voidgrows') and open http://192.168.4.1 to verify the dashboard loads.
pio device monitor --baud 115200
Source code: github.com/elastik/void-blueprints/firmware
TROUBLESHOOTING
Common Questions
Answers to the most common issues during printing, wiring, firmware setup, and growing. Filter by category to find what you need.
PETG warping on the base housing is usually caused by insufficient bed adhesion or drafts. Clean your build plate with isopropyl alcohol, apply a thin layer of glue stick, and ensure no drafts near the printer. If warping persists, add a brim (5-8mm) in your slicer. The base must sit flat on a table with no rocking before proceeding to assembly.
If your printer has 250mm+ build height, print the full dome for maximum structural strength (no glue joint). If your printer is the standard 220x220x220mm, use the split dome option. The split dome halves join with medium CA glue on the 1mm alignment step ring -- the bond is strong and nearly invisible when done correctly.
If vent caps are too tight, lightly sand the insertion body with 220-grit sandpaper. If too loose, reduce the fdm_tolerance parameter in cad/parameters.scad from 0.2mm to 0.1mm and reprint. Printing vent caps at 0.16mm layer height gives smoother snap-fit tabs for a better friction fit.
PLA works for initial test prints and fit checks, but it will soften and degrade in the sustained high-humidity environment (85-95% RH) inside the dome. PETG is strongly recommended for the final build. ABS is not recommended due to excessive warping on the large curved dome surfaces.
Base housing: 25% gyroid. Dome (full or split): 15% gyroid. Substrate platform: 20% gyroid. Vent caps: 100% solid (they are very small parts). Gyroid infill provides excellent strength-to-weight ratio and good moisture resistance for PETG prints.
Check three things: (1) Magnet orientation -- the magnet must be positioned at 0 degrees on the dome lip, directly above the reed switch in the base. (2) Distance -- the magnet must be within 10mm of the reed switch when the dome is seated. (3) Magnet strength -- ensure the 6x2mm neodymium magnet is fully seated in the pocket, not loose or shifted. Test with a multimeter in continuity mode.
Verify: (1) You are using logic-level MOSFETs (IRLZ44N) that saturate at 3.3V gate voltage. Standard MOSFETs will not fully turn on with ESP32 GPIO. (2) The 220 ohm gate resistor is connected between the ESP32 GPIO and the MOSFET gate. (3) MOSFET source is connected to the GND bus. (4) MOSFET drain is connected to the load. Check with a multimeter that the GPIO pin outputs ~3.3V when HIGH.
Run an I2C scanner sketch to verify the bus. Common fixes: (1) Check SDA (GPIO 21) and SCL (GPIO 22) connections. (2) Verify 3.3V power to the breakout board. (3) The BME280 address should be 0x76 or 0x77 -- some boards have an address jumper. (4) The breakout board should have on-board pull-ups; if not, add 4.7k ohm pull-ups to SDA and SCL.
Disconnect all power immediately. Use a multimeter to check: (1) No short between 5V rail and GND bus. (2) No short between GPIO pins and GND or VCC. (3) All MOSFET gate resistors read ~220 ohm. (4) No solder bridges between adjacent pins. Examine all solder joints under magnification if possible. Heat-shrink all bare connections.
Common fixes: (1) Make sure you're using a data-capable micro-USB cable, not a charge-only cable. (2) Install the correct USB-to-UART driver for your ESP32 variant (CP2102 or CH340). (3) Hold the BOOT button on the ESP32 during upload if auto-reset doesn't work. (4) Check that the correct COM port is selected in PlatformIO. (5) Try a different USB port or cable.
The default configuration creates its own WiFi access point: SSID 'VoidCore', password 'voidgrows'. Connect to this AP and access the dashboard at http://192.168.4.1. If you want to connect to your home WiFi instead, configure the credentials in the firmware's config.h file and re-upload. The ESP32 will fall back to AP mode if it can't connect to the configured network.
If temperature/humidity/pressure read zero: (1) Verify BME280 wiring (SDA to GPIO 21, SCL to GPIO 22, 3.3V power). (2) Check the serial monitor for I2C initialization errors. (3) Run the I2C scanner to confirm the sensor address (0x76 or 0x77). If readings are present but inaccurate, the BME280 may need a few minutes to stabilize after power-on. The sensor self-heats slightly, which is normal.
Connect the ESP32 via micro-USB and use PlatformIO to upload the new firmware (pio run -t upload). The Void Core firmware supports over-the-air (OTA) updates in future releases, but the initial prototype requires USB upload. Always check the serial monitor after flashing to verify the boot sequence completes successfully.
If using the Void Core with automated humidity: (1) Check that the humidifier disc is seated properly in the well and submerged in distilled water. (2) Verify the humidifier MOSFET (Q5, GPIO 13) is switching correctly. (3) Check the PID target humidity in the dashboard. For manual domes (Dark Dome, The Void), mist the interior 2-3 times daily and consider adding the optional silicone gasket O-ring for better humidity retention.
Contamination usually enters during inoculation or substrate preparation, not during fruiting. Prevention: (1) Run a UV-C sterilization cycle before placing new substrate. (2) Use sterile technique when handling substrate and spawn. (3) Ensure your substrate was properly pasteurized or sterilized before use. If contamination appears, remove the affected substrate immediately and sterilize the dome before starting a new grow.
Check environmental conditions: (1) Temperature should be in the species-specific range (typically 65-75F for most gourmet species). (2) Humidity should be 85-95% RH during fruiting. (3) Fresh air exchange is critical -- make sure vent caps are not sealed and the fan (Void Core) is running. (4) Light is not strictly required but helps trigger pinning -- use the UV-A or blue LED mode. (5) Patience: some species take 7-14 days to begin pinning after initiation.
Run a 15-minute UV-C sterilization cycle between grows (after harvesting and before placing new substrate). You do not need to run UV-C during active growing -- it would harm the mycelium. The UV-C LED targets contamination spores on dome surfaces and residual substrate material. Always verify the safety interlock before each use.
Need More Help?
Join the community for build support, share your progress, or report an issue on GitHub.