{
 "tag": "waveshare-esp32-s3-cam",
 "kind": null,
 "product": null,
 "used_by": [],
 "parts": [
  "adafruit-5364-esp32-s3-devkitc-1-esp32-s3-wroom-2-32mb-flash",
  "goouuu-esp32-s3-cam-case-wall-mount-and-din-rail-bodies",
  "goouuu-esp32-s3-cam-tripod-case-body-lid",
  "goouuu-esp32s3cam",
  "waveshare-esp32-s3-cam-gc0308-tripod-case-body-lid",
  "waveshare-esp32s3-cam-gc0308"
 ],
 "notes": [
  {
   "handle": "sarg",
   "id": "bring-up-the-es7210-dual-mics-on-waveshare",
   "title": "Bring up the ES7210 dual mics on Waveshare ESP32-S3-CAM from MicroPython \u2014 I2C map, ESP32-side I2S pins, and the missing mck argument",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "build-esp-tflite-micro-hermetically-in-docker-espressif-idf-image",
   "title": "Build ESP-IDF person_detection hermetically with the espressif/idf:release-v5.5 Docker image \u2014 no host toolchain installs",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "decode-each-b2a-base64-line-separately-when-pulling-frames-over-repl",
   "title": "Base64 image transfer over MicroPython REPL silently truncates at the first '==' \u2014 decode each b2a_base64 line separately",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "detector-trained-on-one-lighting-condition-misjudges-others",
   "title": "Person detector trained on one lighting condition (one evening) misjudges daylight \u2014 keep collecting across conditions and retrain",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "enter-esp32-s3-download-mode-from-micropython-machine-bootloader",
   "title": "Enter ESP32-S3 download mode from MicroPython without buttons \u2014 machine.bootloader(); zombie CDC device may linger",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp-tflite-micro-person-detection-cannot-build-in-tree-override-path",
   "title": "Fix for \"Failed to resolve component ... unknown name\" building esp-tflite-micro person_detection in-tree (IDF 5.3/5.5 override_path)",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-camera-rgb565-is-big-endian-per-pixel-swap-bytes",
   "title": "Wrong colors converting esp32-camera RGB565 frames \u2014 pixels are big-endian, use '>u2' not '<u2' in numpy",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-never-roams-on-a-mesh-ssid-default",
   "title": "ESP32 never roams on a mesh SSID \u2014 default fast-scan latches the first AP that answers and holds it even at -82 dBm",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-s3-board-looks-hung-cdc-print-blocks-when-host-stops-reading",
   "title": "ESP32-S3 board looks hung mid serial transfer \u2014 MicroPython print() blocks forever when the host stops reading the USB-CDC port",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-s3-cdc-needs-5s-quiet-between-tool-sessions",
   "title": "Fix for \"could not enter raw repl\" and mpremote exec hanging forever on ESP32-S3 USB CDC \u2014 needs ~5 s quiet between tool sessions",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-s3-dropped-off-usb-but-kept-running-on-wifi",
   "title": "ESP32-S3 board spontaneously dropped off USB (enumeration gone, power retained) but kept running on WiFi for 9+ hours",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esp32-s3-usb-pid-changes-303a-1001-to-303a-4001-after-flashing-micropython",
   "title": "ESP32-S3 device 303a:1001 disappears after flashing MicroPython \u2014 303a:4001 replaces it ~1-2 s after reset, not a brick",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "esptool-large-flash-writes-reads-stall-on-esp32-s3-usb-serial-jtag",
   "title": "esptool large write-flash/read-flash stalls on ESP32-S3 USB-Serial/JTAG even with a good cable (issue #1155) \u2014 64 KB chunked writes with retries",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "exit-esp32-s3-download-mode-with-esptool-after-watchdog-reset",
   "title": "ESP32-S3 won't boot app after BOOT-held download mode \u2014 plain esptool reset fails, use --after watchdog-reset",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "first-raw-repl-exec-after-boot-fails-syntaxerror-soft-reboot-first",
   "title": "First raw-REPL exec after boot fails with 'SyntaxError: invalid syntax' at line 1 on ESP32-S3 USB-CDC \u2014 soft reboot first, feed code in 128-byte pieces",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "fix-for-pyserial-timeouterror-errno-110-in-update",
   "title": "Fix for pyserial TimeoutError Errno 110 in _update_dtr_state() on ESP32-S3 USB CDC that survives a replug \u2014 use a raw fd with termios, never pyserial",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "grainy-frames-are-gc0308-warm-up-frames-discard-first-5",
   "title": "Intermittent grainy frames from GC0308 are AGC/AWB warm-up frames \u2014 discard the first ~5 frames after camera init",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "hard-reset-before-every-run-soft-reset-does-not-clear-sensor-state",
   "title": "Hard-reset (machine.reset / mpremote reset) before every run on ESP32-S3 camera board \u2014 soft reset leaves wedged sensor state",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "i2s-mono-at-8-khz-with-the-es7210",
   "title": "I2S.MONO at 8 kHz with the ES7210 512fs coefficients captures pure digital zeros on MicroPython \u2014 looks like a working stream with a dead-flat RMS",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "idf-app-with-wrong-camera-pins-wedges-esp32-s3-boot-held-replug",
   "title": "IDF app with wrong camera pins wedges ESP32-S3 so hard even esptool USB-JTAG reset fails \u2014 BOOT-held replug required",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "long-wifi-outage-leaks-sockets-in-micropython-requests",
   "title": "Long WiFi outage leaks sockets in MicroPython requests until LWIP is exhausted \u2014 board pings but every TCP connect times out, needs a power cycle",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "marginal-usb-cable-error-71-esptool-stalls-look-like-bricked-firmware",
   "title": "esptool 'Serial data stream stopped' mid-flash plus MicroPython CDC never enumerates (dmesg 'error -71'/'error -110') \u2014 marginal USB-C cable, not bricked firmware",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "microsd-is-unusable-from-stock-micropython-builds-on",
   "title": "microSD is unusable from stock MicroPython builds on Waveshare ESP32-S3-CAM \u2014 slot is SDMMC-only and prebuilt firmware cannot remap the pins",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "never-deploy-camera-code-as-main-py",
   "title": "Camera code deployed as main.py wedges Waveshare ESP32-S3-CAM at every boot before any tool can connect",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "never-trust-an-on-device-model-score-before",
   "title": "Never trust an on-device model score before looking at the model's actual input \u2014 a detector reports person 79-94% on pure arena garbage",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "never-use-mpremote-mount",
   "title": "mpremote mount stalls mid-import over lossy USB CDC and strands ESP32-S3 interpreter with camera live",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "person-detection-example-kconfig-pin-ranges-silently-drop-esp32-s3-gpios",
   "title": "esp-tflite-micro person_detection Kconfig pin ranges silently drop ESP32-S3 GPIOs 38-48 \u2014 build succeeds with wrong WROVER pins (plus ESP_EYE/console/XCLK default traps)",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "prefix-serial-transfer-chunks-with-byte-offset-lost-4kb-chunks",
   "title": "Image shears during ESP32-S3 USB-CDC serial transfer \u2014 expect 2-3% lost 4 KB chunks, prefix every chunk with its byte offset",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "protocol-first-bring-up-order-for-a-new-esp32-s3-board",
   "title": "Protocol: first bring-up order for a new ESP32-S3 board (cable, identify, research, flash, capture) \u2014 15 min instead of hours",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "register-every-tflite-op-the-converter-emits-or-ota-crash-loop",
   "title": "TFLite Micro model-load crash and OTA crash-loop from missing ops \u2014 Keras Flatten sneaks in SHAPE+STRIDED_SLICE+PACK, register every op the converter emits",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "secrets-sdkconfig-greedy-regex-shipped-garbage-server-host",
   "title": "Sample uploads silently failed: greedy regex '(.*)' in secrets-to-sdkconfig generation ate an apostrophe and shipped a garbage server host",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "soft-reboot-before-reinitializing-camera-wedged-sccb-i2c",
   "title": "Re-running Camera(...) in a dirty MicroPython session hard-hangs ESP32-S3 (wedged SCCB/I2C) \u2014 soft-reboot Ctrl-D before re-initializing",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "sta-scan-while-already-associated-hangs-an-esp32",
   "title": "sta.scan() while already associated hangs an ESP32 forever in C \u2014 no exception, no watchdog, crash-catcher useless",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "tflite-micro-input-tensor-invalid-after-invoke-memcpy-before",
   "title": "Never read a TFLite Micro input tensor after Invoke() \u2014 post-inference reads return arena scratch that mimics a broken camera, and the model still scores it \"person 79-94%\"",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "ttyacm-node-hops-after-reenumeration-use-dev-serial-by-id",
   "title": "ttyACM0 hops to ttyACM1 when ESP32-S3 re-enumerates \u2014 point all tooling at /dev/serial/by-id",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "webrepl-cannot-ota-a-streaming-board-use-fw-channel",
   "title": "WebREPL OTA fails on a streaming MicroPython board (TCP connects, websocket handshake never completes) \u2014 use the server /fw pull-update channel",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "waveshare-esp32-s3-cam-micropython-firmware-choice-spiram-oct",
   "title": "Which MicroPython build for Waveshare ESP32-S3-CAM (S3R8 octal PSRAM) \u2014 micropython-camera-API v0.6.2 ESP32_GENERIC_S3-SPIRAM_OCT, never the ESP32S3_EYE zip",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "waveshare-esp32-s3-cam-gc0308-micropython-camera-init-pin-map",
   "title": "Working MicroPython camera init for Waveshare ESP32-S3-CAM with GC0308 \u2014 exact pin map, RGB565 (no JPEG), VGA max, warm-up frames",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "waveshare-esp32-s3-cam-factory-firmware-restore-path",
   "title": "Restore Waveshare ESP32-S3-CAM factory firmware \u2014 vendor repo full 16 MB image at 0x0; don't try to back up flash over USB-Serial/JTAG",
   "status": "working"
  },
  {
   "handle": "sarg",
   "id": "zombie-cdc-after-machine-bootloader-self-clears-in-minutes",
   "title": "Zombie CDC device after machine.bootloader() self-clears in ~4-5 min \u2014 \"No such device\" from USBDEVFS_RESET means it was already gone",
   "status": "working"
  }
 ]
}