Xiao Ble Sense - Ota Dfu from Arduino IDE code

Hi there,

And Congrats on getting that Salad mixed and working…It’s a big deal the DFU - OTA area everyone can use it if it worked easier.
One reason I like the MCUBoot Bootloader over Adafruity.

Some stuff to consider…and AI observations.

Key Observations on the User’s Approach

  1. He used Adafruit’s adafruit-nrfutil tool, which is fine — it generates the correct zip DFU packages expected by the bootloader.
  2. He had issues with BLE disconnection and name change to ADA_DFU, which is a known quirk with the Adafruit bootloader. The app doesn’t reconnect automatically unless explicitly designed to do so.
  3. He relied on Bluefruit Connect, which isn’t maintained as actively as Nordic’s tools and doesn’t handle edge cases well (like reconnecting to ADA_DFU).

What He Did Right

  • Replaced the outdated bootloader with an Adafruit UF2-compatible one (from AovestdiPaperino’s GitHub likely — he’s known in the community).
  • Used BLE UART to trigger OTA DFU without buttons — ideal for sealed, headless systems.
  • Created a real-world workaround for OTA reconnection glitches.

What Could Be Improved

1. Use nRF Connect for Mobile Instead

  • It automatically handles reconnection to DFU mode device names.
  • Supports DFU ZIP packages directly (the .dat, .hex, .bin bundled in a .zip).
  • Better error reporting and logging.
  • Actively maintained by Nordic.

2. Use a Proper Bootloader with Buttonless DFU Support

  • Either Adafruit’s latest bootloader with buttonless DFU enabled
  • Or MCUboot + Zephyr/NCS (more complex, but truly robust)
  • This solves the “needs manual reset” problem entirely when correctly configured.

3. Simplify With Arduino IDE Tools

  • If the device is always sealed and headless, you can pre-bundle the DFU trigger via:
#include <bluefruit.h>
Bluefruit.begin();
Bluefruit.setTxPower(4);
Bluefruit.setName("SensorNode");
bledfu.begin(); // Needed if using Adafruit bootloader

If doing sealed SensorNodes like my project:

  • :white_check_mark: Stick with Adafruit’s bootloader for UF2 + OTA (just flash it once using SWD).
  • :white_check_mark: Use nrfutil dfu genpkg to generate OTA ZIP from Arduino .hex.
  • :white_check_mark: Trigger DFU in code (enterOTADfu() or NVIC_SystemReset() after setting flags).
  • :white_check_mark: Use nRF Connect for Mobile for smoother updates — especially with multiple SensorNodes.

IMO, Bluefruit Connect can work, but it’s clunky.
nRF Connect for Mobile is more robust, supports reconnections, and should be the go-to for DFU via BLE.

I’m currently working on a Multi-Node connected SensorNode setup
The DFU is the holy grail for this sort of thing.

HTH
GL :slight_smile: PJ :v:



6 SensorNode’s each with TEMP, HUMID, BATTERY, Motion or Digital BLE characteristics. all readable and two Notifies each. All 6 connected to a Xiao ESP32S3 :crossed_fingers:

1 Like