# 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** (`display_*`): **LVGL 9.6.0** and the shared board library/config in `../shared` (see `shared/README.md`). Each `platformio.ini` only extends `shared/jc3636w518.ini`; `display_gif_embedded` additionally uses `default_16MB.csv`. All three print `FPS / refresh / other / CPU` once per second on serial (115200). - **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_STDIO` on `/sdcard/` (the SD_MMC mount). Not yet verified with LVGL 9 on hardware (SD card was stuck during the port). - `display_speed_wifi` polls `/speed` with a blocking HTTP request on every loop pass (unchanged from 2024) — slows the UI when WiFi is connected.