Files
JC3636W518EN/10-OBD-Display-2024
patriandClaude Opus 5.5 6e7206b821 LVGL 9 tuning: CPU 86% -> 53% at full GIF speed (display_gif_embedded)
- render in RGB565_SWAPPED (ST77916 byte order), no swap pass in flush;
  flush swaps only if the display format is plain RGB565 (runtime check,
  the previous #if compared enum values and was always true)
- QSPI clock 50 -> 80 MHz
- LV_ATTRIBUTE_FAST_MEM / FLUSH_READY in IRAM (lv_attr_jc3636w518.h)
- display_gif_embedded: GIF decoded in the display's color format (no alpha)
- tested without gain: LV_GIF_CACHE_DECODE_DATA (unused in 9.6), 120-row buffers

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 01:29:25 +02:00
..

OBD Display (2024 experiments)

Earlier attempt to show car speed from an ELM327 OBD-II adapter on the JC3636W518. Because the ESP32-S3 has no Bluetooth Classic, the design used a second (classic) ESP32 as a bridge:

ELM327 --(BT Classic SPP)--> classic ESP32 (elm327_wifi_bridge) --(WiFi AP, HTTP /speed)--> JC3636W518 (display_speed_wifi)

Split out of 2-Program Example/Demo_Arduino/ST77916_LVGL_DEMO/ on 2026-10-22 and converted to PlatformIO. History is in git.

Projects (all PlatformIO)

Folder Runs on What it does Was
display_speed_wifi/ JC3636W518 GIF background from SD (A:wallpaper.gif) + joins AP ESP32-Access-Point, polls http://192.168.4.1/speed, shows it in a label ST77916_LVGL_DEMO/8.4/
display_gif_sd/ JC3636W518 GIF from SD (A:wallpaper.gif) + static text label ST77916_LVGL_DEMO/working version/
display_gif_embedded/ JC3636W518 GIF compiled into firmware (src/loligod.c, 2.2 MB GIF → 3.4 MB firmware, uses default_16MB.csv with 6.25 MB app slots). LVGL 9.6.0, plays at full GIF speed (~23.4 fps), prints FPS once per second. GIF starts without SD card. WiFi code commented out. ST77916_LVGL_DEMO/ (top level)
elm327_wifi_bridge/ classic ESP32 (not S3) BT Classic → ELM327 named OBDII (PIN 1234), WiFi AP ESP32-Access-Point / 123456789, serves /speed (kph) ST77916_LVGL_DEMO/esp23_elm327_to_wifi/
elmulator/ classic ESP32 Fake ELM327 for testing without a car. Library in lib/ELMulator, envs simple, custom, wifi (BT name OBDII) ST77916_LVGL_DEMO/ELMulator-master/
assets/gifs/ — GIF files (dump/ = unused collection) ST77916_LVGL_DEMO/gifs/
_archive/lvgl9_broken/ — Unfinished LVGL 9 port, does not compile, not converted ST77916_LVGL_DEMO/9.1/

Build / upload

Open a project folder in VS Code with the PlatformIO extension, or from a terminal:

pio run -d display_speed_wifi                 # build
pio run -d display_speed_wifi -t upload       # flash (COM21)
pio device monitor -d display_speed_wifi      # serial monitor
pio run -d elmulator -e wifi -t upload --upload-port COMxx

(pio = %USERPROFILE%\.platformio\penv\Scripts\pio.exe if not on PATH.)

Configuration

  • JC3636W518 projects: pioarduino platform 51.03.05 (= Arduino core 3.0.5), board esp32-s3-devkitc-1 with 16 MB QIO flash, OPI PSRAM, huge_app.csv (3 MB app), USB-CDC on boot, COM21. Libraries come from the vendor folder via lib_extra_dirs = ../../2-Program Example/Demo_Arduino/library. Each project uses its own include/lv_conf.h (-DLV_CONF_INCLUDE_SIMPLE -Iinclude):
    • display_speed_wifi: LVGL heap 4 MB in PSRAM (ps_malloc)
    • display_gif_sd: LVGL heap 7 MB in PSRAM
  • Classic ESP32 projects: official espressif32@6.10.0 (Arduino core 2.0.17), board esp32dev, huge_app.csv. Set upload_port to the classic ESP32's COM port. Bridge libraries: powerbroker2/ELMduino@3.4.1, esphome/ESPAsyncWebServer-esphome@3.4.0.

Notes

  • src/montserrat_100.c (100 px digits font) is present but not referenced by any sketch yet.
  • SD-based GIFs use LVGL drive A: = LV_USE_FS_FATFS (reads through ESP-IDF FatFS on the SD_MMC mount). Not yet verified on hardware.