Technimal

Modbus I/O Firmware Flasher

E02SA & E04SD (ESP32-WROOM-32U) · flash over USB from your browser
loading firmware catalog…

Step 0. Identify this board

Two things decide which image is correct: which board you are holding (E02SA or E04SD) and what it should do. Getting the board wrong is not just a functional mistake: the E04SD image drives GPIO25/26 as push-pull outputs into the E02SA's input circuit, which can permanently damage the module — reflashing will not undo it. Check it here first.

A. Read the terminal strip

Works on a dead or blank board. Look at the printed terminal numbers:
TerminalE02SAE04SD
13SDAJ1
17V1+DI1+
24A2-DI4-
The housing label says MODEL E02XXXX or MODEL E04XXXX REV.A. E02SA has one output pair (O+ / O-, terminals 9-10); E04SD has four (O1O4, terminals 5-12).

B. Ask the board over USB

If the board already runs one of our builds, its boot banner names a model — but that is the model the installed image was compiled for, not a reading of the hardware. It equals the board only if the last flash was correct, so it confirms nothing on a unit that was flashed wrong. The terminal strip is the authority; this is the quick cross-check. Resetting the unit and reading the banner writes nothing.
Needs Chrome or Edge on the desktop. Close any serial monitor first.

Step 1. What should this unit do?

This picks the firmware line. Each is built from the same source tree and versions independently; a unit runs exactly one of them, and changing the line changes what the unit is — it is not an update.

Loading firmware catalog…

Step 2. Which board is it?

Step 3. Which version?

Latest is selected by default. Pick an older release here if you need to put a unit back exactly as it shipped. The Changelog tab says what each release changes.

Step 4. Connect & flash

Selected: · E02SA ESP32 · 4 MB
📄 open E02SA datasheet
⚠ Your browser can't flash — use Chrome or Edge on desktop. ⚠ Not allowed — serve over HTTPS or localhost. loading flasher…
Flashing…
Plug the board in via USB. Click Connect & Flash, pick the serial port, then Install. Tick Erase device only if you also want to wipe the stored config (NVS) — network settings, MQTT credentials and Modbus setup all go with it. Progress and the outcome are mirrored onto this page, and the device log opens automatically when it finishes. If the port doesn't appear, install the USB-UART driver (CP210x / CH34x) for your board.
“Installation failed / Failed to initialize”? esptool couldn't enter the chip's download mode. Try, in order:
  1. Close any program (or this page's serial monitor, or Identify over USB) holding the port, then flash again.
  2. Put the board in download mode: hold the BOOT button (GPIO0) while clicking INSTALL, or press RESET just before.
  3. Use a data-capable USB cable and a direct port (avoid hubs); some cables/hubs don't pass the DTR/RTS auto-reset signals.

Device log (serial monitor)

Watch the device's serial output — boot banner, IP address, the 5-second status line. Open this after flashing (the flasher and the monitor can't use the USB port at the same time). Click Disconnect before re-flashing.


  

Sending this to support? Use Download .txt / Copy for support — both prepend the browser, the page URL, the exact firmware selected here and the identified board, and both include what the flasher did. A bare screenshot of the log rarely carries enough. Reproduce the fault first, then press ↺ Reset device and let it boot once so the banner (boot: E02 fw=… reset=…) is in the capture.

If the log looks like garbled characters, the baud rate is wrong — disconnect, pick another baud (all our firmware uses 115200), and reconnect.

Native flashing (advanced / fallback)

Use this if the browser flasher can't connect (e.g. some FTDI adapters on macOS), or for scripting/production. It uses Espressif's esptool and the same firmware images. Matches the current selection: .

1. Install esptool (needs Python 3)
pip install esptool

No Python? Download a standalone esptool binary from github.com/espressif/esptool/releases and drop the --chip/command args in the same way.

2. Download the firmware into one folder

merged.bin erases the stored configuration. esptool writes it from address 0 padded with 0xFF, so it overwrites NVS at 0x9000 along with everything else — the unit's WiFi, MQTT and register settings are gone and have to be entered again. Use it for a new or blank board. To keep a deployed unit's configuration, flash the individual images below instead: only the listed regions are written and NVS is untouched.

or the individual images (keeps the stored configuration): loading…
3. Find your serial port
OSPort looks likeHow to find it
WindowsCOM5Device Manager → Ports (COM & LPT)
macOS/dev/cu.usbserial-XXXXls /dev/cu.* in Terminal
Linux/dev/ttyUSB0ls /dev/ttyUSB* /dev/ttyACM*; add your user to the dialout group (sudo usermod -aG dialout $USER, then re-login) or use sudo
4. Flash — single merged file (erases the stored configuration)
esptool --chip esp32 --port <PORT> --baud 460800 --before default-reset --after hard-reset write-flash --flash-mode dio --flash-freq 40m --flash-size detect 0x0 merged.bin
…or the individual images at their offsets (keeps the stored configuration)
select a firmware version above
…or use the helper script (does step 4 for you)
Windows: flash_esp32.bat <PORT> merged.bin
macOS/Linux: chmod +x flash_esp32.sh && ./flash_esp32.sh <PORT> merged.bin

Save the script next to merged.bin. It checks the file exists, finds esptool (or falls back to python -m esptool), flashes, and reports success or failure with hints. It also detects your esptool version and uses the matching option spelling, so it works on both v4 and v5 with no deprecation warnings.

The commands above use esptool v5 spelling. On the older v4 use underscores instead (write_flash, --flash_mode, --flash_freq, --flash_size, default_reset, hard_reset, erase_flash) — or just use the helper script above, which picks the right spelling for you. Check with esptool version.

Replace <PORT> with your port from step 3. On Windows, if esptool isn't on PATH use python -m esptool. To also wipe stored config first: esptool --port <PORT> erase-flash. If it can't connect, hold BOOT (GPIO0) while starting, or check the USB-UART driver (CP210x / CH340 / FTDI).

Documentation

Datasheet & user manual for each model (pinout, register map, wiring, troubleshooting; the Timestamp and Edge-MQTT variants have their own sections at the end):

📄 E02SA datasheet 📄 E04SD datasheet

Which firmware line does what

LinePick it whenTalks

After flashing

  1. The status LED blinks (init), then goes solid once it has an IP and the service is up.
  2. To configure: short J1–J2 at boot → SoftAP E02-xxxxxx / E04-xxxxxx (pass edge12345) → http://192.168.4.1/. The portal fields differ per line (Modbus on Converter, MQTT on Timestamp / Edge-MQTT).
  3. Check the Monitor tab: the boot banner names the model and firmware version, and the status line every 5 s carries uptime, reset cause, link and counters.
  4. Discover & test over the network with the bench-test script (Modbus TCP / mDNS — Converter only): ⬇ bench_test.py
    needs pip install pymodbus zeroconf, then python3 bench_test.py (auto-discovers via mDNS).

Changelog — should I update?

Newest release first, per firmware line. Every older version stays flashable, so a unit can always be put back. Run Identify over USB on the Flash tab and this page will mark what is already on your board and what a flash would gain you.

Loading firmware catalog…