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

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

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

01int led = 13;
02int sensor = 11;
03 
04void setup() {               
05  pinMode(led, OUTPUT);
06  pinMode(sensor, INPUT);
07}
08 
09void loop() {
10  if (digitalRead(sensor) == 1) {
11    digitalWrite(led, 1);
12  }
13  else {
14    digitalWrite(led, 0);
15  }
16}

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

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

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

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

01// led_enable - зажигание led разрешено
02// led_on - led горит
03  if (!led_on&&led_enable&&(digitalRead(sensor) == 1)) {
04        digitalWrite(led, 1);
05        led_on=true; time_mark=millis();
06      }
07 else if (led_on&&(millis()-time_mark>1000)) { // 1000 = 1 сек
08    digitalWrite(led, 0); led_on=false; led_enable=false;}
09 else if (!led_enable&&(digitalRead(sensor) == 0)){
10        led_enable=true;
11      }

 

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

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

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