Seeed ESP32-C6 with 24GHz mmWave (xiao), no sensor data

Heya :wave:
I’m trying to get the Seeed Studio 24GHz mmWave for XIAO working with the Seeed ESP32-C6.

I know the ESP32-C6 is not officially supported but I’ve seen posts from people saying it works and even a whole product (Seeed Studio 60GHz mmWave Breathing and Heartbeat Detection Sensor), using it, which has an ESPhome config here (which I’ve tried, does not work).

The problem is that my sensors are always “Unknown” or “Unavailable” in home assistant. The ESP32-C6 gets data from the sensor via UART

Things I’ve tried:

  • Tested the sensor with the Seeed ESP32-C3 and it works fine
  • Tried all sorts of UART pins
  • Set the UART baud rate to 115200 via the app, connected with bluetooth to the sensor and this speed works with the ESP32-C3

I’ve read all these examples or threads (I had to remove/break these links as I’m a new user):

https://github.com/Seeed-Studio/wiki-documents/discussions/802
https://community.home-assistant.io/t/esphome-esp32-c6-with-mmwave-ld2410/835009/2
https://community.home-assistant.io/t/seeed-60ghz-mmwave-integration-using-esphome/533442/20
https://community.home-assistant.io/t/mmwave-human-presence-for-under-20/414389/118
https://community.home-assistant.io/t/esphome-esp32-c6-with-mmwave-ld2410/835009/3

I feel like I’m making some basic error here but can’t work out what it is!

My config:

esphome:
  name: esp32-c6-one
  friendly_name: esp32-c6-one
  platformio_options:
    board_upload.maximum_size: 4194304
  min_version: "2024.3.2"

esp32:
  board: esp32-c6-devkitc-1
  variant: esp32c6
  flash_size: 4MB
  framework:
    type: esp-idf

logger:
  level: DEBUG

# api:
# ota:
# wifi:

uart:
  baud_rate: 115200
  rx_pin: 17
  tx_pin: 16
  parity: NONE
  stop_bits: 1

ld2410:

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target
    out_pin_presence_status:
      name: out pin presence status

The logs from startup:

INFO Upload took 4.42 seconds, waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from 192.168.178.184 using esphome API
INFO Successfully connected to esp32-c6-one @ 192.168.178.184 in 19.415s
INFO Successful handshake with esp32-c6-one @ 192.168.178.184 in 0.078s
[13:50:17][I][app:100]: ESPHome version 2024.12.2 compiled on Feb 18 2025, 13:48:32
[13:50:17][C][wifi:600]: WiFi:
[13:50:17][C][wifi:428]:   Local MAC: 8C:BF:EA:CC:BD:78
[13:50:17][C][wifi:433]:   SSID: [redacted]
[13:50:17][C][wifi:436]:   IP Address: 192.168.178.184
[13:50:17][C][wifi:439]:   BSSID: [redacted]
[13:50:17][C][wifi:441]:   Hostname: 'esp32-c6-one'
[13:50:17][C][wifi:443]:   Signal strength: -84 dB ▂▄▆█
[13:50:17][C][wifi:447]:   Channel: 11
[13:50:17][C][wifi:448]:   Subnet: 255.255.255.0
[13:50:17][C][wifi:449]:   Gateway: 192.168.178.1
[13:50:17][C][wifi:450]:   DNS1: 192.168.178.1
[13:50:17][C][wifi:451]:   DNS2: 0.0.0.0
[13:50:17][C][logger:185]: Logger:
[13:50:17][C][logger:186]:   Level: DEBUG
[13:50:17][C][logger:188]:   Log Baud Rate: 115200
[13:50:17][C][logger:189]:   Hardware UART: UART0
[13:50:17][C][uart.idf:159]: UART Bus 1:
[13:50:17][C][uart.idf:160]:   TX Pin: GPIO16
[13:50:17][C][uart.idf:161]:   RX Pin: GPIO17
[13:50:17][C][uart.idf:163]:   RX Buffer Size: 256
[13:50:17][C][uart.idf:165]:   Baud Rate: 115200 baud
[13:50:17][C][uart.idf:166]:   Data Bits: 8
[13:50:17][C][uart.idf:167]:   Parity: NONE
[13:50:17][C][uart.idf:168]:   Stop bits: 1
[13:50:17][C][ld2410:022]: LD2410:
[13:50:17][C][ld2410:024]:   TargetBinarySensor 'Presence'
[13:50:17][C][ld2410:024]:     Device Class: 'occupancy'
[13:50:17][C][ld2410:025]:   MovingTargetBinarySensor 'Moving Target'
[13:50:17][C][ld2410:025]:     Device Class: 'motion'
[13:50:17][C][ld2410:026]:   StillTargetBinarySensor 'Still Target'
[13:50:17][C][ld2410:026]:     Device Class: 'occupancy'
[13:50:17][C][ld2410:027]:   OutPinPresenceStatusBinarySensor 'out pin presence status'
[13:50:17][C][ld2410:027]:     Device Class: 'presence'
[13:50:18][C][ld2410:075]:   Throttle_ : 1000ms
[13:50:18][C][ld2410:076]:   MAC Address : 
[13:50:18][C][ld2410:077]:   Firmware Version : 
[13:50:18][C][mdns:116]: mDNS:
[13:50:18][C][mdns:117]:   Hostname: esp32-c6-one
[13:50:18][C][esphome.ota:073]: Over-The-Air updates:
[13:50:18][C][esphome.ota:074]:   Address: esp32-c6-one.local:3232
[13:50:18][C][esphome.ota:075]:   Version: 2
[13:50:18][C][esphome.ota:078]:   Password configured
[13:50:18][C][safe_mode:018]: Safe Mode:
[13:50:18][C][safe_mode:019]:   Boot considered successful after 60 seconds
[13:50:18][C][safe_mode:021]:   Invoke after 10 boot attempts
[13:50:18][C][safe_mode:022]:   Remain in safe mode for 300 seconds
[13:50:18][C][api:140]: API Server:
[13:50:18][C][api:141]:   Address: esp32-c6-one.local:6053
[13:50:18][C][api:143]:   Using noise encryption: YES

Try with:

logger:
  level: DEBUG
  baud_rate: 0

Thanks for the suggestion @Karosm but this does not change the behaviour.

Try setting the UART id explicitly:

uart:
  id: ld2410_uart
  baud_rate: 115200
  rx_pin: 17
  tx_pin: 16
  parity: NONE
  stop_bits: 1

ld2410:
  uart_id: ld2410_uart

Also, I have various LD2410’s (with C3’s though) and they have no parity or stop_bits configuration.

Just for fun, try swapping rx_pin and tx_pin.

Also, I have various LD2410’s (with C3’s though) and they have no parity or stop_bits configuration.

Same when I run it with my C3 but I think these settings are the default values anyway, so they make no difference.

Just for fun, try swapping rx_pin and tx_pin.

Tried this, no change.

Try setting the UART id explicitly:

Tried this, also no change :neutral_face:

Here’s my current config:

esp32:
  board: esp32-c6-devkitc-1
  variant: esp32c6
  framework:
    type: esp-idf

logger:
  level: DEBUG
  baud_rate: 0

uart:
  id: ld2410_uart
  baud_rate: 115200
  rx_pin: 17
  tx_pin: 16

ld2410:
  uart_id: ld2410_uart

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target
    out_pin_presence_status:
      name: out pin presence status

I can check tomorrow if I can get it working, I think I have some LD2410’s and C6’s.

It works for me using a SuperMini C6 (which is a Seeed Xiao clone):

[08:25:19][D][binary_sensor:036]: 'Moving Target': Sending state ON
[08:25:21][D][binary_sensor:036]: 'Moving Target': Sending state OFF
[08:25:23][D][binary_sensor:036]: 'Moving Target': Sending state ON
[08:25:25][D][binary_sensor:036]: 'Moving Target': Sending state OFF

Configuration (using ESPHome 2024.10.0):

esphome:
  name: ld2410test

esp32:
  board: esp32-c6-devkitc-1
  variant: esp32c6
  flash_size: 4MB
  framework:
    platform_version: 6.6.0
    type: esp-idf
    version: 5.2.1
    sdkconfig_options:
      CONFIG_ESPTOOLPY_FLASHSIZE_4MB: y

logger:
  level: DEBUG
  baud_rate: 0

wifi:
  ssid: "XXX"
  password: "YYY"

api:

uart:
  id: ld2410_uart
  baud_rate: 256000
  rx_pin: 14
  tx_pin: 15

ld2410:
  uart_id: ld2410_uart
  throttle: 500ms

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target
    out_pin_presence_status:
      name: out pin presence status

I’m using an LD2410C board:

2 Likes

Thank you @robertklep, I really appreciate you testing that!

I copied it and adjusted the pins but also still no luck:

esp32:
  board: esp32-c6-devkitc-1
  variant: esp32c6
  flash_size: 4MB
  framework:
    platform_version: 6.6.0
    type: esp-idf
    version: 5.2.1
    sdkconfig_options:
      CONFIG_ESPTOOLPY_FLASHSIZE_4MB: y

logger:
  level: DEBUG
  baud_rate: 0

uart:
  id: ld2410_uart
  baud_rate: 256000
  rx_pin: 17
  tx_pin: 16

ld2410:
  uart_id: ld2410_uart
  throttle: 500ms

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target
    out_pin_presence_status:
      name: out pin presence status

I also tried:

  • A different Seeed ESP32-C6
  • Changing the firmware version on the mmWave sensor (via the app, bluetooth)
  • Changing the baud rate on the mmWave sensor (via the app, bluetooth)
  • Resetting the mmWave sensor back to defaults (via the app, bluetooth)
  • Switching back to ESP32-C3, sensor works perfectly

Maybe I should ask in the Seeed forums?

Given that the sensor works fine with a C3, it might be a distinct issue with the Seeed C6 board, so perhaps the Seeed forums can provide better insight.

OK just an update on this topic, after asking in the Seeed forums: the pin numbers were wrong. This configuration works for me:

esp32:
  board: esp32-c6-devkitc-1
  variant: esp32c6
  flash_size: 4MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESPTOOLPY_FLASHSIZE_4MB: y

logger:
  level: DEBUG

uart:
  baud_rate: 256000
  rx_pin: 2
  tx_pin: 21

ld2410:

binary_sensor:
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target
    out_pin_presence_status:
      name: out pin presence status
3 Likes

I was trying to follow the deltas between -C3 and -C6 Xiao pinouts, and thank you for including here.

It appears the D2 and D3 pins (Arduino naming) was where the sensor was wiring to on the Xiao board?

So consulting Seeedstudio wiki for each,

  • on -C3 Xiao these correspond to GPIO4 (D2) and GPIO5 (D3).
  • on -C6 Xiao these correspond to GPIO2 (D2) and GPIO21 (D3).

Did I capture that correctly?

I think the source of the confusion was that “TX” and “RX” as labeled on -C6 Xiao pinout are respectively GPIO16 and GPIO17. But these were not where the sensor was wired – and ESPHome needed to be configured to use those actual pins?

I am about to try to set up my own mmWave sensor using Xiao ESP32-C6, so it was helpful to discover this information.

EDIT: adding wiki links - labeled pinouts available there

2 Likes