- Task 4 hardware checkpoint approved: zero flicker during 30s UDP burst test
- WIFI_PS_NONE confirmed working on ESP32-C3 SuperMini
- GPIO3/6/7 pin assignments validated on physical hardware
- Updated SUMMARY.md with hardware test result and plan completion
- STATE.md advanced to plan 3, progress bar updated to 25%
Setup + WiFi connect + WIFI_PS_NONE + static loop with coexistence test procedure comments
firmware/.gitignore
Excludes .pio/ build artifacts and credentials.h
Architecture Decisions Made
-DESP32_ARDUINO_NO_RGB_BUILTIN flag: Mandatory to prevent fatal CONFLICT! driver_ng is not allowed to be used with the legacy driver on Arduino ESP32 core 3.x when using NeoPixelBus legacy RMT driver.
GPIO3 for SK6812 RMT: Confirmed safe on ESP32-C3 SuperMini (no JTAG conflict). GPIO6/7 for WS2801 SPI with fallback note (GPIO0/1) if JTAG conflict found on hardware.
NeoWs2801Spi2MhzMethod: 2MHz SPI chosen for signal integrity over a 5m cable run (vs. default higher speeds).
stripWand.Show() before stripSchrank.Show(): RMT DMA starts non-blocking for SK6812; SPI blocks ~4ms — both complete within ~10ms window concurrently.
Brightness clamping to [0.0f, BRIGHTNESS_MAX]: Applied in both applyBrightnessW and applyBrightnessR before scaling, respecting the 40% hardware cap (D-09).
voidinitStrips();voidshowBothStrips();voidsetAllWand(RgbwColorcolor);voidsetAllSchrank(RgbColorcolor);RgbwColorapplyBrightnessW(RgbwColorc,floatfactor);RgbColorapplyBrightnessR(RgbColorc,floatfactor);externStripWandstripWand;// direct access for animation engine (Plan 03)
externStripSchrankstripSchrank;
Serial output: "WIFI_PS_NONE set — RMT coexistence mode active" + WiFi IP address
SK6812 strip illuminated correctly
WS2801 strip illuminated correctly
Zero visible flicker during 300-packet UDP burst test at 10 packets/second for 30 seconds
WiFi+RMT coexistence risk is retired. All Plans 02, 03, 04 can proceed.
Deviations from Plan
Auto-fixed Issues
None — plan executed exactly as written.
Note:credentials.h was correctly excluded from git (per firmware/.gitignore) rather than committed with placeholder values. This is the intended behavior — the gitignore entry is working correctly.