Files
JC3636W518EN/12-OBD-Speed
patriandClaude Opus 5.5 be69bda4f1 12-OBD-Speed: battery voltage arc and idle/screen-off mode
- ATRV every 2 s; voltage arc in the bottom gap (11-15 V) + number,
  colored by state (low / weak / resting / charging / overcharge)
- idle after Off/2/5/10 min without speed data (settings page, NVS):
  screen off, GIF paused, OBD polling stopped, ATRV every 30 s;
  wakes on touch (swallowed by a top-layer overlay) or > 13.2 V
- status pill moved up to make room for the voltage

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 18:32:56 +02:00
..

OBD Speed (JC3636W518)

Vehicle speed from an ELM327 over BLE, shown as a big number + arc gauge on top of an animated GIF. Uses the shared board library and LVGL 9.6 (../shared), NimBLE-Arduino 2.5.1.

Use

  • Speed page — speed in km/h (-- = no data: not connected, or ignition off), arc gauge 0–200 km/h, status pill below the number (adapter name when running, otherwise what it is doing). Battery voltage (ATRV, every 2 s) as a small arc in the bottom gap (11–15 V) + number; color: red < 11.8 V, orange < 12.2 V, green < 13.0 V (resting OK), blue ≤ 14.8 V (charging), red above (overcharge).
  • Swipe left → adapter menu — scans while open. OBD-like adapters (name OBD/ELM/…, or service FFF0/FFE0/18F0) are listed first in green. Tap one to select it: it is remembered (NVS) and connected immediately. Forget clears the remembered adapter, Done (or swipe right) returns to the speed page.
  • Swipe left again → settings — screen rotation 0 / 90 / 180 / 270 degrees, and screen off without data Off / 2 / 5 / 10 min (default 2). Both remembered in NVS.
  • Idle — after that time without speed data (ignition off, adapter gone) the screen goes dark, the GIF pauses and OBD polling stops; only ATRV every 30 s (answered by the adapter itself, doesn't wake the car's bus). Wakes on a touch (the touch is swallowed) or by itself when the voltage rises above 13.2 V (engine started). Not used while no adapter is chosen.
  • On power-up the remembered adapter is connected automatically; if the link drops or the adapter is not there (car off), it retries every 3 s. With no adapter remembered, the device starts on the menu page.

How it talks to the ELM327

Service FFF0, notifications + commands on FFF1 (verified with the user's "OBDII" adapter, see docs/2026-10-23_ble_scanner_car_test.txt, made with the BLE scanner tool that was removed afterwards — in git history); other adapters: first notify+write pair. Init: ATZ, ATE0, ATL0, ATS0, ATH0, ATSP0, 0100; then 010D (speed) is polled continuously. Serial (115200) prints status changes as [obd] ....

Files

File What
src/main.cpp LVGL UI (tileview: speed page + menu page)
src/obd_link.cpp/.h BLE scan, connect/reconnect, ELM327 init and speed polling (background task on core 0)
src/font_speed_120.c Montserrat Medium 120 px, digits and -, 4 bpp (generated with lv_font_conv, see header)
data/bg.gif Background (ezgif-5-cb56986bc7.gif, 360×360), linked into the firmware via board_build.embed_files

Replace data/bg.gif with any 360×360 GIF to change the background (keep it under ~3 MB).