0
\$\begingroup\$

I am tying to implement something using PIR sensor and Arduino UNO. I did the wiring like this

VCC - 5v
GND - GND
Dout - Pin 3

Here is my code

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)
  {
    Serial.println("Detected motion");
    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);
    }
  }
}

But after calibration its not at all showing its detects some motion when there are many. I tried more sensitivity by turning the right potentiometer all towards right (Clockwise). Still nothing detected.

Then I tried removing the White cover of sensor and it detected some motion only when I touched the sensor.

I tried with another sensor, it works the same. It detect some movement only when I touched it.

What should be wrong?? Both sensors are damaged?? enter image description here

\$\endgroup\$
5
  • \$\begingroup\$ learn.adafruit.com/pir-passive-infrared-proximity-motion-sensor/… This article give a good overview of testing PIR sensors. \$\endgroup\$
    – EarthLord
    Dec 14, 2020 at 10:24
  • \$\begingroup\$ One way to get more insight is to make the Arduino LED shine when the DOUT of PIR is high in loop(). This way you can see how the sensor is behaving and can calibrate it with the two variable resistance knobs. \$\endgroup\$
    – EarthLord
    Dec 14, 2020 at 10:26
  • \$\begingroup\$ @EarthLord I am already reading the pin in Loop. Sorry if I wrongly misinterpreted.. \$\endgroup\$ Dec 14, 2020 at 11:29
  • 1
    \$\begingroup\$ I meant your loop can be as simple as shown below so that you can see exactly what's happening with PIR sensor and can isolate the issue void loop() { digitalWrite(ledPin, digitalRead(pirPin)); } \$\endgroup\$
    – EarthLord
    Dec 14, 2020 at 12:20
  • 1
    \$\begingroup\$ As an addition: keep the cover on; it is a lens, or rather a set of lenses, to focus the infrared energy onto the sensor. \$\endgroup\$
    – ocrdu
    Dec 14, 2020 at 16:31

1 Answer 1

1
\$\begingroup\$

You have provided Arduino code, but if your problem is with the sensor (as you seem to be asking in the question) then that code is just a distraction.

So apply one of the standard troubleshooting techniques: Split the system into parts, and investigate the signal(s) between those sections.

In your case, you can easily investigate just the sensor's behaviour using a DMM or scope etc. (or even a small, high-efficiency red LED with a series 220 ohm resistor to 0V, in my experience) to visualise and understand its output signal with different stimuli (no Arduino connected for this testing).

  • Is the sensor's output correct, when not connected to the Arduino?
    • No - then investigate the sensor and how you are using it. Ignore the Arduino code for now.
    • Yes - then stop worrying about the sensor, as you described in the question. It's time to debug your Arduino code.
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.