Learn to use the HC-SR501 PIR Sensor. In this post we’ll go over how to use this sensor in standalone applications (i.e. without a microcontroller) and with an Arduino.
The HC-SR501 PIR sensor is a Passive Infrared sensor that can be used to detect the presence of a body. This is accomplished by the sensor by sensing the amount of infrared radiation within its range. When there isn’t anything in front of the sensor (other than whatever is in the background), the sensor will be in a steady state, but when something passes in front of it, the infrared radiation sensed by the PIR sensor will change, and once the body passes, it will return to normal. This change is what’s detected, resulting in the sensor outputting a signal that indicates a body was detected.


HC-SR501 Sensor Pins
The HC-SR501 PIR sensor has three pins: GND, Out, and VCC.
GND – This pin is connected to the main circuit ground. If used with an Arduino, the sensor and the Arduino’s ground must be connected.
VCC – A typical voltage for VCC for this sensor is 5V.
Out – This pin will output 3.3V when motion is detected, and 0V when there is no motion.

HC-SR501 Sensor Setting
There are two main settings that can be adjusted: sensitivity and time delay. Both of these settings can be adjusting by turning the screws show on the image to the right.
Sensitivity – This will define the range/distance over which the sensor will be “looking” for motion. The lowest setting would be approximately 10ft/3meters and the highest setting would be roughly 23ft/7meters.
Time Delay – This is how long the sensor will provide an output of 3.3V after the motion has been detected. This will range from 3 seconds, to 5 minutes.

Other considerations
The sensor takes about a minute to start-up. So once you provide power by connecting to VCC and GND, wait roughly one minute before expecting any readings from the sensor.
HC-SR501 without an Arduino
In this example we will setup a buzzer (KY-012) and red LED to make some noise and light up when motion is detected. To enable this, a 2N2222 transistor will be used as a switch (as shown below). The two images below show the breadboard and circuit for the same example:
HC-SR501 with an Arduino
In this example we connect the HC-SR501 sensor to an Arduino UNO by connecting the sensor output to digital input port #2 on the Arduino. This will enable the Arduino to know when the sensor output is active (i.e. sending 3.3V) and when it’s not (i.e. at 0V). Separately, we connect an LED and 220Ohm resistor in series with digital output #6 and then connect to ground. This allows us to trigger a command in the Arduino to light up the LED when the sensor output is active.
Click to enlarge
Arduino Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//Arduino Code - HC-SR501 int PIR = 2; //GPIO 2 --- Digital Input coming from PIR (HC-SR501) int LED = 6; //GPIO 6 --- Digital Output to LED int PIR_State=0; //Variable to handle PIR state void setup() { // put your setup code here, to run once: pinMode(PIR, INPUT); //Step pin as input pinMode(LED, OUTPUT); //Step pin as output } void loop() { // put your main code here, to run repeatedly: PIR_State=digitalRead(PIR); if (PIR_State == 1){ digitalWrite(LED, HIGH); } else{ digitalWrite(LED, LOW); } } |
Components used in this example
*As an Amazon & Ebay Associate I earn from qualifying purchases.
Component | Link | Comments |
Arduino UNO | https://amzn.to/3uYVAMC https://ebay.us/veZdKX | |
Electronic Component Kit | https://amzn.to/3gj4r7O https://ebay.us/AdnfMw | Includes resistors, LED, buzzer, jumper wires, and power supply module. |
Hilitchi Transistors Assortment Kit | https://amzn.to/3gf2nOl https://ebay.us/8BLbQA | Includes 2N2222 transistor |
HC-SR501 (PIR sensor) | https://amzn.to/3mSrvf2 https://ebay.us/O1yyn2 | |
Breadboard (Elenco 9440) | https://amzn.to/3x23dnq https://ebay.us/FcwSdb |