PIR sensor & Relay code

Hi guys,

Im currently successfully controlling a light with the motion module. The code used is simple.

code >
int irmotionPin = 4; // Pin of IR Motion Sensor
int relayPin = 8; // Pin of Relay Module

void setup(){
Serial.begin(9600);
pinMode(relayPin, OUTPUT); // Set Pin connected to Relay as an OUTPUT
digitalWrite(relayPin, LOW); // Set Pin to LOW to turn Relay OFF
}

void loop(){

while (digitalRead(irmotionPin) == HIGH) { // If Motion detected
digitalWrite(relayPin, HIGH); // Turn Relay ON
Serial.println("Relay is ON");
delay(500);
}

digitalWrite(relayPin, LOW); // Turn Relay OFF
Serial.println("Relay is OFF");
delay(500);
}

<

I have since found another piece of code for the PIR that might improve things ( from this site )

code >
/*

  • //////////////////////////////////////////////////
  • //making sense of the Parallax PIR sensor's output
  • //////////////////////////////////////////////////
  • Switches a LED according to the state of the sensors output pin.
  • Determines the beginning and end of continuous motion sequences.
  • @author: Kristian Gohlke / krigoo () gmail () com / http://krx.at
  • @date: 3. September 2006
  • kr1 (cleft) 2006
  • released under a creative commons "Attribution-NonCommercial-ShareAlike 2.0" license
  • Creative Commons — Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 2.0 Deutschland — CC BY-NC-SA 2.0 DE
  • The Parallax PIR Sensor is an easy to use digital infrared motion sensor module.
  • (http://www.parallax.com/detail.asp?product_id=555-28027)
  • The sensor's output pin goes to HIGH if motion is present.
  • However, even if motion is present it goes to LOW from time to time,
  • which might give the impression no motion is present.
  • This program deals with this issue by ignoring LOW-phases shorter than a given time,
  • assuming continuous motion is present during these phases.

*/

/////////////////////////////
//VARS
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 30;

//the time when the sensor outputs a low impulse
long unsigned int lowIn;

//the amount of milliseconds the sensor has to be low
//before we assume all motion has stopped
long unsigned int pause = 5000;

boolean lockLow = true;
boolean takeLowTime;

int pirPin = 3; //the digital pin connected to the PIR sensor's output
int ledPin = 13;

/////////////////////////////
//SETUP
void setup(){
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(pirPin, LOW);

//give the sensor some time to calibrate
Serial.print("calibrating sensor ");
for(int i = 0; i < calibrationTime; i++){
Serial.print(".");
delay(1000);
}
Serial.println(" done");
Serial.println("SENSOR ACTIVE");
delay(50);
}

////////////////////////////
//LOOP
void loop(){

if(digitalRead(pirPin) == HIGH){
digitalWrite(ledPin, HIGH); //the led visualizes the sensors output pin state
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made:
lockLow = false;
Serial.println("---");
Serial.print("motion detected at ");
Serial.print(millis()/1000);
Serial.println(" sec");
delay(50);
}
takeLowTime = true;
}

if(digitalRead(pirPin) == LOW){
digitalWrite(ledPin, LOW); //the led visualizes the sensors output pin state

if(takeLowTime){
lowIn = millis(); //save the time of the transition from high to LOW
takeLowTime = false; //make sure this is only done at the start of a LOW phase
}
//if the sensor is low for more than the given pause,
//we assume that no more motion is going to happen
if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after
//a new motion sequence has been detected
lockLow = true;
Serial.print("motion ended at "); //output
Serial.print((millis() - pause)/1000);
Serial.println(" sec");
delay(50);
}
}
}

<

Where and how do I add the relay code into the newer PIR code above? Some thing in the code I don''t need is the "int ledPin = 13"

Is it just a matter of tagging the relay trigger code after the motion code? Or at some point in between?

Thanks in advance.

the example lights ledPin versus yours that controls relayPin

change them and see what happens:

int pirPin = 4;    //the digital pin connected to the PIR sensor's output
int ledPin = 8;

Thanks Bulldog,

Im totally new to code, I just need to get more of an understanding on how to lay out the commands. Nothing like trial and error i spose.

I guess I make sure I match the "ïnt input/output pins at the very beginning of the code, then substituting the ledpin for relay open & close.

Thanks for the heads up. I'll give it a shot later.

Regards
RR

I guess I make sure I match the "ïnt input/output pins at the very beginning of the code, then substituting the ledpin for relay open & close.

Why not rename ledPin to relayPin, since what is connected will be a relay, not a LED? Why not change the value to the pin where the relay will be connected? Why not run the code and see what happens?

So I got this to work with the above suggestions. Thank you

I added the "Serial.println("Relay is ON") and OFF command at the end of the serial print commands and I can see the relay on and off activations. Please advise if this is the right line to add the command ?

A few more questions

Is there a way to get the serial print to constantly pole a message? so example would be "no detections" "or relay OFF"

Could I also initiate the sensor to calibrate once motion & relay are off ? would there be any benefit in doing this ?

And to confirm there is no code for the PIR to change sensitivity. There is only a trim pot adjustment?

Kind regards
Rod

Is there a way to get the serial print to constantly pole a message?

I seriously doubt it. On the other hand, I have no idea what you mean by "pole a message". A pole is something that you put a flag on. A poll, on the other hand, is something else entirely...

so example would be "no detections" "or relay OFF"

Personally, I prefer to see messages only when something changes. If you want to print "Nothing happened" on every pass through loop(), well, it's your code, so feel free.

Could I also initiate the sensor to calibrate once motion & relay are off ?

Which sensor do you want to calibrate?

And to confirm there is no code for the PIR to change sensitivity.

Sensitivity is built into the hardware, not the software.

PaulS:
I seriously doubt it.

In the code at the very top when viewing the serial monitor, the monitor shows a repeating message "relay off" until a change happens.

PaulS:
On the other hand, I have no idea what you mean by "pole a message". A pole is something that you put a flag on. A poll, on the other hand, is something else entirely...

I'm sure you do know...its just I'm not familiar with the language used. What I'm trying to explain is the serial monitor displaying or posting the changes in the I/O

PaulS:
Personally, I prefer to see messages only when something changes. If you want to print "Nothing happened" on every pass through loop(), well, it's your code, so feel free.

Well I could do that, but it doesn't really help what I'm trying to understand. So a pass through loop is my lesson.

Could someone provide an indication of how to repeat a message via serial monitor?

PaulS:
Which sensor do you want to calibrate?

The PIR motion sensor ? Which is the only sensor I'm referring to in the thread.

PaulS:
Sensitivity is built into the hardware, not the software.

Thankyou for confirming this.

Could someone provide an indication of how to repeat a message via serial monitor?

void loop()
{
   Serial.print("At the top of loop...");

   Serial.print("At the bottom of loop...");
}

Try that, and you'll see pretty quickly why that is a bad idea.

The PIR motion sensor ? Which is the only sensor I'm referring to in the thread.

There is nothing to calibrate. The sensor reports that it sees motion, or it doesn't. It's not like a sensor that is trying to determine the %-age of CO2 in the air, where it needs to be calibrated using a known sample of air.

Thankyou Paul,

Understood!

Regards
Rod