PIR Motion Sensor: Created by Lady Ada
PIR Motion Sensor: Created by Lady Ada
PIR Motion Sensor: Created by Lady Ada
https://learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor
Overview 3
• Some Basic Stats 5
Connecting to a PIR 12
Testing a PIR 13
• Retriggering 14
• Changing sensitivity 16
• Changing Pulse Time and Timeout Length 17
• For older/other PIR sensors 18
CircuitPython Code 20
Example Projects 23
Our new PIRs have more adjustable settings and have a header installed in the 3-pin
ground/out/power pads
For many basic projects or products that need to detect when a person has left or
entered the area, or has approached, PIR sensors are great. They are low power and
These stats are for the PIR sensor in the Adafruit shop which is very much like the
Parallax one (https://adafru.it/aKj) . Nearly all PIRs will have slightly different
specifications, although they all pretty much work the same. If there's a datasheet,
you'll want to refer to it
• Size: Rectangular
• Price: $10.00 at the Adafruit shop (https://adafru.it/aIH)
• Output: Digital pulse high (3V) when triggered (motion detected) digital low
when idle (no motion detected). Pulse lengths are determined by resistors and
capacitors on the PCB and differ from sensor to sensor.
• Sensitivity range: up to 20 feet (6 meters) 110° x 70° detection range
• Power supply: 5V-12V input voltage for most modules (they have a 3.3V
regulator), but 5V is ideal in case the regulator has different specs
• BIS0001 Datasheet (https://adafru.it/clR) (the decoder chip used)
• RE200B datasheet (https://adafru.it/clS) (most likely the PIR sensing element
used)
• NL11NH datasheet (https://adafru.it/clT) (equivalent lens used)
• Parallax Datasheet on their version of the sensor (https://adafru.it/clU)
More links!
You can see above the diagram showing the element window, the two pieces of
sensing material
Lenses
PIR sensors are rather generic and for the most part vary only in price and sensitivity.
Most of the real magic happens with the optics. This is a pretty good idea for
manufacturing: the PIR sensor and circuitry is fixed and costs a few dollars. The lens
costs only a few cents and can change the breadth, range, sensing pattern, very
easily.
In the diagram up top, the lens is just a piece of plastic, but that means that the
detection area is just two rectangles. Usually we'd like to have a detection area that is
much larger. To do that, we use a simple lens (https://adafru.it/aKq) such as those
found in a camera: they condenses a large area (such as a landscape) into a small one
(on film or a CCD sensor). For reasons that will be apparent soon, we would like to
make the PIR lenses small and thin and moldable from cheap plastic, even though it
may add distortion. For this reason the sensors are actually Fresnel lenses (https://
adafru.it/aKr):
The Fresnel lens condenses light, providing a larger range of IR to the sensor.
OK, so now we have a much larger range. However, remember that we actually have
two sensors, and more importantly we dont want two really big sensing-area
rectangles, but rather a scattering of multiple small areas. So what we do is split up
the lens into multiple section, each section of which is a fresnel lens.
This macro shot shows the different Fresnel lenses in each facet!
The different faceting and sub-lenses create a range of detection areas, interleaved
with each other. That's why the lens centers in the facets above are 'inconsistent' -
every other one points to a different half of the PIR sensing element
Here is another image, more qualitative but not as quantitative. (Note that the sensor
in the Adafruit shop is 110° not 90°)
Connecting to a PIR
Most PIR modules have a 3-pin connection at the side or bottom. The pinout may vary
between modules so triple-check the pinout! It's often silkscreened on right next to
the connection (at least, ours is!) One pin will be ground, another will be signal and
the final one will be power. Power is usually 3-5VDC input but may be as high as 12V.
Sometimes larger modules don't have direct output and instead just operate a relay in
which case there is ground, power and the two switch connections.
For our PIR's the red cable is + voltage power, black cable is - ground power and
yellow is the signal out. Just make sure you plug the cable in as shown above! If you
get it backwards you won't damage the PIR but it won't work.
Testing a PIR
Once you have the breadboard wired up, insert batteries and wait 30-60 seconds for
the PIR to 'stabilize'. During that time the LED may blink a little. Wait until the LED is off
and then move around in front of it, waving a hand, etc, to see the LED light up!
Retriggering
There's a couple options you may have with your PIR. First up we'll explore the
'Retriggering' option.
Once you have the LED blinking, look on the back of the PIR sensor and make sure
that the jumper is placed in the L position as shown below.
Now change the jumper so that it is in the H position. If you set up the test, you will
notice that now the LED does stay on the entire time that something is moving. That is
called "retriggering".
(The graphs above are from the BISS0001 datasheet, they kinda suck)
If you need to connect the sensor to something edge-triggered, you'll want to set it to
"non-retriggering" (jumper in L position).
Changing sensitivity
The Adafruit PIR has a trimpot on the back for adjusting sensitivity. You can adjust this
if your PIR is too sensitive or not sensitive enough - clockwise makes it more
sensitive.
The second is the "Ti" timeout which is how long the LED is guaranteed to be off
when there is no movement. This one is not easily changed but if you're handy with a
soldering iron it is within reason.
On Adafruit PIR sensors, there's a little trim potentiometer labeled TIME. This is a 1
Megaohm adjustable resistor which is added to a 10K series resistor. And C6 is 0.01uF
so
If the Rtime potentiometer is turned all the way down counter-clockwise (to 0 ohms)
then
If the Rtime potentiometer is turned all the way up clockwise to 1 Megaohm then
If RTime is in the middle, that'd be about 120 seconds (two minutes) so you can tweak
it as necessary. For example if you want motion from someone to turn on a fan for a
minimum of 1 minute, set the Rtime potentiometer to about 1/4 the way around.
Determining R10 and R9 isnt too tough. Unfortunately this PIR sensor is mislabeled (it
looks like they swapped R9 R17). You can trace the pins by looking at the BISS001
datasheet and figuring out what pins they are - R10 connects to pin 3 and R9
connects to pin 7. the capacitors are a little tougher to determine, but you can
'reverse engineer' them from timing the sensor and solving!
For example:
Likewise,
Ti = 24 * R9 * C7 = ~1.2 seconds
R9 = 470K and C7 = 0.1uF
Connecting PIR sensors to a microcontroller is really simple. The PIR acts as a digital
output, it can be high voltage or low voltage, so all you need to do is listen for the pin
to flip high (detected) or low (not detected) by listening on a digital input on your
Arduino
Its likely that you'll want reriggering, so be sure to put the jumper in the H position!
Power the PIR with 5V and connect ground to ground. Then connect the output to a
digital pin. In this example we'll use pin 2.
The code is very simple, and is basically just keeps track of whether the input to pin 2
is high or low. It also tracks the state of the pin, so that it prints out a message when
motion has started and stopped.
/*
* PIR sensor tester
*/
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input
void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(ledPin, HIGH); // turn LED ON
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
digitalWrite(ledPin, LOW); // turn LED OFF
if (pirState == HIGH){
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}
Don't forget that there are some times when you don't need a microcontroller. A PIR
sensor can be connected to a relay (perhaps with a transistor buffer) without a micro!
CircuitPython Code
It's easy to use a PIR sensor with CircuitPython using simple digital inputs. The PIR
sensor looks and acts kind of like a button or switch, i.e. it's only ever a high or low
logic level, so you don't need any special libraries or other code to read one from
Python. It will help to familiarize yourself with CircuitPython digital inputs and outputs
(https://adafru.it/BBl) before continuing though!
First make sure your PIR sensor is wired to your board as shown in the previous
page. There's no difference wiring a PIR sensor to an Arduino vs. CircuitPython
board. You must connect the power, ground, and sensor output to your board. The
sensor output should be connected to any digital I/O line on your board. In this
example we'll use pin D2 on a Trinket M0.
Run the following code to import the board and digitalio modules which lets you read
digital inputs:
import board
import digitalio
Then create a simple digital input for the PIR. Remember to use the right board pin
for how you've wired your sensor to your board. This example is using pin D2 on a
Trinket M0:
pir = digitalio.DigitalInOut(board.D2)
pir.direction = digitalio.Direction.INPUT
Note you'll likely want the sensor's jumper in the H position for retriggering mode as
mentioned on the previous page.
For example with no movement in front of the sensor you might see:
pir.value
Then wave your hand in front of the sensor, and as you wave it run the same
command again. Notice you get a True result!
pir.value
Here's a complete example just like from the previous page where movement from
the PIR sensor will turn on the board's LED and print a message. This is a direct port
of the previous page's Arduino example to CircuitPython. Try saving it as a main.py
on your board and connecting to the serial terminal to see the output as it runs! (be
sure to change the board pin numbers to your sensor and LED wiring!)
import board
import digitalio
Example Projects
A simple room greeter that plays the super mario brothers theme music when
triggered by a PIR in a hacked airwick freshener unit.
A USB-powered singing and blinking Mario mushroom (there's a video on the site!) (h
ttps://adafru.it/aKx)
A home-made security system using PIR sensors (which is built into a Start Trek
panel!)
An interesting hack whereby the PIR sensor is used 'raw' to track movement.