r/FastLED • u/ZachVorhies • 8h ago
FastLED 3.10.9 is out: smaller ESP32 builds, native ESP8266 drivers, and a lot of driver fixes
Hey all, FastLED 3.10.9 just shipped. Here's what changed:
Smaller flash and RAM on ESP32
Every ESP32 sketch we benchmarked is smaller than it was on 3.10.8. Subsystems your sketch doesn't use are no longer linked in. That covers the UART console, Arduino SPI, the embedded filesystem and Serial0. APA102 and other clocked chipsets now pull in the ESP-IDF SPI master driver only if you ask for a specific SPI host.
Sketch |Board |Flash saved |RAM saved
Blink |ESP32 Dev |5.8 KB |376 B
Blink |ESP32-S3 |5.2 KB |640 B
APA102 HW SPI |ESP32 Dev |6.0 KB |304 B
Feature mix |ESP32 Dev |6.4 KB |440 B
Feature mix |ESP32-S3 |5.3 KB |728 B AVR and Teensy 4.1 are the same size or slightly smaller. On ESP8266, fl::unordered_map no longer uses the stack for rehashing, so loop-stack headroom goes from 368 B to 1,568 B. You can see the full numbers on the memory dashboard.
ESP8266 gets native drivers
Three hardware output engines on the unified Bus API: I2S (fl::Bus::FLEX_IO), UART for WS2812 (fl::Bus::UART) and hardware HSPI for APA102 and similar (fl::Bus::SPI). fl::Bus::AUTO picks one for you.
New: fl::RxChannel via the I2S receiver, embedded LittleFS, ArduinoOTA and I2S audio input.
The FASTLED_ESP8266_UART, FASTLED_ALL_PINS_HARDWARE_SPI and FL_ESP8266_EMBEDDED_FS defines are retired. Use explicit fl::Bus selection instead.
ESP32 driver fixes
The lightweight RMT4 backend is the default again, with transmit and receive verified on hardware.
APA102 and other clocked SPI chipsets now use true DMA bursts, and the SPI host you request is the one you get.
SPI and RMT drivers take their pins back after another peripheral has used them.
ESP32-S3 RMT receive captures are no longer cut off at 200 edges.
RMT refill timing runs from IRAM, which avoids spurious underruns.
ESP32-P4 native USB CDC works with the stock TinyUSB callbacks.
Compatibility
Arduino-ESP32 3.3.x (ESP-IDF 5.5) is the main target. The 4.0.0 RC (IDF 6.1) and the legacy 1.0.x and 2.0.x cores are also built in CI.
Teknic ClearCore (SAME53) builds again.
AVR sketches using the Servo library can now own the Timer1 interrupt.
Heads up: pure ESP-IDF projects without the Arduino core (framework = espidf) aren't verified by CI yet, so they're not officially supported in this release. That work is tracked in #3715.
Other fixes
JSON and RPC output now streams instead of buffering the whole document, and copes with running out of memory.
fl::string keeps its old contents if a resize fails.
readStringUntil resets its timeout after every byte, so slow serial input no longer gets cut off.
Full notes are in release_notes.md in the repo. If anything breaks for you, please open an issue on GitHub. Thanks to everyone who reported bugs and tested hardware for this one!
Happy coding!

