ESP8266 NodeMCU with RCWL-0516 Microwave Radar Proximity Sensor (Arduino IDE)

In this guide, you’ll learn how to use the RCWL-0516 Microwave Radar Proximity sensor to detect motion with the ESP8266 NodeMCU. We’ll show you how to wire the sensor to the ESP8266 board and we’ll write an Arduino sketch to detect when motion is detected. The RCWL-0516 is a great alternative to the popular PIR motion sensor.

ESP8266 NodeMCU with RCWL-0516 Microwave Radar Proximity Sensor Arduino IDE

We have a similar guide for the ESP32 board: ESP32 with RCWL-0516 Microwave Radar Proximity Sensor (Arduino IDE).

Table of Contents:

Throughout this tutorial, we’ll cover the following contents:

Introducing the RCWL-0516 Microwave Radar Proximity Sensor

Introducing the RCWL-0516 Microwave Radar Proximity Sensor

The RCWL-0516 is a small, inexpensive sensor that uses microwave radar to detect the presence of moving objects. The sensor works by emitting a beam of microwaves and then detecting the Doppler shift in the reflected waves as objects move past.

Usually, these sensors are sold as a pack of five and don’t come with header pins. So, you may need to get header pins separately and then solder them yourself.

RCWL-0516 Microwave Radar Proximity Sensors

Where to Buy?

You can check the following link on Maker Advisor and compare the price in different stores.

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

How does it work?

The RCWL-0516 sensor has a built-in oscillator that generates a microwave signal at a frequency of 3.18 GHz. The sensor then sends out this signal in a 360-degree pattern.

When an object moves within the sensor’s range, the reflected waves are picked up by the sensor’s receiver. The receiver then measures the frequency of the reflected waves and compares it to the frequency of the original signal. If the frequency of the reflected waves has changed, the sensor knows that an object has moved.

The RCWL-0516 sensor has a single output pin that goes HIGH when it detects movement. It outputs LOW when no motion is detected.

RCWL-0516 Sensor Features

The RCWL-0516 has a detection range of up to 7 meters and can detect objects moving at speeds of up to 2 meters per second. It also has a built-in adjustable delay time, which can be used to prevent the sensor from triggering repeatedly on the same object.

RCWL-0516 Sensor Features

Note: even though it mentions a detection range of up to 7 meters, I couldn’t get those results with my setup. However, I got very good feedback from some of our readers about this sensor.

Here’s a summary of some of the key features of the RCWL-0516 sensor:

  • Uses microwave radar to detect moving objects
  • Detection range of up to 7 meters
  • Can detect objects moving at speeds of up to 2 meters per second
  • Built-in adjustable delay time
  • Low power consumption
  • Inexpensive

RCWL-0516 sensor specifications:

  • Supply voltage: 4–28 VDC
  • Operating frequency: 3.18 GHz
  • Sensing distance: 5–7 m
  • Output level: 3.4V High <0.7 Low
  • Output drive: 100mA
  • Output timing: 2 second retrigger with motion

You can get more information about the sensor on the following GitHub page:

Optional Light Depend Resistor (LDR) Sensor

The sensor comes with the option to solder a light-depend resistor (light sensor) if you want your sensor to operate just in dark conditions, for example. You can get the output of the LDR sensor on the LDR pin. Alternatively, you can also connect the LDR to the CDS pin.

RCWL-0516 Sensor and Optional LDR

When the output of the LDR is bigger than 0.7V, the OUT pin will output a HIGH signal when motion is detected. If motion is detected but the output of the LDR is smaller than 0.7V, the output will be LOW. This means that when attaching an LDR, the sensor will only sense motion when it’s dark.

RCWL-0516 Microwave radar sensor with LDR

You can adjust the sensitivity of the LDR, by connecting a resistor on the R-CDS pads (see the following section), or by adding a pull-up resistor externally in parallel with the CDS pin.

In my case, I added a pull-up 22KOhm resistor to the LDR pin so that it could detect motion when there is low light. Without the resistor, not even in very dark conditions I had a positive output. You might need to try with different resistance values to see which one works best for your scenario.

Adjustment components

RCWL-0516 Microwave radar sensor with LDR backside

At the back of the sensor, there are three pads for additional SMD components (0805 dimensions):

The following information was taken from this GitHub page.

  • C-TM: Regulate the repeat trigger time. The default (unpopulated) time is 2s. An SMD capacitor to extend the repeat trigger time. Pin 3 of the IC emits a frequency (f), and the trigger time in seconds is given by (1/f) * 32678.
  • R-GN: The default detection range is 7m, adding a 1M resistor reduces it to 5m.
  • R-CDS: Resistor in parallel with the 1M pullup. Without R-CDS, the lowest resistance of the LDR (i.e. highest light level) where the output is enabled is ~269kΩ (=0.7V). Adding resistance here decreases the LDR resistance of the enable/disable threshold. If the LDR resistance at the desired light level threshold is <269k then you could add an external resistor in series with the LDR.

RCWL-0516 Microwave Radar Proximity Sensor Pinout

RCWL-0516 Microwave Radar Proximity Sensor Pinout


The RCWL-0516 microwave radar proximity sensor has five pins:

  • 3V3: this is the output from the voltage regulator (not the power pin)
  • VIN: this is the power input pin. The sensor can be powered by a voltage range of 4-28V.
  • GND: this is the ground pin.
  • OUT: this is the output pin. The output pin goes HIGH when the sensor detects movement and remains LOW when it doesn’t.
  • CDS: This pin is used to connect a light-dependent resistor (LDR). The LDR can be used to disable the sensor in bright light conditions.

The following table shows the pinout of the RCWL-0516 microwave radar proximity sensor:

3V33.3V power output (not to power the sensor)
GNDground pin
OUToutput pin (goes HIGH when motion is detected)
VINinput voltage to power the sensor (4V to 28V)
CDSLight-dependent resistor output

Microwave Radar Proximity Sensor vs PIR Motion Sensor

Microwave Radar Proximity Sensor vs PIR Motion Sensor

The microwave radar proximity sensor is many times used as an alternative to the PIR motion sensor, depending on the project application. The following table compares both sensors:

RCWL-0516 Microwave RadarPIR Motion Sensor
How it works?Active Sensor (emits microwave signals and detects reflections).Passive Sensor (detects infrared radiation emitted by objects).
Detection RangeLonger range, typically up to 7+ meters.Shorter range, typically a few meters, depending on the model.
Sensing Through ObstaclesCan sense through non-metallic materials.Obstructed by certain materials (e.g., glass)
Sensitivity to MotionHighly sensitive, may give false positives.Not so sensitive, may miss subtle movements. Only detects living things that emit heat.
Coverage AreaBroad coverage with wide radar pattern.Narrow field of view.

Connecting the RCWL-0516 Microwave Radar Proximity Sensor to the ESP8266

Follow the next table or schematic diagram to wire the RCWL-0516 microwave radar proximity sensor to the ESP8266:

RCWL-0516 SensorESP8266
3V3don’t connect
GNDGND
OUTGPIO12 (or any other GPIO of your choice)
VINVIN (or a voltage between 4 and 28V)
CDSdon’t connect
Connecting Wiring RCWL-0516 Microwave Radar Proximity Sensor to the ESP8266

ESP8266 NodeMCU with the RCWL-0516 Sensor – Arduino Sketch

Copy the following code to your Arduino IDE. This example is very straightforward. It simply reads the output of the sensor and prints in the Serial Monitor when motion is detected and lights up the built-in LED of the ESP8266 accordingly (the LED is on when motion is detected).

Alternatively, you may also use interrupts and timers to detect motion. You can use a similar code to the one we use in the following tutorial: ESP8266 Interrupts and Timers using Arduino IDE (NodeMCU).

/*
  Rui Santos
  Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-rcwl-0516-arduino/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*/

// If you're using the built-in LED for testing, remember that it works with inverted logic
// (HIGH=LOW, and LOW=HIGH)
int led = 2;               // the pin that the LED is attached to
int sensor = 12;           // the pin that the sensor is attached to
int state = LOW;           // by default, no motion detected
int val = 0;               // variable to store the sensor status (value)

void setup() {
  pinMode(led, OUTPUT);       // initalize LED as an output
  pinMode(sensor, INPUT);     // initialize sensor as an input
  Serial.begin(115200);       // initialize serial
}

void loop(){
  val = digitalRead(sensor);   // read sensor value
  if (val == HIGH) {           // check if the sensor is HIGH
    digitalWrite(led, HIGH);   // turn LED ON
    
    if (state == LOW) {
      Serial.println("Motion detected!"); 
      state = HIGH;       // update variable state to HIGH
    }
  } 
  else {
    digitalWrite(led, LOW); // turn LED OFF
      
    if (state == HIGH){
      Serial.println("Motion stopped!");
      state = LOW;       // update variable state to LOW
    }
  }
}

View raw code

How the code works

Start by defining the pins for the LED and for the output pin of the sensor. To simplify we’re using the ESP8266 built-in LED that is connected to GPIO2, but you can also connect a physical LED to any other GPIO, just change the code accordingly.

int led = 2;                 // the pin that the LED is attached to

We’re connecting the output of the sensor to GPIO 12, but you can use any other digital GPIO.

int sensor = 12;          // the pin that the sensor is attached to

Then, initialize some variables. The state variable stores the current state of the output pin of the sensor and it is initially set to LOW.

int state = LOW;         // by default, no motion detected

The val variable will store the status (value) of the sensor’s digital output, either HIGH or LOW.

int val = 0;                 // variable to store the sensor status (value)

Basically, val is used to temporarily store the real-time output value of the sensor, while state is used to keep track of whether motion has been detected or not over time.

In the setup(), set the LED as an output and the sensor as an input. Also, initialize the Serial Monitor at a baud rate of 115200.

void setup() {
  pinMode(led, OUTPUT);      // initalize LED as an output
  pinMode(sensor, INPUT);    // initialize sensor as an input
  Serial.begin(115200);        // initialize serial
}

In the loop(), we start by reading the sensor’s digital output (HIGH or LOW) and store it in the val variable.

val = digitalRead(sensor);   // read sensor value

If the sensor’s output is HIGH (motion detected), the LED turns on.

if (val == HIGH) {               // check if the sensor is HIGH
  digitalWrite(led, HIGH);   // turn LED ON

Note: the ESP8266 built-in LED works with inverted logic, so you need to write LOW to turn it on and HIGH to turn it off. If you’re using a regular LED connected to that GPIO, it works with the “regular” logic.

Then, we check if the previous status was LOW. If so, it means the state has changed and that motion has been detected. We print a message in the Serial Monitor and change the state variable to HIGH.

if (state == LOW) {
  Serial.println("Motion detected!"); 
  state = HIGH;       // update variable state to HIGH
}

If the sensor’s output is LOW (no motion detected), we turn the LED off.

else {
   digitalWrite(led, LOW); // turn LED OFF

If the previous state was HIGH and, if now the state is LOW, it means motion has stopped, and we can set the state variable to LOW.

if (state == HIGH){
  Serial.println("Motion stopped!");
  state = LOW;       // update variable state to LOW
}

Demonstration

Upload the code to your ESP8266 board and open the Serial Monitor. Reset your board.

ESP8266 with RCWL-0516 microwave radar sensor Demonstration

Wave your hand in front of the motion sensor. You should get a “Motion detected” message followed by a “Motion stopped” message after two seconds. Additionally, the on-board LED will light up when motion is detected.

Testing RCWL-0516 microwave radar sensor Serial Monitor Arduino IDE

If you have an LDR attached, you’ll need to decrease the luminosity to get positive results.

ESP8266 with RCWL-0516 microwave radar sensor

Wrapping Up

In this tutorial, you learned how to use the RCWL-0516 microwave radar proximity sensor to detect motion in your surroundings. The RCWL-0516 might be a good alternative to the PIR motion sensor depending on your project requirements.

We hope you found this tutorial useful. If you want to try a PIR motion sensor instead, read this tutorial: ESP8266 with PIR Motion Sensor.

We have tutorials for more than different 20 sensors and modules with the ESP8266. Check out the following link:

Do you want to learn more about the ESP8266? Check out all our Resources:

Thanks for reading.



Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »
Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »

Enjoyed this project? Stay updated by subscribing our newsletter!

7 thoughts on “ESP8266 NodeMCU with RCWL-0516 Microwave Radar Proximity Sensor (Arduino IDE)”

  1. I have a few sensors that work when I wave my hand in front of them. The trick is to get them to work for moving vehicles. 2m/s is a fast walk, so this device only good for pedestrian traffic. Do you have something that is faster, eg for up to 80 kph?

    Reply
  2. As always, excellent post. I have tried use this sensor before, but it didn’t worked as well as it worked when I tried this tutorial. Also, thank you very much for the session “Adjustment components”, I didn’t know about these extra resources!

    Reply
    • Hi.
      Thanks for your comment.
      The same happened to me. The sensor worked much better with Arduino than with the ESP32 or ESP8266.
      I think the culprit might be the power supply. Maybe trying to power the sensor with an external 5V power source would give better results.
      Regards,
      Sara

      Reply
  3. Hi Sara,

    there are different versions of the NodeMCU Boards like LUA Lolin V2, LUA Lolin V3 or LUA Amica Modul and some types more. Is there any known problem to use different boards? Is there a “favorite” board should be used for this workshop-sample?

    Thanks for reply and best regards,
    Manfred

    Reply
  4. Hi there,

    have tested the RCWL-0516 and it works fine. The problem ist the frequency at 3,19 GHz that “collide” with european Transmitter-Restrictions. The transmitter-power-out of 20mW is not the problem, the restrictions is the problem.

    Like to ask if the RCWL-0516 can operate at a lower frequency at 2.400 – 2.450 GHz? This slot is free of restrictions and can be used for “Low-Power Motion-Detectors”. Maybe adjusting R/C-components could set the oscillator at a alternativ frequency.

    Thanks for reply and suggestions about this…

    Rene

    Reply

Leave a Comment

Download Our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.