Troubleshooting
April 17, 2026 ยท View on GitHub
When troubleshooting, always make sure you are using the tested versions of the external dependencies first.
How-to
By default, only error messages directly caused by this firmware can be viewed.
To view these error messages, a USB serial port connection is required.
Open the Serial Monitor in the Arduino IDE
(hit ctrl+shift+M),
then reset your DevKit board to avoid missing any messages.
Important
You must configure the serial monitor to 115200 bauds. Otherwise you will not see any error messages.
Other error messages are not displayed by default. In order to enable them, go to the Tools menu and set "Core debug level" to "error". After that, upload the firmware again. These additional error messages are caused by the operating system or system libraries. Check the internet for a description.
This article focuses on firmware-defined error messages.
ESP32S3 boards not having USB-to-UART chip
Many ESP32S3 boards do not feature an USB-to-UART chip (typically there is a single USB header). To display any error message in these boards, configure "USB CDC on boot" to "Enabled" in Arduino IDE (Tools menu).
This is incompatible with USB connectivity. if you are using USB connectivity, temporarily switch to "dummy" connectivity for troubleshooting purposes.
Remember to upload the firmware again.
Firmware-defined error messages
Error messages are preceded by the message **CUSTOM FIRMWARE ERROR**
and repeated every few seconds.
Error messages caused by your custom code
-
Battery monitor already started
You called
batteryMonitor::configure()while the firmware is running. This is not allowed. -
Battery monitor already configured
You called
batteryMonitor::configure()twice. Just one battery monitor can be configured. -
The input number ... can not be mapped, since it is not assigned
Check the first parameter to
inputMap::add(). You are passing a firmware-defined input number which is not assigned to the input hardware (inputs::add...). -
LEDStrip: pixel count can not be zero
You are not allowed to pass zero to the third parameter of
pixels::configure(). -
A pixel group was configured twice
You are not allowed to call
pixels::configure()twice using the same pixel group (first parameter). -
User interface instance is null
You are not allowed to pass
nullptras the first parameter toui::add(). -
Useless rotary encoder: no input number for clockwise rotation and Useless rotary encoder: no input number for counter-clockwise rotation
You are passing a non-initialized
InputNumbervariable toinputs::addRotaryEncoder()(third or fourth parameter). -
I2C: unable to initialize bus ...
The given pins to
inputs::initializeI2C()are not capable for I2C operation. -
I2C: invalid address ...
The number passed as an I2C address is not valid. Valid I2C full addresses are in the range [0,127]. Valid I2C hardware addresses are in the range [0,7]. Check your calls to
inputs::addMCP23017Expander(),inputs::addPCF8574Expander(),batteryMonitor::configure()orui::add(). -
I2C: device not found, but required...
A GPIO expander is required by the input subsystem but it was not found in the I2C bus.
- Check your wiring first, including power lines (
3V3andGND). - Check that all GPIO expanders are attached to the proper I2C bus
using the expected
SCLandSDApins. - When using the secondary bus or non-standard GPIO pins,
ensure there is a call to
inputs::initializeI2C().
- Check your wiring first, including power lines (
-
I2C: unable to detect full address...
You specified an I2C hardware address, but the system is unable to locate the corresponding full address:
- Check your wiring first as in the previous error message.
- Ensure two I2C devices are not using the same hardware address.
- Ensure your custom firmware is passing the hardware address
matching your actual hardware address configured using
the
A0,A1andA2pins. Beware of bit order:A0is the least significant bit. - Use a full I2C address instead.
-
Invalid position (...) in a coded rotary switch. Valid range is [0,...)
Either:
- You specified a position index out of the range of available positions in a coded rotary switch.
- You are missing one or more input pins.
For example:
RotaryCodedSwitch rotsw; ... rotsw[8] = 16; inputs::addRotaryCodedSwitch(rotsw, GPIO_NUM_3, GPIO_NUM_4, GPIO_NUM_5);Since there are 3 input pins, your rotary switch has 8 positions in the range [0,7]. Thus,
rotsw[8]is out of range. -
"Input numbers used in all coded switches must be unique
All calls to
inputHub::codedSwitch::add()must specify unique input numbers in their parameters.For example:
... inputHub::codedSwitch::add(10,11,12,13,sw1); inputHub::codedSwitch::add(13,14,15,16,sw2); ...is wrong because the input number
13can not be shared.
When troubleshooting I2C error messages, the I2C probe firmware will be handy.
-
There is no HID connectivity:
You chose a connectivity option that discards the supported connectivity (except for
Connectivity::DUMMY) in your board. Choose a connectivity option supported by your board.
The following error messages are self-describing:
- You can not assign the same input number for the left and right clutch paddles
- You can not assign the same input number for increase and decrease bite point
- You can not assign the same input number to two DPAD inputs
- For neutral gear, a combination of two or more hardware inputs is required
- You have analog clutch paddles, but you forgot to call inputHub::clutch::inputs()
- There are no analog clutch paddles, but you called cmdRecalibrateAxisInputs()
- There are no clutch paddles, but you called inputHub::clutch::bitePointInputs()
- There are no clutch paddles, but you called inputHub::clutch::cycleWorkingModeInputs()
- There is no DPAD, but you called inputHub::dpad::cycleWorkingModeInputs()
- There are no ALT buttons, but you called inputHub::altButtons::cycleWorkingModeInputs()
- inputs::setAnalogClutchPaddles() called twice
- Unable to add a user interface instance while running
- Useless rotary encoder: same input numbers for clockwise and counter-clockwise
- inputs::addJoystick() is using the same pin for both axes
Internal error messages
The following error messages should not appear. Please, open an issue.
- Provider not injected to service...
- Logic error at batteryCalibration::getBatteryLevel()
- Parameter out of range: batteryCalibration::addSample()
- Logic error at batteryCalibration::addSample()
- Unable to start the battery monitor daemon
- Input service already started
- Unable to create decoupling queue
- Unable to create inputHub task
- Unable to create polling task
- Unknown pixel driver in LED strip
- Unable to create UI daemon
- Wrong count of input pins in a coded rotary switch
- LEDStrip: rmt_new_tx_channel() failed
- LEDStrip: rmt_new_bytes_encoder() failed
- getADCreading: adc_oneshot_new_unit() failed
Non-error messages
Some "error messages" are not errors at all. You can ignore them:
- ... nvs_open failed ...
- E (15) gpio: gpio_install_isr_service(500): GPIO isr service already installed
- E NimBLEAdvertisementData: Cannot add UUID, data length exceeded!
- E (67) rmt: rmt_new_tx_channel(265): DMA not supported
- E (77) adc_oneshot: adc_oneshot_config_channel(180): invalid channel
- E (173310) task_wdt: esp_task_wdt_reset(705): task not found
Other error messages
-
***ERROR*** A stack overflow in task arduino_usb_eve has been detected.
Go to
Arduino IDE > Tools > Core debug leveland set it toNoneorError. Then, upload the firmware again. -
MS Windows "USB not recognized" error" message (ESP32S3 boards)
If your host computer shows an "USB not recognized" error message, you forgot to enable USB connectivity but USB mode is set to "USB-OTG (TinyUSB)". See "Connectivity".