Published: Mar 8, 20246 min read

Beginner DIY ESPHome mmWave Presence Sensor

Written by: Fixt
mmWave Sensor
Back
Esp32 housing
Inside

Prerequisites

Using the affiliate links below helps support the channel and all the content I create 🎉🙌

Optional

HLK-LD2450 Sensor Specs

Back
  • Frequency: 24 GHz (ISM band)
  • Sensor Type: Millimeter wave radar
  • Detection Range: Up to 6 meters (approximately 8 meters in practical terms)
  • Module Size: Ultra-small, measuring 15mm x 44mm
  • Detection Angle: ±60°
  • Pitch Angle: ±35°

Additionally, the HLK-LD2450 sensor supports the following features:

  • Precise motion target localization and tracking: Distance, angle and speed.
  • Configurable Zones: It allows you to define up to 3 configurable zones for monitoring.
  • Multiple Connection Options: You can connect it using pin and socket interfaces.
  • Intelligent Algorithm Firmware: Utilizes FMCW waveforms and advanced signal processing technology.

fixtSE DIY Sensor Case

I'll keep adding more sensors to this case, so you can use it for other projects as well.

You can get it on:

Or order it from:

Save $5 on your first order using our link: https://pcbway.com/g/lHR6if

How to wire it up

Wire Up
ESP32 BoardHLK-LD2450
VIN5v
TX2RX
RX2TX
GNDGND

ESPHome Firmware


Not supported browser detected

Try a different browser!

The only difference between the two firmwares is the Bluetooth Proxy. If you don't need it, you can use the firmware without it.
You can find the documentation here

The YAML file to use the HLK-LD2450 sensor on your own ESPHome project is now available on our Ko-Fi Shop and it's available for free for all the channel Members and Patreons.


Members Content
YAML
Member Banner

Join our community to unlock exclusive
content!

  • As a Tinkerer 🤖, you’ll gain:
    • Exclusive Member Content Access: You’ll receive exclusive access to the Member Content on our website.
    • Free Shop Content Access during the first 2 weeks of its release.
      Look for the MemberFree badge on the title.
    • Ko-fi Shop Discount: Enjoy a 25% discount on any item in our Ko-fi shop.
    • Early Tutorial Access: Get early access to our content on our website.
    • Member Shoutout: Stick around until the end for a shoutout to our dedicated members
  • Your support is invaluable in allowing us to continue creating the tutorials you like 😁🏠🎉
  • Click on any of the buttons below to become a member, and then log in with the same email address.

How to create zones

HLKRadarTool

How to use it on your dashboard

Plotly Graph

By dbuezas

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Just replace mmwave_sensor with your sensor. Ej: mmwave_sensor_aac3

Custom Card

type: custom:plotly-graph
title: mmWave Radar Sensor
refresh_interval: 1
hours_to_show: current_day
layout:
  height: 230
  margin:
    l: 50
    r: 20
    t: 20
    b: 40
  showlegend: true
  xaxis:
    dtick: 100
    gridcolor: RGBA(200,200,200,0.15)
    zerolinecolor: RGBA(200,200,200,0.15)
    type: number
    fixedrange: true
    range:
      - 400
      - -400
  yaxis:
    dtick: 100
    gridcolor: RGBA(200,200,200,0.15)
    zerolinecolor: RGBA(200,200,200,0.15)
    scaleanchor: x
    scaleratio: 1
    fixedrange: true
    range:
      - 600
      - 0
entities:
  - entity: ''
    name: Target1
    marker:
      size: 12
    line:
      shape: spline
      width: 5
    x:
      - $ex hass.states["sensor.mmwave_sensor_target_1_x"].state /-10
    'y':
      - $ex hass.states["sensor.mmwave_sensor_target_1_y"].state /10
  - entity: ''
    name: Target2
    marker:
      size: 12
    line:
      shape: spline
      width: 5
    x:
      - $ex hass.states["sensor.mmwave_sensor_target_2_x"].state /-10
    'y':
      - $ex hass.states["sensor.mmwave_sensor_target_2_y"].state /10
  - entity: ''
    name: Target3
    marker:
      size: 12
    line:
      shape: spline
      width: 5
    x:
      - $ex hass.states["sensor.mmwave_sensor_target_3_x"].state /-10
    'y':
      - $ex hass.states["sensor.mmwave_sensor_target_3_y"].state /10
  - entity: ''
    name: Zone1
    mode: lines
    fill: toself
    fillcolor: RGBA(20,200,0,0.1)
    line:
      color: RGBA(20,200,0,0.2)
      shape: line
      width: 2
    x:
      - $ex hass.states["number.mmwave_sensor_zone_1_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_1_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_1_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_1_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_1_x1"].state /-10
    'y':
      - $ex hass.states["number.mmwave_sensor_zone_1_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_1_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_1_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_1_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_1_y1"].state /10
  - entity: ''
    name: Zone2
    mode: lines
    fill: toself
    fillcolor: RGBA(200,0,255,0.1)
    line:
      color: RGBA(200,0,255,0.2)
      shape: line
      width: 2
    x:
      - $ex hass.states["number.mmwave_sensor_zone_2_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_2_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_2_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_2_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_2_x1"].state /-10
    'y':
      - $ex hass.states["number.mmwave_sensor_zone_2_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_2_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_2_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_2_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_2_y1"].state /10
  - entity: ''
    name: Zone3
    mode: lines
    fill: toself
    fillcolor: RGBA(200,120,55,0.1)
    line:
      color: RGBA(200,120,55,0.2)
      shape: line
      width: 2
    x:
      - $ex hass.states["number.mmwave_sensor_zone_3_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_3_x1"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_3_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_3_x2"].state /-10
      - $ex hass.states["number.mmwave_sensor_zone_3_x1"].state /-10
    'y':
      - $ex hass.states["number.mmwave_sensor_zone_3_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_3_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_3_y2"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_3_y1"].state /10
      - $ex hass.states["number.mmwave_sensor_zone_3_y1"].state /10
  - entity: ''
    name: Coverage
    mode: lines
    fill: tonexty
    fillcolor: rgba(168, 216, 234, 0.15)
    line:
      shape: line
      width: 1
      dash: dot
    x:
      - 0
      - $ex 600 * Math.sin((2 * Math.PI)/360 * 60)
      - 450
      - 400
      - 300
      - 200
      - 100
      - 0
      - -100
      - -200
      - -300
      - -400
      - -450
      - $ex -600 * Math.sin((2 * Math.PI)/360 * 60)
      - 0
    'y':
      - 0
      - $ex 600 * Math.cos((2 * Math.PI)/360 * 60)
      - $ex Math.sqrt( 600**2 - 450**2 )
      - $ex Math.sqrt( 600**2 - 400**2 )
      - $ex Math.sqrt( 600**2 - 300**2 )
      - $ex Math.sqrt( 600**2 - 200**2 )
      - $ex Math.sqrt( 600**2 - 100**2 )
      - 600
      - $ex Math.sqrt( 600**2 - 100**2 )
      - $ex Math.sqrt( 600**2 - 200**2 )
      - $ex Math.sqrt( 600**2 - 300**2 )
      - $ex Math.sqrt( 600**2 - 400**2 )
      - $ex Math.sqrt( 600**2 - 450**2 )
      - $ex 600 * Math.cos((2 * Math.PI)/360 * 60)
      - 0
raw_plotly_config: true

How to automate with it

💡𐂷 Sensor Light

By Blacky
Documentation here

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

I would love to hear your comments, or suggestions on this post.


Avatar of Fixt

Fixt is a Software Engineer passionate about making the world a better place through technology and automation.