Want to change sampling rate of a PIR sensor

My goal is to use PIR motion sensor to light up a Neopixel strip and have them blink for 10 seconds. What I want to happen is:

  1. the serial monitor to print "Motion detected" once
  2. then the LED strip to flash for 10 seconds

What is currently happening is the serial monitor will print "Motion detected" and then blink the strip but then continue to print "Motion Detected" and repeat the blinking process over and over.

I have observed that when the motion sensor detects motion, it prints multiple lines of "Motion detected" very quickly as shown in the attached image below. What I think my code is doing is lighting up the strip between every time it prints in the serial monitor, causing it to never stop blinking.

Like I said before, I do not want the PIR sensor to output as many readings as it is. I just want it to detect motion, print once, then light up the LED strip and await until motion is detected again.

I am fairly new to programming in Arduino, so any help is welcomed.

Here is the code I have:

/ NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// Released under the GPLv3 license to match the rest of the
// Adafruit NeoPixel library

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
#define PIN        2 // On Trinket or Gemma, suggest changing this to 1

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 60 // Popular NeoPixel ring size

// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels

const int MOTION_PIN = 6;
int i = 0;


void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
  Serial.begin(9600);
  pinMode(MOTION_PIN, INPUT_PULLUP);
  pinMode(PIN, OUTPUT);

  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}

void loop() {

  pixels.clear(); // Set all pixel colors to 'off'
  pixels.show();

  int proximity = digitalRead(MOTION_PIN);

  if (proximity == LOW) {

    Serial.println("Motion Detected");
    while (i < 10) {
      i = i + 1;
      pixels.clear(); // Set all pixel colors to 'off'

      pixels.setPixelColor(0, pixels.Color(150, 0, 0));
      pixels.setPixelColor(1, pixels.Color(150, 0, 0));
      pixels.setPixelColor(2, pixels.Color(150, 0, 0));
      pixels.setPixelColor(3, pixels.Color(150, 0, 0));
      pixels.setPixelColor(4, pixels.Color(150, 0, 0));
      pixels.setPixelColor(5, pixels.Color(150, 0, 0));
      pixels.setPixelColor(6, pixels.Color(150, 0, 0));
      pixels.setPixelColor(7, pixels.Color(150, 0, 0));
      pixels.setPixelColor(8, pixels.Color(150, 0, 0));
      pixels.setPixelColor(9, pixels.Color(150, 0, 0));
      pixels.setPixelColor(10, pixels.Color(150, 0, 0));
      pixels.setPixelColor(11, pixels.Color(150, 0, 0));
      pixels.setPixelColor(12, pixels.Color(150, 0, 0));
      pixels.setPixelColor(13, pixels.Color(150, 0, 0));
      pixels.setPixelColor(14, pixels.Color(150, 0, 0));
      pixels.setPixelColor(15, pixels.Color(150, 0, 0));
      pixels.setPixelColor(16, pixels.Color(150, 0, 0));
      pixels.setPixelColor(17, pixels.Color(150, 0, 0));
      pixels.setPixelColor(18, pixels.Color(150, 0, 0));
      pixels.setPixelColor(19, pixels.Color(150, 0, 0));
      pixels.setPixelColor(20, pixels.Color(150, 0, 0));
      pixels.setPixelColor(21, pixels.Color(150, 0, 0));
      pixels.setPixelColor(22, pixels.Color(150, 0, 0));
      pixels.setPixelColor(23, pixels.Color(150, 0, 0));
      pixels.setPixelColor(24, pixels.Color(150, 0, 0));
      pixels.setPixelColor(25, pixels.Color(150, 0, 0));
      pixels.setPixelColor(26, pixels.Color(150, 0, 0));
      pixels.setPixelColor(27, pixels.Color(150, 0, 0));
      pixels.setPixelColor(28, pixels.Color(150, 0, 0));
      pixels.setPixelColor(29, pixels.Color(150, 0, 0));
      pixels.setPixelColor(30, pixels.Color(150, 0, 0));
      pixels.setPixelColor(31, pixels.Color(150, 0, 0));
      pixels.setPixelColor(32, pixels.Color(150, 0, 0));
      pixels.setPixelColor(33, pixels.Color(150, 0, 0));
      pixels.setPixelColor(34, pixels.Color(150, 0, 0));
      pixels.setPixelColor(35, pixels.Color(150, 0, 0));
      pixels.setPixelColor(36, pixels.Color(150, 0, 0));
      pixels.setPixelColor(37, pixels.Color(150, 0, 0));
      pixels.setPixelColor(38, pixels.Color(150, 0, 0));
      pixels.setPixelColor(39, pixels.Color(150, 0, 0));
      pixels.setPixelColor(40, pixels.Color(150, 0, 0));
      pixels.setPixelColor(41, pixels.Color(150, 0, 0));
      pixels.setPixelColor(42, pixels.Color(150, 0, 0));
      pixels.setPixelColor(43, pixels.Color(150, 0, 0));
      pixels.setPixelColor(44, pixels.Color(150, 0, 0));
      pixels.setPixelColor(45, pixels.Color(150, 0, 0));
      pixels.setPixelColor(46, pixels.Color(150, 0, 0));
      pixels.setPixelColor(47, pixels.Color(150, 0, 0));
      pixels.setPixelColor(48, pixels.Color(150, 0, 0));
      pixels.setPixelColor(49, pixels.Color(150, 0, 0));
      pixels.setPixelColor(50, pixels.Color(150, 0, 0));
      pixels.setPixelColor(51, pixels.Color(150, 0, 0));
      pixels.setPixelColor(52, pixels.Color(150, 0, 0));
      pixels.setPixelColor(53, pixels.Color(150, 0, 0));
      pixels.setPixelColor(54, pixels.Color(150, 0, 0));
      pixels.setPixelColor(55, pixels.Color(150, 0, 0));
      pixels.setPixelColor(56, pixels.Color(150, 0, 0));
      pixels.setPixelColor(57, pixels.Color(150, 0, 0));
      pixels.setPixelColor(58, pixels.Color(150, 0, 0));
      pixels.setPixelColor(59, pixels.Color(150, 0, 0));



      pixels.show();   // Send the updated pixel colors to the hardware.

      delay(1000); // Pause before next pass through loop

      pixels.setPixelColor(0, pixels.Color(0, 0, 0));
      pixels.setPixelColor(1, pixels.Color(0, 0, 0));
      pixels.setPixelColor(2, pixels.Color(0, 0, 0));
      pixels.setPixelColor(3, pixels.Color(0, 0, 0));
      pixels.setPixelColor(4, pixels.Color(0, 0, 0));
      pixels.setPixelColor(5, pixels.Color(0, 0, 0));
      pixels.setPixelColor(6, pixels.Color(0, 0, 0));
      pixels.setPixelColor(7, pixels.Color(0, 0, 0));
      pixels.setPixelColor(8, pixels.Color(0, 0, 0));
      pixels.setPixelColor(9, pixels.Color(0, 0, 0));
      pixels.setPixelColor(10, pixels.Color(0, 0, 0));
      pixels.setPixelColor(11, pixels.Color(0, 0, 0));
      pixels.setPixelColor(12, pixels.Color(0, 0, 0));
      pixels.setPixelColor(13, pixels.Color(0, 0, 0));
      pixels.setPixelColor(14, pixels.Color(0, 0, 0));
      pixels.setPixelColor(15, pixels.Color(0, 0, 0));
      pixels.setPixelColor(16, pixels.Color(0, 0, 0));
      pixels.setPixelColor(17, pixels.Color(0, 0, 0));
      pixels.setPixelColor(18, pixels.Color(0, 0, 0));
      pixels.setPixelColor(19, pixels.Color(0, 0, 0));
      pixels.setPixelColor(20, pixels.Color(0, 0, 0));
      pixels.setPixelColor(21, pixels.Color(0, 0, 0));
      pixels.setPixelColor(22, pixels.Color(0, 0, 0));
      pixels.setPixelColor(23, pixels.Color(0, 0, 0));
      pixels.setPixelColor(24, pixels.Color(0, 0, 0));
      pixels.setPixelColor(25, pixels.Color(0, 0, 0));
      pixels.setPixelColor(26, pixels.Color(0, 0, 0));
      pixels.setPixelColor(27, pixels.Color(0, 0, 0));
      pixels.setPixelColor(28, pixels.Color(0, 0, 0));
      pixels.setPixelColor(29, pixels.Color(0, 0, 0));
      pixels.setPixelColor(30, pixels.Color(0, 0, 0));
      pixels.setPixelColor(31, pixels.Color(0, 0, 0));
      pixels.setPixelColor(32, pixels.Color(0, 0, 0));
      pixels.setPixelColor(33, pixels.Color(0, 0, 0));
      pixels.setPixelColor(34, pixels.Color(0, 0, 0));
      pixels.setPixelColor(35, pixels.Color(0, 0, 0));
      pixels.setPixelColor(36, pixels.Color(0, 0, 0));
      pixels.setPixelColor(37, pixels.Color(0, 0, 0));
      pixels.setPixelColor(38, pixels.Color(0, 0, 0));
      pixels.setPixelColor(39, pixels.Color(0, 0, 0));
      pixels.setPixelColor(40, pixels.Color(0, 0, 0));
      pixels.setPixelColor(41, pixels.Color(0, 0, 0));
      pixels.setPixelColor(42, pixels.Color(0, 0, 0));
      pixels.setPixelColor(43, pixels.Color(0, 0, 0));
      pixels.setPixelColor(44, pixels.Color(0, 0, 0));
      pixels.setPixelColor(45, pixels.Color(0, 0, 0));
      pixels.setPixelColor(46, pixels.Color(0, 0, 0));
      pixels.setPixelColor(47, pixels.Color(0, 0, 0));
      pixels.setPixelColor(48, pixels.Color(0, 0, 0));
      pixels.setPixelColor(49, pixels.Color(0, 0, 0));
      pixels.setPixelColor(50, pixels.Color(0, 0, 0));
      pixels.setPixelColor(51, pixels.Color(0, 0, 0));
      pixels.setPixelColor(52, pixels.Color(0, 0, 0));
      pixels.setPixelColor(53, pixels.Color(0, 0, 0));
      pixels.setPixelColor(54, pixels.Color(0, 0, 0));
      pixels.setPixelColor(55, pixels.Color(0, 0, 0));
      pixels.setPixelColor(56, pixels.Color(0, 0, 0));
      pixels.setPixelColor(57, pixels.Color(0, 0, 0));
      pixels.setPixelColor(58, pixels.Color(0, 0, 0));
      pixels.setPixelColor(59, pixels.Color(0, 0, 0));

      pixels.show();   // Send the updated pixel colors to the hardware.
      delay(1000); //
    }
    if (i = 10) {
      i = 0;
    }
  }

  else {

    pixels.clear();
    pixels.show();

  }

}

Preformatted text

Welcome to the forum

Please follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'

Use [color = red]code tags[/color] (the </> icon above the compose window) to make it easier to read and copy for examination

A couple of comments

  1. Do some research into for loops and your code will get much shorter

  2. What is the difference between

pixels.clear(); // Set all pixel colors to 'off'
pixels.show();

and turning off each pixel individually with 60 lines of code ?

1 Like

The stock answer for your problem is to detect a pin change, not just a pin state.
Study the "StateChangeDetection" example in the IDE (Examples > 02.Digital).
Leo..

Okay thanks, I am pretty sure there is no difference between them so I will see if that works

I didn't see any hardware mentioned in your post, so I assume an Uno and a HC-SR501.
Trigger interval depends on the setting of the "time" pot on the sensor.
But you still must tell the code to not do anything until the next trigger event.
Leo..

Yes, I am using an Arduino Uno and the PIR sensor that I am using is not the HC-SR501 as it does not have adjustable pots on the back.

How would you advise I tell the code to not do anything until the next trigger event? With sensor I have, when it triggers it outputs over 120 responses within 3 seconds. And after every response it lights up the LED for 10 seconds so the LED's never stop blinking.

You need to detect when the sensorbecomes triggered rather than when it is triggered

See the StateChangeDetection example in the IDE

1 Like

Alright thanks, I will look into this

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.