Documentation

HLK-2410B Human Presence Radar Motion Detection Module (Pre-Soldered) | ShillehTek Product Manual
Documentation / HLK-2410B Human Presence Radar Motion Detection Module (Pre-Soldered) | ShillehTek Product Manual

HLK-2410B Human Presence Radar Motion Detection Module (Pre-Soldered) | ShillehTek Product Manual

ESP32HLKhlk-2410b-human-presence-radar-motion-detection-module-pre-solderedmanualmmWavePresence SensorRadarshillehtek

Overview

The HLK-2410B Pre-Soldered Module is an earlier member of Hi-Link's 24GHz mmWave human presence sensor family. Like its successor the 2410C, it uses millimeter-wave radar to detect both moving and stationary human targets — but with simpler configuration and a smaller AT-command set. If you don't need per-gate sensitivity tuning and just want clean presence/absence output from a single sensor, the 2410B is the easier and more affordable choice.

The module ships on a breakout board with header pins already soldered in place, so it goes straight from the bag into a breadboard. A 4-pin connector handles power and UART (5V, RX, TX, GND), and a side debug header is available for advanced users who want to flash firmware or use Hi-Link's PC configuration tool.

Typical use cases include smart bathroom lighting, desk-occupancy detection, hallway automations, and bedside presence-aware nightlights. The 2410B excels in environments where you mainly need a binary "is someone there?" answer without the complexity of distance-gated rules. Because it's true radar — not PIR — it sees through clothing, blankets, and thin plastic enclosures, and it doesn't care about ambient temperature.

At a Glance

Technology
24GHz mmWave Radar
Power
5V DC
Interface
UART (115200 baud)
Detection Range
Up to 5 m
Detection Type
Motion + Static Presence
Form Factor
Pre-Soldered Breakout

Specifications

Parameter Value
Operating Voltage 5V DC (4.5V – 5.5V)
Operating Current ~70 mA average
Radar Frequency 24.000 – 24.250 GHz
Max Detection Distance (motion) ~5 m
Max Detection Distance (static) ~3 m
Detection Angle ±60° horizontal, ±30° vertical
UART Baud Rate 115200 bps, 8N1 (default)
TX Logic Level 3.3V TTL
Output Format ASCII status strings ("ON" / "OFF")
Configurability Basic (sensitivity, hold time)
Operating Temperature -40°C to +85°C
Connectors 4-pin (5V/RX/TX/GND) + debug header

Pinout Diagram

HLK-2410B pre-soldered mmWave presence sensor pinout showing 5V, Rx, Tx, GND on 4-pin connector and debug header.

Wiring Guide

Arduino Wiring

The 2410B's default 115200 baud is gentler than the 2410C's 256000 baud, making SoftwareSerial on an Uno comfortably reliable. Use D2 as RX and D3 as TX. Remember the crossover: sensor TX goes to Arduino RX. The sensor's 3.3V TX line is a valid HIGH for the Uno's 5V inputs, so no level shifter is needed.

Sensor Pin Arduino Uno Pin
5V 5V
GND GND
TX D2 (SoftwareSerial RX)
RX D3 (SoftwareSerial TX)
Warning: If you must drive the Arduino TX → sensor RX line with the Uno's 5V logic, add a simple voltage divider (1k / 2k) for safety. The sensor's RX is technically 3.3V-tolerant only.
Tip: Mount the antenna pointing into the room. Keep the back of the board at least 2 cm away from large metal surfaces.

ESP32 Wiring

Use UART2 on GPIO16 (RX) and GPIO17 (TX). The ESP32's native 3.3V logic is a perfect match for the sensor's 3.3V UART, so no level conversion is required. Power the sensor from the 5V/VIN rail.

Sensor Pin ESP32 Pin
5V 5V / VIN
GND GND
TX GPIO16 (RX2)
RX GPIO17 (TX2)
Tip: ESP32 is ideal for the 2410B in Home Assistant deployments — pair the sensor with ESPHome's uart component and a simple text sensor for plug-and-play occupancy.

Raspberry Pi Wiring

Enable the hardware serial port via sudo raspi-config → Interface Options → Serial Port → disable login shell, enable hardware serial. The primary UART appears on GPIO14 (TXD) and GPIO15 (RXD). Power the sensor from the Pi's 5V rail.

Sensor Pin Raspberry Pi Pin
5V Pin 2 (5V)
GND Pin 6 (GND)
TX Pin 10 (GPIO15 / RXD)
RX Pin 8 (GPIO14 / TXD)
Warning: Pi GPIO is strictly 3.3V. Never connect the sensor's 5V supply pin to a Pi GPIO header pin — use only the 5V power pins on the GPIO connector (pins 2 and 4).

Raspberry Pi Pico Wiring

Use the Pico's UART0 on GP0 (TX) and GP1 (RX). Power the sensor from VBUS (pin 40) for a clean 5V supply while the Pico is USB-powered.

Sensor Pin Pico Pin
5V VBUS (Pin 40)
GND GND (Pin 38)
TX GP1 (Pin 2, UART0 RX)
RX GP0 (Pin 1, UART0 TX)
Tip: The Pico is the cheapest reliable host for this sensor. UART0 reads ASCII status strings comfortably at 115200 baud with very low CPU load.

Code Examples

Arduino

hlk2410b_uno.ino
#include <SoftwareSerial.h>

// HLK-2410B TX -> D2, RX -> D3
SoftwareSerial radar(2, 3);

String line;

void setup() {
  Serial.begin(115200);
  radar.begin(115200);
  Serial.println("HLK-2410B ready");
}

void loop() {
  while (radar.available()) {
    char c = radar.read();
    if (c == '\n' || c == '\r') {
      if (line.length() > 0) {
        line.trim();
        // Sensor emits ASCII status: "ON" when presence detected, "OFF" otherwise
        if (line.indexOf("ON") >= 0) {
          Serial.println("[PRESENCE] occupied");
        } else if (line.indexOf("OFF") >= 0) {
          Serial.println("[PRESENCE] vacant");
        } else {
          Serial.print("[RAW] ");
          Serial.println(line);
        }
        line = "";
      }
    } else {
      line += c;
    }
  }
}

ESP32

hlk2410b_esp32.ino
#include <HardwareSerial.h>

HardwareSerial radar(2);  // UART2

#define RXD2 16
#define TXD2 17

bool present = false;

void setup() {
  Serial.begin(115200);
  radar.begin(115200, SERIAL_8N1, RXD2, TXD2);
  Serial.println("HLK-2410B on ESP32 UART2");
}

void loop() {
  static String buf;
  while (radar.available()) {
    char c = radar.read();
    if (c == '\n' || c == '\r') {
      if (buf.length()) {
        buf.trim();
        bool nowPresent = (buf.indexOf("ON") >= 0);
        if (nowPresent != present) {
          present = nowPresent;
          Serial.printf("Presence -> %s\n", present ? "OCCUPIED" : "VACANT");
        }
        buf = "";
      }
    } else {
      buf += c;
    }
  }
}

Raspberry Pi (Python)

hlk2410b_pi.py
import serial
import time

ser = serial.Serial('/dev/serial0', 115200, timeout=1)
present = None

print("HLK-2410B reader started. Ctrl-C to exit.")
try:
    while True:
        line = ser.readline().decode(errors='ignore').strip()
        if not line:
            continue
        now = "ON" in line
        if now != present:
            present = now
            print("Presence:", "OCCUPIED" if present else "VACANT")
        else:
            # Optional raw print for debugging
            # print("raw:", line)
            pass
except KeyboardInterrupt:
    ser.close()

Raspberry Pi Pico (MicroPython)

hlk2410b_pico.py
from machine import UART, Pin
import time

uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
buf = ""
present = None

print("HLK-2410B on Pico UART0")

while True:
    if uart.any():
        chunk = uart.read()
        if chunk:
            buf += chunk.decode('utf-8', 'ignore')
            while '\n' in buf or '\r' in buf:
                # split on either line ending
                idx = min([i for i in (buf.find('\n'), buf.find('\r')) if i >= 0])
                line, buf = buf[:idx].strip(), buf[idx+1:]
                if line:
                    now = ("ON" in line)
                    if now != present:
                        present = now
                        print("Presence:", "OCCUPIED" if present else "VACANT")
    time.sleep_ms(50)

Frequently Asked Questions

How is the HLK-2410B different from the 2410C?
The 2410B is the earlier, simpler design. It emits ASCII presence strings at 115200 baud and has a small AT-command set covering sensitivity and hold time. The 2410C uses a binary protocol at 256000 baud and supports per-gate sensitivity, distance reporting, and a richer configuration tool. Pick the 2410B when you just need a binary occupancy signal; pick the 2410C when you need distance data or per-zone tuning.
What does the sensor output look like?
By default the module prints short ASCII status messages over UART — typically "ON" when presence is detected and "OFF" when the room has been clear for the configured hold time. Your code just needs to read lines and look for those tokens.
Can it detect a sleeping person?
Within ~2–3 m, yes. The static-presence detector tracks micro-motion from breathing. For larger rooms or thicker bedding, the 2410C's tunable static sensitivity will give you more reliable results.
How do I tune the hold time?
Send AT-style commands over UART to set the "no-presence" timeout (how long it waits with no detection before declaring the room vacant). Refer to the Hi-Link AT command reference shipped with the module; common values are 2–60 seconds.
Will it work behind a plastic enclosure?
Yes — 24GHz energy passes through most plastics and thin acrylic with negligible loss. Avoid metal, foil, foil-backed insulation, and anything with embedded mesh. Keep at least 2 cm of clearance behind the antenna.
Why does it sometimes false-trigger when no one is in the room?
Anything moving in the radar's field of view — a ceiling fan, swaying curtains, an HVAC vent flapper — will generate Doppler returns. Lower the motion sensitivity, or physically reposition the sensor so those reflectors are outside its main beam.
Can I power it from a 3.3V rail?
No. The sensor needs 5V on its supply pin. Its TX output is 3.3V logic, which is fine for ESP32/Pi/Pico inputs — but the input rail itself must be 5V.