; BikeAudio — 3-board relay (iPhone -> Board A sink -> I2S -> Boards B/C sources -> JBL + Cardo) ; ; One ESP32 cannot be an A2DP sink and source at once, and an A2DP source can ; reach only one speaker — so the work is split across three boards that share ; an I2S bus. See README.md for wiring and the flash order. ; ; Build all: pio run ; Build one board: pio run -e sink | -e source_jbl | -e source_cardo ; ; Common specs preserved from the original sketch: ESP32 Arduino core 2.0.x via ; espressif32 ~6.6.0, esp32dev, huge_app partition (BT stack), 115200 monitor. [platformio] default_envs = sink, source_jbl, source_cardo [env] platform = espressif32 @ ~6.6.0 board = esp32dev framework = arduino board_build.partitions = huge_app.csv monitor_speed = 115200 ; pschatzmann libs pinned to exact commits (ESP32-A2DP 1.8.11, audio-tools 1.2.4) lib_deps = https://github.com/pschatzmann/ESP32-A2DP#42601717cd70d5300c9b519f3c2bf1d64d77ea2b https://github.com/pschatzmann/arduino-audio-tools#64b64dcb9bde18a0a17766eeb6529c3a53d920a8 ; --- Board A: A2DP sink (iPhone) -> I2S master -------------------------------- [env:sink] build_src_filter = + ; --- Board B: I2S slave -> A2DP source -> JBL Charge 5 ------------------------ [env:source_jbl] build_src_filter = + build_flags = '-DTARGET_SPEAKER="JBL Charge 5"' -DHUB_I2C_ADDR=0x10 ; --- Board C: I2S slave -> A2DP source -> Cardo (Tangerine EDGE) -------------- [env:source_cardo] build_src_filter = + build_flags = '-DTARGET_SPEAKER="Tangerine EDGE"' -DHUB_I2C_ADDR=0x11 ; --- Board D: I2S slave -> A2DP source -> GUEST speaker (antenna board) ------- ; Occasional passenger speaker, furthest away (hence the onboard antenna). ; No hardcoded name — pick the speaker via the hub's scan UI (Phase 3). [env:source_guest] build_src_filter = + build_flags = '-DTARGET_SPEAKER="Guest"' -DHUB_I2C_ADDR=0x12 ; --- Hub: ESP32-S3-Touch-LCD-1.28 (round GC9A01 LCD + CST816S touch) ---------- ; Different chip (esp32s3) from the relay boards. Drives the UI; later the ; wired control bus to Boards B/C. NOT in default_envs — build with -e hub_s3. [env:hub_s3] platform = espressif32 @ ~6.6.0 board = esp32-s3-devkitc-1 framework = arduino board_upload.flash_size = 4MB board_build.partitions = default.csv monitor_speed = 115200 build_src_filter = + lib_deps = lovyan03/LovyanGFX@^1.1.16 lvgl/lvgl@^8.3.11 ; LVGL configured via build flags (LV_CONF_SKIP -> defaults + overrides), so ; there is no separate lv_conf.h to maintain. 16-bit colour, byte-swapped for ; the SPI panel; millis() tick; the big Montserrat fonts for glanceable text. ; NOTE: keep flag values free of shell-special chars (parens/spaces) — they go ; through a shell. LV_MEM_SIZE as a plain int; tick driven via lv_tick_inc() in ; loop() (no LV_TICK_CUSTOM, which needs a parenthesised millis() expr). build_flags = -DLV_CONF_SKIP=1 -DLV_COLOR_DEPTH=16 -DLV_COLOR_16_SWAP=1 -DLV_MEM_SIZE=49152 -DLV_FONT_MONTSERRAT_14=1 -DLV_FONT_MONTSERRAT_20=1 -DLV_FONT_MONTSERRAT_28=1 -DLV_FONT_MONTSERRAT_48=1 -DLV_USE_LOG=0