Задержка времени PIR-датчика SR505 с использованием библиотеки тикеров NodeMCU

Я пытаюсь сделать значение PIR-датчика ВЫСОКИМ в течение определенного времени с помощью кода. SR505 имеет задержку по умолчанию 8 секунд. Но я хочу увеличить его до 20 секунд.

Я подумываю увеличить его с помощью библиотеки TICKER. Я попробовал и протестировал базовый код и, похоже, работает нормально. Но я хочу реализовать это с помощью Ticker, который будет поддерживать ВЫСОКОЕ значение в течение 20 секунд, как только таймер превысит 20 секунд и PIR не обнаружит движение, тогда он снова установит таймер на 0.

Вот как выглядит мой код:

#include <Ticker.h>

#define SIGNAL_PIN D2

Ticker flipper;

void setup()
{
  Serial.begin(9600);
  pinMode(SIGNAL_PIN, INPUT);
  digitalWrite (SIGNAL_PIN, LOW);


}

void flip(){
  Serial.println("From callback");
  digitalWrite (SIGNAL_PIN, HIGH);
}


void loop() {
  if(digitalRead(SIGNAL_PIN)==HIGH) {
    Serial.println("Movement detected.");
    flipper.attach(1, flip);
  } else {
    Serial.println("Did not detect movement.");
    flipper.detach();
  }
  delay(1000);
}

Спасибо!

, 👍0

Обсуждение

Почему вы чувствуете необходимость использовать библиотеку Ticker? В этом нет абсолютно никакой необходимости. Все, что вам нужно, это временная метка millis()., @Majenko

Хорошо, но я никогда раньше не использовал millis(). Как это работает, я просто проверю. Если у вас есть пример, основанный на тех же сценариях, это будет потрясающе., @user3201500

Пока мы говорим, я пишу для вас., @Majenko


1 ответ


Лучший ответ:

0

Вам действительно не нужна библиотека Ticker. Просто сохраните временную метку, когда в последний раз PIR был ВЫСОКИМ:

void loop() {
    static uint32_t lastSeenHigh = millis();
    static bool pirState = false;

    // Если он активен, запишите этот факт вместе со временем
    if (digitalRead(SIGNAL_PIN) == HIGH) {
        lastSeenHigh = millis();
        pirState = true;
    } else {
        // в противном случае, если с момента последнего посещения прошло 12 секунд
        // активен, записываем, что он неактивен.
        // 20 секунд минус 8 секунд активного времени, умноженное на 1000
        // 12000 миллисекунд, чтобы продлить время на
        if ((millis() - lastSeenHigh) > 12000) {
            pirState = false;
        }
    }

    if (pirState == true) {
        // Делайте здесь все, что хотите, когда PIR активен
    }
}

С этим (непроверенным) кодом:

  • Каждый раз, когда PIR активен, записывается текущее время и состояние устанавливается как истинное.
  • Когда PIR НИЗКИЙ и с момента последней активации прошло не менее 12 секунд, установите состояние на false.
,

Огромное спасибо, это потрясающе, работает отлично! Никакая библиотека не нужна., @user3201500