программная задержка для PIR HC-SR501
- Войдите на сайт для отправки комментариев
Вс, 10/11/2013 - 22:41
Привет, не могу сообразить как можно программно уменьшить задержку включения диода после появления движения. Минимальная задержка после срабатывания сенсора - 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);
}
}
Как можно погасить диод раньше? Буду признателен за любые ответы, спасибо.
Резисторы на плате покрутить? (если я правильно помню, один настраивает дальность, а другой - время удержания)
Уже подкручены на минимум.
Да, есть такое неудобство, сталкивался. Про задержки до и после срабатывания HC-SR501 неплохо написано в его даташите (http://elecfreaks.com/store/download/datasheet/sensor/DYP-ME003/Specification.pdf).
Даташит я читал. Скажем так, я готов смириться с тем, что по факту, в сумме всех задержек, выходит, что минимальное значение, после которого диод загорится второй раз - порядка 5-6 секунд. Но меня интересует немного другое: как погасить диод раньше, например через секунду после срабатывания сенсора?
Нужен аналог millis(), только чтобы он считал время не с начала работы программы, а с начала срабатывания сенсора.
Это вам в теорию автоматов, отслеживать разные состояния
Навскидку получается так (не тестировал, могут быть ошибки (в том числе и логические)):
// 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; }Да нет, все верно. Работает именно так, как и необходимо.
Спасибо большое за помощь!