Actualizado: Oct 23, 2025—8 min read
Sensor de presencia mmWave DIY con ESPHome para principiantes
Usar los enlaces de afiliado de abajo ayuda a apoyar el canal y todo el contenido que creo 🎉🙌
- Placa de desarrollo ESP32 de 30 pines
- Amazon: (paquete de 3)
- Aliexpress: (USB C)
- Sensor de radar mmWave HLK-LD2450
- Amazon: (Kit HLK-LD2450)
- Aliexpress: (Kit HLK-LD2450)
Opcional
- Cable Dupont
- Cable USB C
- Cargador 5v
- Amazon: (Paquete de 2)
- Aliexpress: (Cargador 5v)
- Frecuencia: 24 GHz (banda ISM)
- Tipo de sensor: Radar de ondas milimétricas
- Rango de detección: Hasta 6 metros (aproximadamente 8 metros en términos prácticos)
- Tamaño del módulo: Ultrapequeño, mide 15mm x 44mm
- Ángulo de detección: ±60°
- Ángulo de inclinación: ±35°
Además, el sensor HLK-LD2450 admite las siguientes funciones:
- Localización y seguimiento precisos de objetivos en movimiento: Distancia, ángulo y velocidad.
- Zonas configurables: Te permite definir hasta 3 zonas configurables para monitoreo.
- Múltiples opciones de conexión: Puedes conectarlo usando interfaces de pines y conectores.
- Firmware con algoritmo inteligente: Utiliza formas de onda FMCW y tecnología avanzada de procesamiento de señales.
Seguiré agregando más sensores a esta carcasa, así que también podrás usarla para otros proyectos. 🛠️
Puedes conseguirla en:
O pedirla desde:
checkleylane hizo un clip para sujetar la parte superior de la carcasa original
Puedes conseguirlo en:
F-Square hizo una nueva carcasa para este proyecto, con muchas mejoras:
- Reorganizó los sensores dentro de la carcasa (ahora la carcasa puede mirar hacia arriba, en lugar de hacia abajo).
- Agregó tornillos M3, para que el cuerpo pueda mantenerse en su lugar fácilmente.
Puedes conseguirla en:
| Placa ESP32 | HLK-LD2450 |
|---|
| VIN | 5v |
| TX2 | RX |
| RX2 | TX |
| GND | GND |
Firmware actualizado a ESPHome 2024.12.4
Se agregó soporte OTA
Solo reemplaza mmwave_sensor con el nombre de tu sensor. Ej: mmwave_sensor_aac3 o mmwave_sensor_no_aac3 según el firmware que hayas flasheado.
| Firmware | Nombre del sensor |
|---|
| Con Bluetooth Proxy | mmwave_sensor |
| Sin Bluetooth Proxy | mmwave_sensor_no |
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
💡𐂷 Luz con sensor
Por
Blacky
Documentación
aquí
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
YouTube Subscriber Access
FIRMWARE
YouTube Subscriber Benefit
This firmware is free for all our YouTube subscribers!
Log in with your Google account to access it on our website.
💡 Validation Tip
If you have trouble with this feature, make sure your subscription list is public in your YouTube settings, under "Privacy".