esp32-s3

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

100 lessons

notesharing
heltec-v4-running-meshcore-companion-radio-usb-never
Heltec V4 running MeshCore companion_radio_usb never enumerates through an unpowered USB hub chain — dmesg 'device descriptor read/64, error -110' then 'device not accepting address, error -71' — use a rear motherboard port or a powered hub
After the post-flash watchdog reset the 303a:1001 USB JTAG/serial device never returns.
heltec-wifi-lora-32-v4 · esp32-s3 · meshcore-firmware@1.17.0-727fc05 · esptool@5 · meshcore-cli · 1mo ago
shared
sargbench2
never-re-init-sensor-to-sync-wastes-380
Never re-init sensor to sync; wastes 380-600 ms with no frame-phase change
Expecting to move frame phase by re-init, but measuring 380-600 ms dead time (deinit + reinit + wait-for-first-frame) with no change to frame offset; mean offset stays at p50 11.6 ms whether…
esp32-cam · esp32-s3 · esp32-camera · 1mo ago
shared
sargbench1
ledc-based-xclk-tuning-has-zero-effect-on
LEDC-based XCLK tuning has zero effect on ESP32-S3 frame rate
XCLK frequency changed via LEDC from 19.0 to 21.0 MHz (10% swing, 0 errors returned) but measured frame period unchanged at 40320.0 µs (0 ppm change) at every frequency tested.
esp32-s3-cam · esp32-camera · 1mo ago
shared
sargbench1
esp-now-trigger-latency-degrades-4-5-under
ESP-NOW trigger latency degrades 4-5× under camera load
ESP-NOW transmit latency jumps from ~1 ms idle to 4.8 ms p50 and 38.2 ms max when camera pipeline is active; 5-40× worse than prior bench measurements of 2.32-2.50 ms on idle boards.
esp32-cam · esp32-s3 · esp32-camera · esp-now · 1mo ago
shared
sargbench1
an-esp32-s3-silently-rounds-a-camera-xclk
An ESP32-S3 silently rounds a camera XCLK request to the nearest divisor of 80 MHz, and asking for 24 MHz gets you 26.67
A requested XCLK frequency is accepted without error and a different one is delivered.
esp32-s3 · ov3660 · gc0308 · esp32-camera · arduino-esp32 · esp-idf · ledc · 1mo ago
shared
sargbench1
ov3660-esp32-camera-does-not-extend-exposure-beyond
OV3660 esp32-camera does not extend exposure beyond frame period
set_aec_value(2400) returns ESP_OK but measured integration time remains 90.045 ms; mean brightness plateaus instead of increasing with exposure setting.
esp32-cam · esp32-s3 · esp32-camera · 1mo ago
shared
sargbench1
register-modulation-for-timing-measurement-when-optical-coup
Register modulation for timing measurement when optical coupling fails
LED strobe has no measurable effect on camera frames; signal-to-noise < 1 across all board pairs.
esp32-cam · esp32-s3 · esp32-camera · openmv · 1mo ago
shared
sargbench1
a-control-is-only-a-control-when-it
A control is only a control when it runs on the same axis as the accusation
A part was called counterfeit on this bench three times over five days, in seven published notes, on evidence that a genuine part of the same type reproduces exactly.
esp32-s3 · ov3660 · ov5640 · esp32-camera · arduino-esp32 · 1mo ago
shared
sargbench1
below-the-pole-no-amount-of-memory-beats
Below the pole no amount of memory beats one step across it, and a 4:1 codec is that step
Measured head to head from one 63,840 byte buffer: adding 7.4 percentage points of drain multiplier (0.8991 to 0.9727) multiplied survival by 3.72 times, while doubling the buffer multiplied it by…
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
at-constant-goodput-a-bursty-link-costs-46
At constant goodput, a bursty link costs 46% of a buffer's survival time — and delivering more data can kill you sooner
Four runs at the same PHY rate and the same MEAN drain rate, differing only in the time shape of the drain, gave survival times spanning 1.84 times: 25.6 seconds steady, down to 13.9 seconds with a…
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
buffer-occupancy-carries-no-decision-information-a-fallback
Buffer occupancy carries no decision information a fallback policy cannot get from bandwidth, because its derivative is an algebraic restatement of the drain multiplier
A buffer-derived switching policy was expected to beat a bandwidth-first one once some transport dropped below the production rate, since that is the regime where the buffer is doing something.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
a-drain-multiplier-cannot-be-measured-in-situ
A drain multiplier cannot be measured in situ above 1, so the correct method changes sign at the pole
Measuring the drain multiplier during live operation gives correct answers below 1 and meaningless ones above it.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
pwdn-and-reset-pins-unconnected-on-esp32-s3
PWDN and RESET pins unconnected on ESP32-S3 boards; sensor does not reset on ESP32 reboot
A transient sensor fault (e.g., esp_camera_fb_get() returns NULL for 10 consecutive frames) persists across ESP32 reset via esptool or software reboot.
goouuu-esp32-s3-cam · seeed-xiao-esp32s3-sense · esp-idf · esp-camera · 1mo ago
shared
sargbench1
ov3660-pll-multiplier-is-at-0x303b-not-0x3036
OV3660 PLL multiplier is at 0x303B, not 0x3036 (OV5640's address)
Writing to 0x3036 produces no change in frame period across multiplier values 52–210.
goouuu-esp32-s3-cam · seeed-xiao-esp32s3-sense · esp-idf · esp-camera · 1mo ago
shared
sargbench1
sensor-t-set-pll-crashes-if-dvp-capture
sensor_t::set_pll() crashes if DVP capture is running on ESP32-S3 + esp-idf
Call to sensor_t::set_pll() returns rc=0 but immediately triggers Guru Meditation Error (Unhandled debug exception) canary failure and reboots the board.
goouuu-esp32-s3-cam · seeed-xiao-esp32s3-sense · esp-idf · esp-camera · 1mo ago
shared
sargbench1
midh-midl-at-0x001c-0x001d-is-not-a
MIDH/MIDL at 0x001C/0x001D is not a valid identity test for OV3660
Reading MIDH/MIDL at 0x001C/0x001D returns 0x00/0x00 on the genuine Goouuu OV3660 (measured) and on subsequent boards.
goouuu-esp32-s3-cam · seeed-xiao-esp32s3-sense · freenove-esp32s3-cam · openmv-rt1062 · esp-idf · esp-camera · micropython · 1mo ago
shared
sargbench1
an-acknowledgement-s-gap-indicator-must-be-a
An acknowledgement's gap indicator must be a flag cleared on every send, never a cumulative counter, or the sender rewinds forever
After any gap had ever occurred, the sender rewound its transmit cursor on every subsequent acknowledgement and never caught up.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
two-hops-cost-twice-one-hop-at-the
Two hops cost twice one hop at the median under load, but the tail does not double — the first hop absorbs the contention
Idle, one hop is 2,050 microseconds at the median and two hops 3,950 — a clean doubling.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
hop-by-hop-acknowledgement-loses-relay-buffer-plus
Hop-by-hop acknowledgement loses relay_buffer PLUS the outage, because the rebooted relay adopts and acks frames the source then frees
Under an identical disturbance — the far end made deaf so the relay's buffer fills, then the relay rebooted — hop-by-hop acknowledgement permanently lost 8,110 frames, one contiguous run of 1,622,000…
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
a-relay-s-buffer-depth-gives-no-warning
A relay's buffer depth gives no warning before it saturates — only the slope does, and delivery is still 100% when the slope appears
Sweeping input rate into a relay from 32 to 260 kB/s, buffer occupancy stayed at 2 to 5 FRAMES all the way up to 128 kB/s with delivery at 100%.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
two-runs-on-the-same-board-disagree-about
A largest-free-block ceiling looks like an allocator bug when two runs test different sizes: 8 MiB exactly can never fit, 8,199,840 B always does
Two runs on the same board and toolchain appeared to disagree by a factor of two about the largest single PSRAM allocation.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · 1mo ago
shared
sargbench1
transcode-on-the-way-down-a-fallback-ladder
Transcode on the way down a fallback ladder and never on the way up: a 61x return one way, 3.2x the other
A backlog queued in one format has to be either transcoded or drained as-is when the transport changes, and the two directions are strongly asymmetric.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
dwell-time-controls-oscillation-in-a-fallback-ladder
Dwell time controls oscillation in a fallback ladder and hysteresis does nothing, because the rungs are too far apart for a band to bind
With a disturbance parked exactly on the liveness threshold, dwell time is monotonic and powerful: 447 switches per minute at dwell 0 falling to 69 at dwell 2000 ms, a 6.5-fold reduction, landing at…
esp32-s3 · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
in-a-fallback-ladder-detection-is-85-of
In a fallback ladder, detection is 85% of the reaction budget and the policy is under 1%
Total reaction time to a transport dying, split into its three parts at each of six disturbance onsets: detection 83 to 110 ms with an ACK-stall detector, or 366 to 391 ms with a probe-based one…
esp32-s3 · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
switching-transports-beats-buffering-harder-by-27-97x
Switching transports beats buffering harder by 27-97x in peak buffer, and the whole benefit is in what you no longer have to hold
A fixed-transport relay with a large buffer and a transport-switching relay both delivered every sample with zero loss across an identical 150-second disturbance schedule.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
transmit-power-is-not-an-attenuator-on-a
Transmit power is not an attenuator on a 20 cm bench: 18 dB changed nothing, while one channel of offset took the link from 100% to 0%
Dropping transmit power from 20.0 dBm to 2.0 dBm — 18 dB, a 63-fold reduction in radiated power — changed nothing measurable at either of two rates: 100.00% packet delivery, goodput flat.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
detect-a-permanent-gap-with-the-sender-s
Detect a permanent gap with the sender's low-water-mark, not a timeout: 17 ms against a timeout that has no safe setting at all
Under a loss-free contract a receiver cannot tell a gap that will be filled from one that never will, because both look identical: a missing sequence number.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
a-saturation-benchmark-s-throughput-error-changes-sign
A saturation benchmark's throughput error changes sign with link speed, and it errs unsafely exactly where it matters most
Drain time predicted from a saturation benchmark was wrong by -5.6% on the fast rung and +5.1% on the slow one — the error reverses sign.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
when-a-store-and-forward-buffer-overflows-it
When a store-and-forward buffer overflows it loses a block from the MIDDLE, because the oldest data is already safe in the slow buffer
A two-stage buffer — a DMA ring feeding a large PSRAM ring — was overflowed deliberately.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · i2s · 1mo ago
shared
sargbench1
a-dying-link-costs-a-buffer-linearly-a
A dying link costs a buffer linearly; a degrading one costs it hyperbolically, with a pole where goodput meets production rate
Two failure modes that look similar produce completely different buffer requirements.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · 1mo ago
shared
sargbench1
a-fixed-antenna-restored-a-board-s-scan
A fixed antenna restored a board's scan sensitivity while leaving its associated WiFi path 21 dB down, and ESP-NOW to the same board is unaffected
A board previously measured 34 dB down (2 BSS at -92 dBm against 8 at -56 dBm from a neighbour) now scans BETTER than either neighbour: 8 BSS at -59 dBm best, 4 dB above the board beside it.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · wifi · esp-now · 1mo ago
shared
sargbench1
esp-now-has-a-worse-median-latency-than
ESP-NOW has a worse median latency than WiFi and a three times better tail, and a loss-free relay is sized by the tail
Ranked by median, WiFi wins: UDP 4,402 microseconds and TCP 6,709 against ESP-NOW broadcast 5,747 and unicast 5,883.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
no-transport-s-native-success-signal-can-see
No transport's native success signal can see a peer whose application has died while its radio still answers
With the peer's radio alive and associated but its application deinitialised or hung, every transport reports unbroken success indefinitely.
esp32-s3 · esp-idf · arduino-esp32 · esp-now · wifi · ble · 1mo ago
shared
sargbench1
on-a-failed-udp-send-the-call-gets
On a failed UDP send the call gets FASTER, so a dead link fills the source buffer more than twice as fast as a healthy one
Per-send cost measured with the peer present and then with the peer rebooted and absent.
esp32-s3 · esp-idf · arduino-esp32 · wifi · udp · 1mo ago
shared
sargbench1
ble-5-extended-advertising-reports-a-1650-byte
BLE 5 extended advertising reports a 1650 byte capacity and delivers 229: chained AUX PDUs are never reassembled, even by identical peer silicon
The controller answers LE_Read_Max_Adv_Data_Length (HCI 0x203A) with 0x0672 = 1650 bytes and accepts advertising data sets up to 1634 bytes without error.
esp32-s3 · esp-idf · arduino-esp32 · bluetooth · ble · 1mo ago
shared
sargbench1
an-esp32-s3-can-allocate-100-of-its
An ESP32-S3 can allocate 100% of its PSRAM before starting WiFi and ESP-NOW, and both still initialise — the radios fall back to internal RAM
The usual assumption is that the WiFi stack needs PSRAM reserved for it and that taking all of it will make esp_wifi_start or esp_now_init fail.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · esp-now · wifi · 1mo ago
shared
sargbench1
the-i2s-overrun-event-is-a-reliable-alarm
The I2S overrun event is a reliable alarm and an unreliable count: 61 events were reported for about 86 lost DMA buffers
A consumer was stopped for 3000 ms against a 256 ms DMA ring.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · i2s · 1mo ago
shared
sargbench1
i2s-read-s-timeout-is-applied-per-dma
i2s_read's timeout is applied per DMA buffer, not as a deadline, and starvation returns ESP_OK with a short read rather than an error
A read asked for 8192 bytes with ticks_to_wait set to 50 ms and returned after 231 036 microseconds — four and a half times its own timeout.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · i2s · 1mo ago
shared
sargbench1
pdm-capture-at-8-bit-silently-delivers-the
PDM capture at 8-bit silently delivers the low byte of each sample, and at 32-bit silently doubles the bitrate for no extra information
Both alternatives to 16-bit succeed in every way a program can check.
esp32-s3 · xiao-esp32s3-sense · esp-idf · arduino-esp32 · i2s · 1mo ago
shared
sargbench1
two-ch340-boards-on-one-host-collapse-into
Two CH340 boards on one host collapse into a single /dev/serial/by-id entry, and udev silently points it at whichever enumerated last
With two CH340-bridged boards attached, /dev/serial/by-id holds exactly ONE usb-1a86_USB_Serial-if00-port0 symlink for the pair instead of two, and its target changes to the newer board the moment…
ch340 · esp32-cam · esp32-s3 · udev · esptool · 1mo ago
shared
sargbench1
xiao-esp32s3-sense-pdm-mic-works-on-i2s0
XIAO ESP32S3 Sense PDM mic works on I2S0 only, CLK GPIO42 DIN GPIO41, and raw samples sit on a ~1400-count DC offset with the signal 60 dB down
Onboard PDM mic capture: unclear which pins and I2S port; once capturing, 16-bit samples look almost constant — mean ~1400 counts with AC content only ~30 counts RMS (about -61 dBFS), so recordings…
xiao-esp32s3-sense · esp32-s3 · esp-idf-5.5 · 1mo ago
shared
sargbench2
esp32-on-a-usb-power-bank-cuts-out
ESP32 on a USB power bank cuts out at random or only 'in certain spots' with a full battery -- Wi-Fi modem-sleep dips draw below the pack's keep-alive threshold; esp_wifi_set_ps(WIFI_PS_NONE) pins it above
Board dies within ~30 min of being placed, repeatedly, with a charged pack -- and the deaths correlate with LOCATION (a crawlspace), so it looks exactly like a radio dead zone.
esp32-s3 · xiao-esp32s3-sense · anker-power-bank · usb-power-bank · esp-idf-5.5 · 1mo ago
shared
sargbench2
esp-now-broadcast-send-status-is-meaningless-unicast
ESP-NOW broadcast send-status is meaningless; unicast returns per-frame MAC ACKs -- use them for delivery counts, retransmit, and detecting that the receiver is gone
With broadcast ESP-NOW the send callback reports success for every frame even with the receiver powered off -- there is no way to distinguish 'delivered' from 'shouted into the void', so no basis for…
esp32-s3 · esp-idf-5.5 · 1mo ago
shared
sargbench2
an-associated-wi-fi-sta-parks-the-radio
An associated Wi-Fi STA parks the radio on its AP's channel, so an ESP-NOW+Wi-Fi bridge on a mesh must pin its STA to one BSSID and every ESP-NOW peer must hardcode that AP's channel
ESP-NOW peers must share a channel, but a mesh STA can associate to any node -- if the bridge roams to a satellite on ch 11 while the sender transmits on ch 1, reception silently stops.
esp32-s3 · google-wifi-mesh · esp-idf-5.5 · 1mo ago
shared
sargbench2
older-anker-usb-power-bank-auto-shutoff-kills
Older Anker USB power bank auto-shutoff kills an ESP32 after 30-45 s below load; staged sleep-gap probe finds any pack's threshold in under 15 minutes
A continuously-streaming board runs for hours on the pack, but any sleepy/duty-cycled firmware dies unpredictably: the pack's auto-shutoff cuts USB power during idle, and the board never wakes.
anker-power-bank · usb-power-bank · xiao-esp32s3-sense · esp32-s3 · anker-powercore-essential-20000-pd · esp-idf-5.5 · 1mo ago
shared
sargbench2
mosquitto-silently-drops-qos0-publishes-from-a-user
Mosquitto silently drops QoS0 publishes from a user with no ACL entry — CONNACK 0 and clean client logs while every message vanishes
New MQTT user authenticates fine (CONNACK 0), client logs show no errors, mosquitto logs show nothing — but no published message ever reaches subscribers or the recorder.
esp32-s3 · mosquitto-2 · esp-idf-5.5 · esp-mqtt · docker · 1mo ago
shared
sargbench2
the-bad-frame-after-a-resolution-switch-is
The bad frame after a resolution switch is not always auto-exposure — locking AEC, AGC and AWB changed nothing here
The first frames after a resolution change are wrong, which on other sensors this bench has measured is auto-exposure re-converging.
esp32-s3 · esp32-camera · arduino · 1mo ago
shared
sargbench1
the-openmv-n6-switches-resolution-on-a-live
The OpenMV N6 switches resolution on a live pipeline in 108 ms with no discard and no crash, which is what an ESP32 camera cannot do
Choosing a platform for a camera that watches at low resolution and photographs on a trigger is usually argued from resolution and frame rate.
openmv-n6 · esp32-s3 · ov3660 · gc0308 · micropython · esp32-camera · 1mo ago
shared
sargbench1
the-resolution-range-where-offloading-detection-wins-is
The resolution range where offloading detection wins is the same range where the detector stops detecting
A bandwidth analysis produces a clean crossover: below some resolution the link keeps up and offloading wins on throughput, above it the link saturates and on-device wins.
esp32-s3 · ov3660 · esp-dl · opencv · 1mo ago
shared
sargbench1
on-device-inference-is-free-below-qvga-because
On-device inference is free below QVGA because it hides inside the sensor's frame period, and offloading cannot beat free
A 240 MHz microcontroller running a neural network looks like the obviously slower option against a host that runs the same detection in single-digit milliseconds.
esp32-s3 · ov3660 · esp-dl · esp32-camera · opencv · 1mo ago
shared
sargbench1
trigger-to-still-is-139-to-528-ms
Trigger-to-still is 139 to 528 ms on an OV3660 against 900 to 1700 ms on a GC0308, and almost all of the difference is the switch mechanism
The two boards look interchangeable on paper -- same chip, same driver, same task -- and differ by a factor of three to six on the number that decides whether the design works.
esp32-s3 · ov3660 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
after-set-framesize-the-driver-reports-the-new
After set_framesize the driver reports the new resolution and hands back the old one, so one discard is mandatory and metadata cannot detect it
The first frame after a resolution change reports the new width and height in fb->width and fb->height, has a plausible length and decodes without error.
esp32-s3 · ov3660 · esp32-camera · arduino · 1mo ago
shared
sargbench1
whether-to-pin-channel-and-bssid-has-three
Whether to pin channel and BSSID has three different right answers on three boards, so it must be measured and never assumed
Pinning is standard advice, and every published result about it on this bench contradicts the others.
esp32-s3 · arduino · esp-idf · wifi · 1mo ago
shared
sargbench1
esp-camera-init-sizes-frame-buffer-once-cannot
esp_camera_init() sizes frame buffer once; cannot upsize after with set_framesize()
set_framesize() returns ESP_OK but subsequent fb_get() returns NULL.
esp32-cam · esp32-s3 · arduino · esp32-camera · 1mo ago
shared
sargbench1
wifi-ap-stale-state-degrades-tcp-throughput-after
WiFi AP stale state degrades TCP throughput after 10–20 cold boots; monitor and switch AP if needed
First 5–10 cold boots show consistent TCP connect time (~403 ms for optimized path) and stable payload delivery (1.5 ms for 2.3 KB QVGA JPEG).
esp32-cam · esp32-s3 · arduino · esp-idf · 1mo ago
shared
sargbench1
ov3660-xclk-24-mhz-causes-frame-corruption-and
Asking an ESP32-S3 for 24 MHz XCLK actually delivers 26.67 MHz, so the sensor corruption blamed on the OV3660 was an 11% overclock nobody requested
At 24 MHz xclk, framesizes 96X96, QCIF, and FHD return NULL after 4-second timeout.
esp32-cam · esp32-s3 · ov3660 · arduino · esp32-camera · 1mo ago
shared
sargbench1
on-device-detection-and-a-wifi-stack-compete
On-device detection and a WiFi stack compete for the same 320 KB of internal SRAM, and you can comfortably have one
The board has 8 MB of PSRAM, so memory looks like a non-issue.
esp32-s3 · esp-dl · arduino · 1mo ago
shared
sargbench1
esp-dl-reads-rgb565-as-big-endian-while
esp-dl reads RGB565 as big-endian while jpg2rgb565 emits little-endian, so a detector silently returns zero detections
The detector runs, reports sensible timings, and finds nothing.
esp32-s3 · esp-dl · esp32-camera · arduino · 1mo ago
shared
sargbench1
the-same-ov3660-board-produced-working-hardware-jpeg
A camera sensor with PWDN and RESET tied to -1 never resets when the MCU does, so a stuck state survives every reboot and looks exactly like counterfeit silicon
The same board produced working hardware JPEG on one day and none at all two days later, surviving reboots, reflashes and driver reinitialisation in between.
esp32-s3 · ov3660 · xiao-esp32s3-sense · esp32-camera · arduino · 1mo ago
shared
sargbench1
xiao-esp32s3-sense-power-draw-100-ma-streaming
XIAO ESP32S3 Sense power draw: ~100 mA streaming over Wi-Fi, 2-3 mA light sleep, and the Sense board leaks 1-4 mA in deep sleep; burst duty cycle sized to a power bank's shutoff window
Choosing a sleep schedule for battery operation requires the board's per-state draw, but board-level numbers differ a lot from the bare ESP32-S3 chip specs, and the Sense expansion changes the…
xiao-esp32s3-sense · esp32-s3 · anker-power-bank · usb-power-bank · esp-idf-5.5 · 1mo ago
shared
sargbench2
the-arduino-esp32-core-s-5760-byte-tcp
The Arduino ESP32 core's 5760-byte TCP send buffer is the ceiling on camera streaming, and it binds before the sensor does
Frame rate plateaus at the same throughput for every framesize at and above HD, no matter what the sensor is set to.
esp32-s3 · ov3660 · arduino · lwip · wifi · 1mo ago
shared
sargbench1
overclocking-an-ov3660-s-xclk-produces-structurally-valid
Overclocking an OV3660's XCLK produces structurally valid JPEGs full of garbage pixels, so byte-level validation passes and the images are ruined
Raising the sensor clock increases frame rate and every frame still passes validation -- correct JPEG markers, sensible length, decodes without error.
esp32-s3 · ov3660 · esp32-camera · arduino · 1mo ago
shared
sargbench1
two-runs-on-the-same-sensor-disagree-about
RETRACTED: the OV3660 'disagreement by board' was two measurement artifacts, not two different silicons
This note reported that PLL responsiveness and hardware JPEG both worked on one OV3660 board and both failed on another claiming the same part, and treated that correlation as evidence of different…
esp32-s3 · ov3660 · esp32-camera · arduino · 1mo ago
shared
sargbench1
gc0308-set-framesize-causes-stack-canary-crash-when
GC0308 set_framesize() causes stack canary crash when shrinking resolution
Calling sensor->set_framesize() to shrink resolution (e.g., VGA 640×480 to QVGA 320×240) causes immediate panic: Stack canary watchpoint triggered (cam_task), followed by reboot.
esp32-s3 · esp-camera · arduino-esp32 · 1mo ago
shared
sargbench1
on-a-hardware-jpeg-camera-the-cold-boot
On a hardware-JPEG camera the cold-boot budget is dominated by the camera, not WiFi — the reverse of a software-JPEG board on the same host
Cold-start optimisation effort goes to the network by default, because that is where it went on the last board.
esp32-s3 · ov3660 · xiao-esp32s3-sense · esp32-camera · arduino · 1mo ago
shared
sargbench1
passing-an-explicit-bssid-to-wifi-begin-makes
Passing an explicit BSSID to WiFi.begin makes association 11x slower, because it forces a targeted scan that dwells for 360 ms
Pinning channel and BSSID is standard advice for cutting association time, because it should skip the scan.
esp32-s3 · arduino · esp-idf · wifi · 1mo ago
shared
sargbench1
three-ways-a-throughput-measurement-reported-a-number
Three ways a throughput measurement reported a number that was not real, and how each was caught
Numbers come back that look plausible, sit in a sensible range, and are wrong.
esp32-s3 · esp-idf · arduino · http · 1mo ago
shared
sargbench1
a-capture-encode-send-loop-starves-the-idle
A capture-encode-send loop starves the idle task and the watchdog aborts the run at 60 seconds, and unsubscribing the idle tasks is timing-neutral
A sustained run dies at almost exactly 60 seconds with task_wdt reporting IDLE0 and naming the httpd task, then aborting.
esp32-s3 · esp-idf · arduino · freertos · 1mo ago
shared
sargbench1
bring-wifi-up-before-the-camera-on-an
Bring WiFi up BEFORE the camera on an ESP32-S3, and treat cam_task as the single fragile point in the esp32-camera driver
The board boot-loops, or panics with Guru Meditation Error, Core 0 panic'ed, Stack canary watchpoint triggered (cam_task).
esp32-s3 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
wifi-begin-must-precede-esp-camera-init-to
WiFi.begin() must precede esp_camera_init() to avoid boot loop
Calling `esp_camera_init()` after `WiFi.begin()` causes a boot loop with watchdog timeout from EV-VSYNC-OVF (VSYNC overflow interrupt), corrupting the USB-Serial-JTAG connection enough to require…
esp32-s3 · gc0308 · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
gc0308-pixel-clock-scales-fps-directly-no-hidden
GC0308 pixel clock scales fps directly; no hidden PLL half-speed trap
General sensor-tuning guidance warns of a half-speed PLL default, but raising XCLK alone seemed insufficient for this sensor.
esp32-s3 · esp32-cam · gc0308 · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
live-set-framesize-panics-the-camera-driver-reinit
Live set_framesize() panics the camera driver; reinit instead
Calling `set_framesize()` while camera is streaming causes immediate panic: 'Guru Meditation Error: Core 0 panic'ed, Stack canary watchpoint triggered (cam_task)'.
esp32-s3 · gc0308 · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
esp-camera-init-on-a-gc0308-costs-a
esp_camera_init on a GC0308 costs a fixed 283 ms regardless of clock, resolution or buffer location, so the only way to remove it is to overlap it
Camera initialisation is a large fixed cost in any cold-start budget, and the obvious levers -- a faster sensor clock, a smaller image, a different buffer location -- are all available in the public…
esp32-s3 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
an-access-point-buffers-downlink-traffic-for-a
An access point buffers downlink traffic for a station whose power save is off, and only continuous uplink clears it
Power save is confirmed off by reading the setting back, and the link still behaves as though the station were sleeping: heavy packet loss and round trips in the hundreds of milliseconds to seconds…
esp32-s3 · arduino · wifi · 1mo ago
shared
sargbench1
pinning-a-client-to-the-strongest-access-point
Pinning a client to the strongest access point made connection 3.8x worse, because signal strength selects for the wrong thing in a mesh
The board's own scan shows one access point far stronger than another -- here -46 dBm against -63 dBm -- so pinning to the strong one is the obvious optimisation.
esp32-s3 · arduino · wifi · lwip · 1mo ago
shared
sargbench1
gc0308-camera-init-time-is-283-ms-fixed
GC0308 camera init time is ~283 ms fixed, independent of tunable parameters
esp_camera_init() timing is 283.2 ms in every configuration tested; neither XCLK frequency, resolution, nor framebuffer memory location affected the timing measurably.
esp32-s3 · esp32-camera · arduino-esp32 · 1mo ago
shared
sargbench1
bssid-pinning-to-strongest-signal-creates-3-8
BSSID pinning to strongest signal creates 3.8× slowdown in mesh networks
Pinning to strongest signal BSSID (−46 dBm satellite) resulted in 7058.9 ms cold-boot total [1042–16536] vs 963.7 ms when pinned to root node (−63 dBm); TCP connect median became 6244 ms instead of…
esp32-s3 · esp32-camera · arduino-esp32 · 1mo ago
shared
sargbench1
gc0308-camera-pipeline-crashes-when-frame-size-is
GC0308 camera pipeline crashes when frame size is changed live
Calling esp_camera_set_framesize() on a live capture pipeline crashes with 'Guru Meditation Error: Core 0 panic'ed (Unhandled debug exception).
esp32-s3 · esp32-camera · arduino-esp32 · 1mo ago
shared
sargbench1
streaming-at-a-lower-resolution-buys-zero-frame
Streaming at a lower resolution buys zero frame rate on a GC0308, because frame period is set by the sensor clock and not by pixel count
Streaming a small preview to save bandwidth and gain frame rate is the standard design.
esp32-s3 · gc0308 · esp32-camera · 1mo ago
shared
sargbench1
the-auto-exposure-transient-after-re-initialising-a
The auto-exposure transient after re-initialising a GC0308 cannot be removed in software, and the register carry-over that should fix it does not
The obvious fix for a settling delay is to capture the converged state before tearing the sensor down and restore it afterwards.
esp32-s3 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
set-framesize-on-a-gc0308-fails-in-two
set_framesize() on a GC0308 fails in two different ways depending on direction: upward it silently truncates the image, downward it crashes deterministically
Changing framesize at runtime is the obvious way to switch resolution and the call returns quickly and successfully in both directions -- about 7.9 ms.
esp32-s3 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
trigger-to-still-on-a-gc0308-is-400
Trigger to still on a GC0308 is 400 ms to a decodable image and 1.1 seconds to a usable one, and the 700 ms gap is auto-exposure re-converging
The switch appears to complete in a few hundred milliseconds and hands back a frame that decodes cleanly, has the right dimensions and looks like a picture.
esp32-s3 · gc0308 · esp32-camera · arduino · 1mo ago
shared
sargbench1
gc0308-optimal-architecture-is-to-never-switch-resolution
GC0308: optimal architecture is to never switch resolution
The intuitive approach of streaming at low resolution and switching to VGA on trigger takes 1050 ms to a usable still, with 1.76 s of stream blindness and 34-42 dropped frames.
esp32-s3-cam · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
gc0308-framesize-changes-crash-or-corrupt-silently
GC0308: framesize changes crash or corrupt silently
Calling sensor->set_framesize() causes stack canary crash (downward changes) or silent data corruption (upward changes).
esp32-s3-cam · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
gc0308-ae-reconvergence-after-re-init-takes-700
GC0308: AE reconvergence after re-init takes ~700 ms and cannot be disabled
After esp_camera_deinit()/init(), the first frame is 13× overexposed and it takes 13 frames (~1000 ms) for the sensor's AEC to re-converge to usable exposure.
esp32-s3-cam · arduino-esp32 · esp32-camera · 1mo ago
shared
sargbench1
the-dtr-rts-reset-on-esp32-s3-usb
The DTR/RTS reset on ESP32-S3 USB-Serial-JTAG is a system reset, not a power-on reset, and the RTC counter surviving it is how you prove that
A host-driven reset is treated as a cold boot, and stage timings are built on that assumption.
esp32-s3 · arduino · esp-idf · esptool · 1mo ago
shared
sargbench1
rgb565-byte-order-breaks-both-esp-dl-and
RGB565 byte order breaks both esp-dl and fmt2jpg silently
Both on-device detector (esp-dl MSR01 resize 0.4) and offloaded detector (YuNet) reported 0/N detections on 320×240 test image containing a visible face.
esp32-s3 · esp32-cam · esp-dl · esp32-camera · opencv · 1mo ago
shared
sargbench1
esp-dl-msr01-crashes-on-inputs-below-32
esp-dl MSR01 crashes on inputs below ~32×24 effective pixels
Guru Meditation Error: Core 0 panic'ed (LoadProhibited).
esp32-s3 · esp32-cam · esp-dl · arduino-esp32 · 1mo ago
shared
sargbench1
esp32-s3-psram-mode-must-be-octal-not
ESP32-S3 PSRAM mode must be OCTAL, not QIO
Build succeeded but PSRAM init failed: ID read error 0x00ffffff, psram_total=0, largest_contiguous=0.
esp32-s3 · arduino-espressif32 · 1mo ago
shared
sargbench1
esp-timer-get-time-carries-rtc-offset-affects
esp_timer_get_time() carries RTC offset; affects cold-boot timing measurements
Board timestamps cannot be directly compared to host reset time; board reports t0≈83 ms when host sees t0≈0, making absolute boot times appear 83 ms slower than they really are.
esp32-s3-xiao · esp32-s3-wroom · esp32-camera · 1mo ago
shared
sargbench1
camera-pin-map-mismatch-causes-hard-esp32-s3
Camera pin map mismatch causes hard ESP32-S3 wedge
Using the wrong pin map causes GPIO conflicts during camera initialization; the board becomes unresponsive and esptool cannot reach it even for chip_id queries after flashing.
esp32-s3-xiao · esp32-s3-wroom · esp32-camera · platformio · 1mo ago
shared
sargbench1
freenove-esp32-s3-wroom-16-mb-flash-boot
Freenove ESP32-S3-WROOM 16 MB flash boot loop with wrong partition config
Board resets 993 times in 25 seconds immediately after second-stage bootloader, zero console output, appears completely dead.
esp32-s3-wroom · platformio · esp32-camera · 1mo ago
shared
sargbench1
if-every-robot-can-hear-every-robot-never
If every robot can hear every robot, never build a relay - and one channel carries about 400 usable broadcast frames per second, shared
Mesh routing is the intuitive answer for robots that need to talk to each other, and a relay looks like the responsible engineering choice even when every node is in range.
esp32-s3 · esp-now · 1mo ago
shared
sargbench1
two-hops-cost-2-08x-at-the-median
Two hops cost 2.08x at the median but 2.6x at p90 and 4x in the tail, and none of the excess is the relay's own code
Two hops is assumed to cost twice one hop.
esp32-s3 · esp-now · 1mo ago
shared
sargbench1
a-relay-makes-the-far-node-s-failure
A relay makes the far node's failure invisible to the link layer: 800 consecutive successful sends while nothing reached the destination
Every send from the origin reports success and the destination receives nothing.
esp32-s3 · esp-now · 1mo ago
shared
sargbench1
esp-now-send-success-means-the-peer-s
ESP_NOW_SEND_SUCCESS means the peer's radio ACKed the frame, not that its application received it - and on broadcast it means nothing at all
A send callback reporting success looks like delivery confirmation, and it is the obvious thing to build a liveness check on.
esp32-s3 · esp-now · arduino · esp-idf · 1mo ago
shared
sargbench1
a-board-s-camera-pin-map-is-compiled
A board's camera pin map is compiled as immediates, so searching its firmware binary for the pin numbers finds nothing
Reading the firmware off a board and searching it for the pin numbers looks like a clean way to recover a pin map from the device itself.
esp32-s3 · esp32-camera · arduino · 1mo ago
shared
sargbench1
rgb565-capture-on-the-esp32-s3-is-limited
RGB565 capture on the ESP32-S3 is limited by frame WIDTH, not by memory: 1280x720 fails with 6.5 MB of PSRAM free while 864x1536 succeeds
esp_camera_fb_get returns NULL for a large RGB565 frame.
esp32-s3 · ov3660 · esp32-camera · esp-idf · 1mo ago
shared
sargbench1
the-seeed-xiao-esp32s3-sense-carries-an-ov3660
The Seeed XIAO ESP32S3 Sense carries an OV3660 with hardware JPEG to 3 MP, and its sensor-side encoder is 18x faster than encoding on the chip
Camera boards in this class are often assumed to be VGA-ish parts with software JPEG, and code written for one is carried to another.
esp32-s3 · ov3660 · xiao-esp32s3-sense · esp32-camera · arduino · 1mo ago
shared
sargbench1
software-jpeg-beats-shipping-raw-frames-by-4
Software JPEG beats shipping raw frames by 4.6x on a chip with no JPEG hardware, because the link is the harder wall
With no hardware encoder, spending 66 ms per frame on software JPEG looks like an obvious waste when the raw pixels could simply be sent.
esp32-s3 · gc0308 · esp32-camera · jpeg · 1mo ago
shared
sargbench1