FIRMWARE

Flash & Configure

ESP32 firmware for the Void Core. Arduino-based, PlatformIO-managed, MIT licensed.

View Source on GitHub

QUICK REFERENCE

At a Glance

CONTROLLER

ESP32 DevKit V1 (38-pin, dual-core)

FRAMEWORK

Arduino via PlatformIO

WIFI SSID

VoidCore

DASHBOARD

http://192.168.4.1

GETTING STARTED

Flash the Firmware

Upload the Void Core firmware to your ESP32 using PlatformIO.

1

Install PlatformIO

Install Visual Studio Code, then add the PlatformIO IDE extension.

2

Clone the Repository

Clone the hardware repository from GitHub.

git clone https://github.com/elastik/void-blueprints.git
3

Open Firmware Directory

Open firmware/ in VS Code. PlatformIO detects platformio.ini automatically.

cd void-blueprints/firmware
4

Connect ESP32 via USB

Use a data-capable micro-USB cable. Verify the serial port appears.

5

Upload Firmware

Click PlatformIO Upload or run the command.

pio run --target upload
6

Verify Boot

Open Serial Monitor at 115200 baud. Look for the Void Core banner.

pio device monitor --baud 115200

CONNECTIVITY

WiFi & Dashboard

The ESP32 creates its own WiFi access point. Connect from any device.

SSID

VoidCore

PASSWORD

voidgrows

DASHBOARD URL

http://192.168.4.1

LOCAL ONLY

All data stays on your local network. No cloud account required.

CONTROLS

Button & Light Modes

The physical button controls light modes and UV-C sterilization.

Short Press

Cycle through light modes

Void GlowBoth UV-A and Blue LEDs active. Default growing mode.
UV OnlyUV-A LEDs only. Minimal light for observation.
Blue OnlyBlue LEDs only. Fruiting trigger light.
OffAll grow lights off. Dark period for day/night cycle.

Long Press (3 seconds)

Trigger UV-C sterilization cycle (15 minutes).

SAFETY

UV-C only activates when the dome is seated. Removing it physically breaks the circuit.

HARDWARE

GPIO Pin Reference

Complete GPIO assignments for ESP32 DevKit V1. Safety-critical pins in magenta.

GPIO
Function
Direction
Signal
Notes
21
BME280 SDA
Bidirectional
I2C data
3.3V logic, external pull-up on breakout
22
BME280 SCL
Output
I2C clock
3.3V logic, external pull-up on breakout
25
UV-A LEDs
Output
Active HIGH
Drives N-channel MOSFET gate (Q1)
26
Blue LEDs
Output
Active HIGH
Drives N-channel MOSFET gate (Q2)
27
UV-C LED
Output
Active HIGH
MOSFET gate (Q3), reed switch in series on drain side
14
Fan PWM
Output
Hardware PWM (LEDC)
25 kHz, 8-bit resolution (0–255)
13
Humidifier
Output
Active HIGH
Drives N-channel MOSFET gate (Q5)
16
Reed Switch
Input
Internal pull-up
LOW = dome seated (magnet closes reed switch)
17
Button
Input
Internal pull-up
LOW = pressed
2
Red Indicator LED
Output
Active HIGH
UV-C warning; built-in LED on most DevKits

REST API

HTTP Endpoints

The ESP32 serves a local REST API at http://192.168.4.1. All requests and responses use JSON.

GET/api/status

Current sensor readings and system state

{ "temperature": 22.5, "humidity": 88.3, "pressure": 1013.2, "lightMode": "voidGlow", "fanSpeed": 128, "uvcActive": false, "domeSeated": true }
POST/api/lights

Set light mode

{ "mode": "voidGlow" }
POST/api/uvc

Trigger UV-C sterilization cycle (15 min)

{ "action": "start", "confirm": true }
POST/api/fan

Set fan speed (0–255 PWM)

{ "speed": 180 }
POST/api/humidifier

Set target humidity percentage

{ "target": 90 }

CRITICAL

Safety Systems

The Void Core uses a hardware-first approach to UV-C safety. Software checks supplement a physical circuit break.

HARDWARE INTERLOCK

A reed switch (GPIO 16) is wired in series with the UV-C LED power path. Removing the dome physically breaks the circuit. No firmware can override this.

FIRMWARE WATCHDOG

Even if the hardware interlock fails, the firmware polls the reed switch state and will refuse to drive GPIO 27 HIGH unless GPIO 16 reads LOW (dome seated).

RED INDICATOR LED

GPIO 2 drives a red LED visible through the dome whenever UV-C is active. Provides a clear visual warning even if the dome is opaque to UV light.