A standalone ESP32 touchscreen that monitors and controls your JK-BMS battery system (LiFePO₄ / Li-ion). Wire it to the BMS, mount it on the wall, and you get a live dashboard, a built-in web app, over-the-air updates, and a Home Assistant integration — all running locally, with nothing leaving your network. One or two battery packs are supported.
The live dashboard, captured straight from the device.
On the screen you get the essentials at a glance: a big SOC ring, the current power draw with a charge/discharge arrow, and a status pill that reflects the BMS's real state (charging, discharging, full, balancing, idle, alarm). Below that are voltage, peaks and temperatures, per-cell bars, a 10-minute power graph, and an energy panel showing total capacity and what you've used over the last 24 h and 6 h. The top bar also shows the time and today's weather.
You can change BMS settings right from the touchscreen — capacity, cell count, current limits, cell OVP/UVP, SOC calibration, balancing, charge profile and temperature protections. Every value is entered on an on-screen keypad and read back from the BMS to confirm it stuck.
A built-in web app lives at http://<device-ip>/. It mirrors the screen in your browser
with the same controls and settings, shows a live snapshot of the LCD, and lets you flash new
firmware — all behind a password. After the first USB flash, every update is wireless (from the
browser or PlatformIO).
Home Assistant is one checkbox away. Turn on MQTT in the web app and each pack appears automatically (auto-discovery) as a device with sensors for SOC, voltage, current, power, temperatures, health, cycles and status, plus switches for the charge/discharge MOSFETs and the balancer. No YAML to write.
For the full technical write-up — rendering pipeline, JK protocol map, web portal and OTA — see esp32-bms-lvgl/README.md.
| Part | Why | Buy | |
|---|---|---|---|
| 📟 | Guition JC3248W535 | The display board — ESP32-S3-N16R8 with a 3.5″ 320×480 touchscreen | AliExpress |
| 🔋 | JK-BMS | Any JK-BMS with an RS485 port (e.g. JK-B2A8S20P) | AliExpress |
| 🔌 | Buck converter | Steps the pack voltage down to a clean 5 V for the board | AliExpress |
| 🧵 | 4-pin + 8-pin cables | To tap the JK-BMS RS485 port without splicing | AliExpress |
Wiring. Connect the BMS RS485/UART to the ESP32 with a shared ground. The defaults are
IO18/IO17 (RX/TX) for the first pack and IO15/IO16 for the second — both changeable in
Settings → BMS. Set the JK's protocol to "JK BMS RS485 Modbus" at 115200 baud, or the
device won't read it.
Power. Feed the board 5 V from the buck converter. Note that powering through the buck often disables the USB data port, so do the first flash over USB from a PC, then switch to the buck. For switched installs, prefer high-side switching — and never connect VBAT to a logic pin.
- Install PlatformIO (CLI or the VS Code extension) and clone this repo.
- Flash once over USB:
cd esp32-bms-lvgl pio run -t upload - On the device, open Settings → WiFi and join your network, then Settings → BMS to set the number of packs and the UART pins.
- Open the web app at
http://<device-ip>/. The IP and login are shown under Settings → System — it'sadminwith a unique per-device password, both editable. - From here, updates are wireless: use the web app's Firmware update, or
pio run+espotato the device (hostnamejkbms).
Running two packs? Set Settings → BMS → Batteries → 2 and wire the second pack to BMS2's pins. The whole UI — tabs, web app and API — adapts automatically.
If you don't have the hardware yet, or want a quick check from a phone, two smaller front-ends speak the same JK protocol:
- 🌐 Web Bluetooth dashboard (
index.html) — a single-file browser app that talks to the BMS over Bluetooth, no install. Open it in Chrome/Edge; add?demo=1to try it with no hardware. - 📟 Arduino_GFX firmware (
esp32-bms/) — the original, lighter build for the same board.
© 2025–2026 Gillis Haasnoot
