Exposes a high-speed USB serial port at 2Mb baud for driving LED strips using the NeoPixelBus library. It’s intended to replace slow Arduino-based solutions (a 3.3V to 5V level shifter may be required). A data-integrity check (Fletcher's checksum) is included in the new 'Awa' protocol for HyperHDR, eliminating random flashing caused by serial transmission errors. This option must be enabled in HyperHDR for the system to work correctly, as shown in the configuration screenshot below.
Make sure that the serial chip on your ESP32 can handle 2Mb baud: for example, the CP2102 cannot, as its maximum speed is 1Mb. You can compile a version for that lower speed, but that defeats the purpose. The inexpensive CH340G handles 2Mb without issues, and the CH9102x should also work — even at 4Mb.
There is also my fork, HyperSerialWLED, which includes support for the AWA serial protocol at 2Mb for both ESP8266 and ESP32: https://github.com/awawa-dev/HyperSerialWLED I can’t guarantee it will be as stable as HyperSerialESP32 because WLED performs many additional background tasks (e.g., handling Wi-Fi), and serial-port timing may become problematic with a larger number of LEDs. However, it allows you to keep all the benefits offered by WLED, which may be a significant advantage for some users.
| LED strip / Device | HyperSerialESP32 |
|---|---|
| SK6812 cold white | yes |
| SK6812 neutral white | yes |
| WS281x | yes |
| SPI (APA102, SK9812, HD107...) | yes |
ESP32 MH-ET Live (CP2104 or CH9102x: 4Mb speed) and ESP32-S2 Lolin mini (CDC: 5Mb speed)
Why the data integrity check was introduced which causes incompatibility with other software? Because at 2Mb speed many chip-makers allow few percent error in the transmission. And we do not want to have any distracting flashes. Broken frames are abandon without showing them. At 100Hz and with 250 LEDs, up to approximately 1–5% of frames may be corrupted.
There are two versions of the firmware for ESP32 and ESP32-S2. The 'factory' (in the recovery_firmware.zip archive) and the 'base' one. Factory firmware should be flashed to offset 0x0, base firmware to offset 0x10000.
ESP32-S2 Lolin mini:
Requires using esptool.py to flash the firmware e.g.
esptool.py write_flash 0x10000 firmware_esp32_s2_mini_SK6812_RGBW_COLD.binoresptool.py write_flash 0x0 firmware_esp32_s2_mini_SK6812_RGBW_COLD.factory.bin
Troubleshooting: ESP32-S2 Lolin mini recovery procedure if the board is not detected or is malfunctioning.
- Put the board into dfu mode using board buttons: press
Rst+0buttons, then releaseRst, next release0
Do not reset or disconnect the board until the end of the recovery procedure. - Execute
esptool.py erase_flash - Flash 'factory' version of the firmware e.g.
esptool.py write_flash 0x0 firmware_esp32_s2_mini_SK6812_RGBW_COLD.factory.bin - Reset the board manually with the
Rstbutton. The board should be detected as a COM port in the system.
Generic ESP32:
Recommend to use esphome-flasher
For RGBW LED strip like RGBW SK6812 NEUTRAL white choose: firmware_esp32_SK6812_RGBW_NEUTRAL.bin
For RGBW LED strip like RGBW SK6812 COLD white choose: firmware_esp32_SK6812_RGBW_COLD.bin
For RGB LED strip like WS8212b or RGB SK6812 variant choose: firmware_esp32_WS281x_RGB.bin
For SPI driven RGB LED strip APA102: firmware_esp32_SPI_APA102_SK9822_HD107.bin, WS8201: firmware_esp32_SPI_WS2801.bin
To disable the first LED used as a sacrificial level shifter, use this HyperHDR feature
For the RGBW firmware the white channel is automatically calculated and R,G,B channels are corrected.
ESP32:
LED output (non-SPI): GPIO 2
LED output (SPI): GPIO 4 for Clock, GPIO 2 for Data
In HyperHDR Image Processing→Smoothing→Update frequency you should do not exceed the maximum capacity of the device. Read more here: how to get statistics
To test the maximum performance in HyperHDR, enable Image Processing→Smoothing→Continuous output, set a high value for Update Frequency in the same tab and set any color in the Remote Control tab as the active effect. Get the statistics and optionally adjust Update Frequency. After testing, you need to disable Continuous outputand set Update frequency" according to your results.
Configure HyperHDR:
- set
Refresh timeto zero - set
Baudrateto 2000000 - enable
HyperHDR's AWA protocol - enable
ESP8266/ESP32/Rp2040 handshakethat may help you to properly initialize the ESP board
Enabling White channel calibration is optional, if you want to fine tune the white channel balance of your sk6812 RGBW LED strip.
Currently we use PlatformIO to compile the project. Install Visual Studio Code and add PlatformIO plugin. This environment will take care of everything and compile the firmware for you. Low-level LED strip support is provided by my highly optimizated (pre-fill I2S DMA modes, turbo I2S parallel mode for up to 2 segments etc) version of Neopixelbus library: link.
But there is also an alternative and an easier way. Just fork the project and enable its Github Action. Use the online editor to make changes to the platformio.ini file, for example change default pin-outs/speed or enable multi-segments support, and save it. Github Action will compile new firmware automatically in the Artifacts archive. It has never been so easy!
Tutorial: https://github.com/awawa-dev/HyperSerialESP32/wiki
Using parallel multi-segment allows you to double your Neopixel (e.g. sk6812 RGBW) LED strip refresh rate by dividing it into two smaller equal parts. Both smaller segments are perfectly in sync so you don't need to worry about it. Proposed example of building a multisegment:
- Divide a long or dense strip of LEDs into 2 smaller equal parts. So
SECOND_SEGMENT_START_INDEXin the HyperSerialESP32 firmware is the total number of LEDs divided by 2. - Build your first segment traditional way e.g. clockwise, so it starts somewhere in middle of the bottom of frame/TV and ends in the middle of the top of frame/TV
- Start the second segment in the opposite direction to the first one e.g. counterclockwise (
SECOND_SEGMENT_REVERSEDoption in the HyperSerialESP32 firmware configuration must be enabled). So it starts somewhere in the middle of the bottom of the frame/TV and ends in the middle of the top of the TV/frame. Both segments could be optionally connected if possible at the top but only 5v and ground ( NOT the data line). - The data line starts for both segments somewhere in the middle of the bottom of the TV/frame (where each of the LED strips starts)
- Configuration in HyperHDR does not change! It's should be configured as one, single continues segment. All is done in HyperSerialESP32 firmware transparently and does not affect LED strip configuration in HyperHDR.
You also must configure data pin (and clock pin for SPI LEDs) in the platformio.ini. Review the comments at the top of the file:
SECOND_SEGMENT_DATA_PIN- These is data pin for your second stripSECOND_SEGMENT_CLOCK_PIN- These is clock pin for your second strip (SPI LEDs only, not for sk6812/ws2812b etc)
You add these to your board's config. Be sure to put -D in front of each setting.
Examples of final build_flags for 288 LEDs divided into 2 equal segments in the platformio.ini:
[env:SK6812_RGBW_COLD]
build_flags = -DNEOPIXEL_RGBW -DCOLD_WHITE -DDATA_PIN=2 ${env.build_flags} -DSECOND_SEGMENT_START_INDEX=144 -DSECOND_SEGMENT_DATA_PIN=4 -DSECOND_SEGMENT_REVERSED
...
[env:WS281x_RGB]
build_flags = -DNEOPIXEL_RGB -DDATA_PIN=2 ${env.build_flags} -DSECOND_SEGMENT_START_INDEX=144 -DSECOND_SEGMENT_DATA_PIN=4 -DSECOND_SEGMENT_REVERSED
...
Implementation example:
- The diagram of the board for WS2812b/SK6812 including ESP32 and the SN74AHCT125N 74AHCT125 level shifter.
You can configure LED power pin in the platformio.ini to power off LEDs while not in use.
Review the comments at the top of the file:
LED_POWER_PIN- This is the data pin external power controlLED_POWER_INVERT- This inverts the output of the exernal power control pin. If set tofalse, the pin state will be low when the relay is turned off. If set totrue, the pin state will be high when the relay is off. If not defined, default isfalse.
Note: For static color configuration this mechanism will turn off the LEDs. To counter this enable "Continuous Output" in HyperHDR "Smoothing" module. For esp32 and relay control, you may want to disable the "Handshake" option in the Adalight HyperHDR driver to avoid the relay immediately shutting down when resetting the device while initializing the connection.
ESP32 MH-ET LIVE mini is capable of 4Mb serial port speed and ESP32-S2 lolin mini is capable of 5Mb. But to give equal chances for a single-segment mode all models were tested using the default speed of 2Mb which should saturate Neopixel data line. Parallel multi-segment mode uses the highest option available because communication performance is critical here.
Parallel multi-segments can double your large sk6812/ws2812b setup refresh rate for free. All you need is to properly project & construct the LED strip and use HyperSerialESP32 v9. Parallel communication provides perfect synchronization between Neopixel segments.
| Parallel multi-segment mode / Device | ESP32 MH-ET LIVE mini @ 4Mb speed |
ESP32-S2 Lolin mini @ 5Mb speed |
|---|---|---|
| 300LEDs RGBW Refresh rate/continues output=100Hz SECOND_SEGMENT_START_INDEX=150 |
100 | 100 |
| 600LEDs RGBW Refresh rate/continues output=83Hz SECOND_SEGMENT_START_INDEX=300 |
83 | 83 |
| 900LEDs RGBW Refresh rate/continues output=55Hz SECOND_SEGMENT_START_INDEX=450 |
55 | 55 |
| Single RGBW LED strip / Device | ESP32 MH-ET LIVE mini | generic ESP32 (CH340C) | ESP32-S2 lolin mini |
|---|---|---|---|
| 300LEDs RGBW Refresh rate / continues output=83Hz |
83 | 83 | 83 |
| 600LEDs RGBW Refresh rate / continues output=42Hz |
42 | 42 | 42 |
| 900LEDs RGBW Refresh rate / continues output=28Hz |
28 | 28 | 28 |


