программная задержка для PIR HC-SR501

bwd
Offline
Зарегистрирован: 10.11.2013

Привет, не могу сообразить как можно программно уменьшить задержку включения диода после появления движения. Минимальная задержка после срабатывания сенсора - 2-3 секунды, все это время диод горит.

int led = 13;
int sensor = 11;

void setup() {                
  pinMode(led, OUTPUT);
  pinMode(sensor, INPUT);
}

void loop() {
  if (digitalRead(sensor) == 1) {
    digitalWrite(led, 1);
  } 
  else {
    digitalWrite(led, 0);
  }
}

Как можно погасить диод раньше? Буду признателен за любые ответы, спасибо.

vdk
Offline
Зарегистрирован: 14.04.2013

Резисторы на плате покрутить? (если я правильно помню, один настраивает дальность, а другой - время удержания)

bwd
Offline
Зарегистрирован: 10.11.2013

Уже подкручены на минимум.

Araris
Offline
Зарегистрирован: 09.11.2012

Да, есть такое неудобство, сталкивался. Про задержки до и после срабатывания HC-SR501 неплохо написано в его даташите (http://elecfreaks.com/store/download/datasheet/sensor/DYP-ME003/Specification.pdf).

 

bwd
Offline
Зарегистрирован: 10.11.2013

Даташит я читал. Скажем так, я готов смириться с тем, что по факту, в сумме всех задержек, выходит, что минимальное значение, после которого диод загорится второй раз - порядка 5-6 секунд. Но меня интересует немного другое: как погасить диод раньше, например через секунду после срабатывания сенсора?

Нужен аналог millis(), только чтобы он считал время не с начала работы программы, а с начала срабатывания сенсора.

vdk
Offline
Зарегистрирован: 14.04.2013

Это вам в теорию автоматов, отслеживать разные состояния

Навскидку получается так (не тестировал, могут быть ошибки (в том числе и логические)):

// led_enable - зажигание led разрешено
// led_on - led горит
  if (!led_on&&led_enable&&(digitalRead(sensor) == 1)) {
	    digitalWrite(led, 1);
	    led_on=true; time_mark=millis();
	  }
 else if (led_on&&(millis()-time_mark>1000)) { // 1000 = 1 сек
	digitalWrite(led, 0); led_on=false; led_enable=false;}
 else if (!led_enable&&(digitalRead(sensor) == 0)){
	    led_enable=true;
	  }

 

bwd
Offline
Зарегистрирован: 10.11.2013

Да нет, все верно. Работает именно так, как и необходимо.

Спасибо большое за помощь!