Is Seeed Studio XIAO ESP32S3 Sense Cam & Mic Compatible with Home Assistant (ESPHome)?
Electrical Specifications
Always confirm pin assignments against the manufacturer datasheet before wiring.
Compatibility Overview
Thumb-sized ESP32-S3 module featuring camera expansion board with OV2640 (Early Revisions) / OV3660 (Current Revisions) 3MP sensor, PDM digital microphone, and MicroSD slot for local AI audio/video telemetry.
Wiring Seeed Studio XIAO ESP32S3 Sense Cam & Mic to XIAO ESP32S3
| Module pin | XIAO ESP32S3 | Note |
|---|---|---|
| Camera XCLK | GPIO10 | Fixed by the Sense expansion board. Nothing on the camera is wired by hand; these are the pins the config names. |
| Camera SIOD / SIOC | GPIO40 / GPIO39 | The SCCB control bus — I2C in all but name. |
| Camera D0–D7 | GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48 | Y2 through Y9 in the sensor datasheet, in that order in data_pins. |
| Camera VSYNC / HREF / PCLK | GPIO38 / GPIO47 / GPIO13 | |
| PDM microphone CLK / DATA | GPIO42 / GPIO41 | One clock, one data line: the mic is PDM, not I2S, hence pdm: true. |
| Antenna | U.FL connector | The XIAO ESP32S3 has no onboard antenna. Clip the supplied rod antenna on before flashing. |
Host pins are the ones the configuration on this page uses. Move a pin here and change it in the YAML — they are documented together so they cannot disagree.
Technical Specification Matrix
| Feature / Attribute | Specification / Status |
|---|---|
| Hardware Protocol | DVP / I2S / 3.3V |
| Bridge Required | NO |
| Border Router Needed | None |
| Hardware Capabilities & Peripherals | OV2640 / OV3660 Camera Stream PDM Digital Mic Audio MicroSD Card Note: these entities come from the ESPHome configuration you flash — each one needs its matching component in that YAML before it appears. |
| Pairing Complexity | Intermediate |
| Factory Reset Instruction | Hold BOOT button while plugging USB cable. |
Wire, Flash, Adopt, Check
Wire it up
Follow the wiring table above. The XIAO ESP32S3 pins there are the ones the configuration uses, so if you move one, change it in both places.
Flash the configuration
Create a new device in the ESPHome dashboard (the Home Assistant add-on) and paste the configuration below into it, or save it as emb_xiao_s3_sense_esphome.yaml and run esphome run emb_xiao_s3_sense_esphome.yaml. The first flash goes over USB. If it is not detected, hold BOOT button while plugging USB cable to put it in download mode. Every update after that is over the air.
Adopt it in Home Assistant
Settings → Devices & Services. A node on the same network shows up as a discovered ESPHome device within a minute of joining Wi-Fi; choose Configure and enter the API encryption key from your secrets.yaml. If discovery does not find it, add the ESPHome integration by hand with the node's IP address.
Check it works
The boot log's setup section lists the camera with the sensor it detected and the configured resolution, and Home Assistant adds a camera entity to the node. Open http://<node-ip>:8080 in a browser: a moving picture there means the pins, PSRAM and antenna are all right. A picture on the API stream but a stalled MJPEG stream is Wi-Fi, not the camera.
ESPHome Configuration
Starting configuration for Seeed Studio XIAO ESP32S3 Sense Cam & Mic on XIAO ESP32S3. Untested on hardware — verify wiring and pins against your own board.
# ESPHome configuration for Seeed Studio XIAO ESP32S3 Sense Cam & Mic
# Host: XIAO ESP32S3. Pin numbers below are host-side defaults — any free
# GPIO will do, and you should change them to match your own wiring.
esphome:
name: emb_xiao_s3_sense_esphome
friendly_name: "Seeed Studio XIAO ESP32S3 Sense Cam & Mic"
esp32:
board: seeed_xiao_esp32s3
framework:
type: esp-idf
psram:
mode: octal
speed: 80MHz
logger:
hardware_uart: USB_SERIAL_JTAG
api:
encryption:
key: !secret api_encryption_key
ota:
- platform: esphome
password: !secret ota_password
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Camera pins are fixed by the Sense expansion board (Seeed's camera_pins.h
# for the XIAO_ESP32S3 target). The component detects OV2640, OV3660 and
# OV5640 at boot, so the same block covers every revision of the module.
esp32_camera:
name: "Camera"
external_clock:
pin: GPIO10
frequency: 20MHz
i2c_pins:
sda: GPIO40
scl: GPIO39
data_pins: [GPIO15, GPIO17, GPIO18, GPIO16, GPIO14, GPIO12, GPIO11, GPIO48]
vsync_pin: GPIO38
href_pin: GPIO47
pixel_clock_pin: GPIO13
resolution: 800x600
jpeg_quality: 12
max_framerate: 10 fps
idle_framerate: 0.2 fps
# MJPEG stream on port 8080 — open http://<node-ip>:8080 in a browser, or
# add it to Home Assistant as a Generic Camera for a smoother feed than the
# native API stream.
esp32_camera_web_server:
- port: 8080
mode: stream
# The onboard PDM microphone: one clock line, one data line.
i2s_audio:
- id: i2s_mic
i2s_lrclk_pin: GPIO42
microphone:
- platform: i2s_audio
id: pdm_mic
i2s_audio_id: i2s_mic
i2s_din_pin: GPIO41
pdm: true
adc_type: external
Before you flash:
the !secret values come from your
secrets.yaml, and the GPIO numbers are host-side
defaults rather than properties of this part — change them to match how you actually wired it.
What Appears in Home Assistant
Snapshots and a low-rate stream through the native API. The ESPHome device page in Home Assistant shows it as a camera card.
Open http://<node-ip>:8080 in a browser, or add it as a Generic Camera in Home Assistant for a smoother feed than the API stream.
The microphone: block exposes nothing on its own. It is the input for voice_assistant or micro_wake_word, which are separate components.
Known Problems and Fixes
No log output over USB without one line
The XIAO's USB-C port goes to the S3's USB-Serial-JTAG peripheral, not UART0. With the default logger the node boots silently. The config sets logger: hardware_uart: USB_SERIAL_JTAG, which is why esphome logs works over the cable.
Attach the antenna
There is no ceramic antenna on this board. Without the rod antenna on the U.FL connector the node may still join Wi-Fi at a metre from the router, then drop the moment the camera starts streaming.
Seat the expansion board
The camera, microphone and card slot all live on the detachable Sense board, on two board-to-board connectors. A board pressed on at an angle gives a camera probe failure at boot and a mic that reads silence. Press both connectors home until they click.
PSRAM is not optional
The frame buffer lives in the 8MB octal PSRAM. The config declares psram: mode: octal for that reason; a generic esp32-s3-devkitc-1 board block without it initialises the camera and then fails to allocate a frame, or limits you to tiny resolutions.
Which sensor did you get
Seeed has shipped the Sense with an OV2640 and, on later batches, an OV3660; an OV5640 is sold as an upgrade. esp32_camera probes the sensor at boot and drives whichever it finds, so the config does not change — but the OV2640 tops out at 1600x1200 and the others go higher, if you raise resolution.
It runs hot when streaming
The S3 streams JPEG at a sustained few watts and the bare module has no heatsink. idle_framerate keeps the camera at a fraction of a frame per second until something is actually watching, and is the difference between warm and too hot to touch.
The card slot is on SPI
The microSD slot on the Sense board sits on the S3's SPI pins with chip select on GPIO21, clear of every camera pin. The config does not touch it; ESPHome's sd_mmc_card and the SPI SD components can, if you want local recording.
Report a Pinout Error or Submit Tested Code Snippets
Found a pin mapping quirk or built a custom ESPHome YAML driver for Seeed Studio XIAO ESP32S3 Sense Cam & Mic? Submit a pull request or report corrections to our index.
Hardware Correction Reporter (emb-xiao-s3-sense-esphome)
Frequently Asked Questions
Does Seeed Studio XIAO ESP32S3 Sense Cam & Mic work without an internet connection?
How is Seeed Studio XIAO ESP32S3 Sense Cam & Mic powered and wired to the host board?
How does the host board reach Home Assistant (ESPHome)?
Alternatives
ESP32-CAM Board with OV2640 Camera
The AI-Thinker ESP32-CAM: half the price, needs a USB-serial adapter to flash, no microphone, and a much weaker Wi-Fi front end.
ESP32-S3-CAM OV2640 Camera Module
The generic ESP32-S3-CAM boards: same chip and sensor family in a larger footprint with a USB port on the board.
INMP441 I2S Digital MEMS Microphone
If the microphone is the part you wanted, an INMP441 on any ESP32 does that job without buying a camera.