PIR Detector SR505

pir-sr505

This tiny PIR, movement detector is simple to use and only has three pins, +, Рand OUT. it works with 5 volts. Connect the Рto the Arduino Gnd, the + to the Arduino 5 volts and the OUT to any digital pin ( I have used pin 8) set as an input. At rest, with no movement the OUT pin is 0 volts (LOW), movement within two to three feet will trigger the SR505 and the OUT pin will rise to 5 volts (HIGH).

There is about a five second ‘latch’ after the movement has stopped, the output staying HIGH, before going LOW again. I have used an LED connected to Arduino pin 7 to show when the SR505 has detected movement, the Arduino’s LED on pin 13 will be ON when there is no movement and OFF during movement and this LED could be used to show the detector is waiting for movement.

The simple sketch is shown below and sits in a loop waiting for the SR505 to trigger. One improvement could be to connect the OUT to an Arduino Interrupt pin this would allow another sketch to run until movement is detected. One application could be to run a display when a visitor is within range etc.

/*******************************************************
* SR505 PIR Detector
*
* by Chris Rouse December 2016
*
* SR505
* + to Arduino 5v
* – to Arduino Gnd
* OUT to Arduino Pin 8
*
* LED connect to pin 7 through a 220R resistor
*
* Once triggered the OUTPUT will stay HIGH for about 5 seconds
*
* Maximum range is about 2 to three feet
*/

#define PIR 8 // the PIR output
#define LED 7 // indicator LED
#define LED13 13 // onboard LED

void setup() {
pinMode(PIR, INPUT);
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
pinMode(LED13, OUTPUT);
digitalWrite(LED13, LOW);
}

void loop() {
// the output from the SR505 will go HIGH if movement is detected
if(digitalRead(PIR) == HIGH){
digitalWrite(LED, HIGH);
digitalWrite(LED13, LOW);
}
else{
digitalWrite(LED, LOW);
digitalWrite(LED13, HIGH);
}

} // END

Advertisements

Using a HC-SR501 PIR to detect movement.

This PIR sketch detects movement in a room and prints a message to the Serial Monitor as well as sounding a buzzer. The Arduino pin used to drive the buzzer could just as easily drive a LED or a relay.

The layout is shown below, a small speaker is connected between Gnd and pin 10. The PIR unit has three connections, connect Vcc to the Arduino 5volts , Gnd to Arduino Gnd and the signal output to Arduino pin 2.

/home/wpcom/public_html/wp-content/blogs.dir/10d/72092500/files/2014/12/img_1557-0.jpg

The sketch is shown here.


/*******************************************************

Uses a PIR sensor to detect movement, sounds a buzzer

*******************************************************/

int ledPin = 13; // choose the pin for the LED
int inputPin = 2; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0; // variable for reading the pin status
int pinSpeaker = 10; //Set up a speaker on a PWM pin (digital 9, 10, or 11)

void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare sensor as input
pinMode(pinSpeaker, OUTPUT);

Serial.begin(9600);
Serial.println ("Calibrating sensor");
delay (2000); // it takes the sensor 2 seconds to scan the area
Serial.println ("Done!");
}

void loop(){
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
blinky(); // blink LED when motion haas been detected
//digitalWrite(ledPin, HIGH); // turn LED ON
playTone(300, 160);
delay(150);
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
playTone(0, 0);
delay(300);
if (pirState == HIGH){
// we have just turned off
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}

void playTone(long duration, int freq) {
// duration in mSecs, frequency in hertz
duration *= 1000;
int period = (1.0 / freq) * 1000000;
long elapsed_time = 0;
while (elapsed_time < duration) {
digitalWrite(pinSpeaker,HIGH);
delayMicroseconds(period / 2);
digitalWrite(pinSpeaker, LOW);
delayMicroseconds(period / 2);
elapsed_time += (period);
}
}

void blinky() {
for(int i=0; i<3; i++) {
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
delay(200);
}
}