A portable, small-form-factor ESP32-S3 DMX512 controller built around the M5Stack CoreS3SE. It provides a battery-powered touchscreen interface for controlling a full 512-channel DMX universe, with presets, blackout, battery monitoring and support for M5Stack Unit DMX and DMX Base hardware.
Important
Recommended / tested setup: M5Stack CoreS3SE + M5Stack Unit DMX (U183) + M5GO Bottom3.
Warning
Base DMX support is currently experimental.
On the Base DMX unit tested during development, random DMX output glitches could be reproduced even with static channel values and simplified test firmware. The same CoreS3SE, fixtures and cabling operated without those glitches when using Unit DMX. This is currently being investigated with M5Stack support and should not be interpreted as a claim that all Base DMX units are affected.
![]() CoreS3SE + Unit DMX |
![]() CoreS3SE + Base DMX |
![]() Startup Screen |
![]() Main DMX Screen |
![]() Presets |
![]() Settings Screen |
- Full 512-channel DMX universe
- Touchscreen channel selection and value editing
- Persistent P1-P8 presets
- Protected preset save using hold-to-save
- Preset copy and clear
- Blackout with double-tap protection
- DMX activity / heartbeat indicator
- Battery percentage display with charging and external-power indication
- Battery runtime estimation after calibration
- Low-battery visual and audible warnings
- Persistent settings storage
- Screen always-on option
- Touch and statup sounds
- Software RESTART, POWER OFF with Double-tap protection
- Separate hardware profiles for:
- M5Stack Unit DMX U183
- M5Stack Base DMX
Experimental Hardware
The M5GO Bottom3 contains a 3.7 V / 500 mAh battery. In the tested controller configuration, practical runtime was approximately 5 hours, depending on display brightness, activity and battery condition.
Warning
Note that, battery is required for Unit DMX and an external PSU for Base DMX to to power DMX hardware!
Eight presets are available:
P1 P2 P3 P4
P5 P6 P7 P8
Preset data is stored persistently in ESP32 NVS.
Saving is protected against accidental taps.
- Select a preset
- Hold the SAVE control for approximately 1 second
- Progress is shown while holding
- Releasing early cancels the save
Long-press an occupied preset slot to open preset options.
Available operations:
COPYCLEARBACK
Copying is only allowed to an empty destination slot.
Clearing is protected by a hold action.
BLACKOUT uses double-tap protection.
First tap -> TAP AGAIN
Second tap -> BLACKOUT
The second tap must arrive within approximately 500 ms.
When blackout is activated, the current DMX universe is preserved and zero values are transmitted.
Double-tapping again restores the previous values.
The Settings screen provides:
Five levels:
1 / 2 / 3 / 4 / 5
1 / 2 / 3 / 4 / ON
ON means the display remains on continuously.
Five positions:
0 / 1 / 2 / 3 / 4
0 is mute.
The Settings screen also contains:
RESTART
POWER OFF
BACK
Both RESTART and POWER OFF require a double tap within approximately 500 ms.
Before restart / shutdown, the firmware sends several all-zero DMX frames.
The UI displays:
- Battery percentage
- Charging status
- External-power status
- Estimated remaining runtime
Battery indicator colors:
| Battery Level | Color |
|---|---|
| 36-100% | Green |
| 21-35% | Yellow |
| 0-20% | Red |
Runtime estimation begins only after enough discharge data has been collected.
The estimator uses a rolling observation window and smooths the calculated runtime so the displayed value does not jump excessively.
Low-battery warnings are generated at approximately:
- 20%
- 10%
Battery-warning tones use a fixed high warning volume independent of the normal UI volume.
The application code is shared. Hardware-specific UART / direction-control settings are selected by the PlatformIO build environment.
The Unit DMX is connected to CoreS3SE Port A.
| Signal | CoreS3SE GPIO |
|---|---|
| DMX TX | GPIO 2 |
| DMX RX | GPIO 1 |
| Direction / Enable | -1 |
| Port | Port A |
The Unit DMX handles the RS-485 direction internally, therefore the firmware does not use a separate enable pin.
Example configuration:
transmitPin = GPIO_NUM_2;
receivePin = GPIO_NUM_1;
enablePin = -1;The Base DMX uses the CoreS3 M-Bus UART / enable pins used by M5Stack's original DMX512Tools example.
| Signal | CoreS3SE GPIO |
|---|---|
| DMX TX | GPIO 7 |
| DMX RX | GPIO 10 |
| RS485 Enable | GPIO 6 |
Example configuration:
transmitPin = GPIO_NUM_7;
receivePin = GPIO_NUM_10;
enablePin = GPIO_NUM_6;Environment names: (unit is default)
cores3se_unit
cores3se_base
pio run -e cores3se_unitpio run -e cores3se_unit -t uploadpio run -e cores3se_basepio run -e cores3se_base -t uploadThe project is built with PlatformIO and uses:
The current application branch was developed around esp_dmx v2.02 because it matches the API used by the original application.
With esp_dmx v2.02 on newer ESP32-S3 toolchains, the library may require compatibility changes in dmx_ll.h for renamed ESP-IDF UART register members.
The changes used during development were:
hw->uart_idle_conf_reg_t.tx_idle_numto:
hw->idle_conf.tx_idle_numhw->uart_txbrk_conf_reg_t.tx_brk_numto:
hw->txbrk_conf.tx_brk_numand:
hw->uart_status_reg_t.rxdto:
hw->status.rxdPossible future development:
- ESP-NOW wireless DMX transmitter mode
- Small ESP32 / AtomS3 wireless DMX receiver
- Link-quality / RSSI indicator
- Wireless receiver pairing
- Multiple receiver support
- Art-Net / sACN support
- CRMX-compatible hardware exploration
- Fixture profiles
- Named channels
- Preset export / import
- Additional battery statistics
This project is based on and heavily extended from the official M5Stack:
from the:
The upstream M5Stack repository is distributed under the MIT License.
Many thanks to M5Stack for publishing the original DMX512Tools example and making it available for further development.
This project is released under the MIT License.
Because this project is derived from M5Stack's MIT-licensed DMX512Tools example, the original M5Stack copyright and MIT license notice must be retained for portions derived from the upstream source.
A repository LICENSE file should therefore preserve the upstream MIT notice and clearly identify the additional modifications / contributions made in this project.
Example attribution wording:
Original DMX512Tools source:
Copyright (c) M5Stack
Additional modifications and project-specific code:
Copyright (c) 2026 Zoltan Somogyvari
Issues, test results and pull requests are welcome.
For Base DMX testing, useful reports should include:
- exact M5Stack host model
- Base DMX revision if known
- power supply
- fixture model
- termination configuration
- firmware build environment
- esp_dmx version
- whether the issue also occurs with static DMX values
Please avoid reporting a Base DMX issue as confirmed hardware failure unless the problem has been isolated with reproducible testing.
DMX512 controls lighting and related equipment. Test new firmware in a safe environment before using it during a live event.
This project is an independent community project and is not an official M5Stack product.






