Задержка времени 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);
}
Спасибо!
@user3201500, 👍0
Обсуждение1 ответ
Лучший ответ:
Вам действительно не нужна библиотека 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
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- Разница между этими двумя платами NodeMCU?
- NodeMCU - использовать кнопку flash в качестве входного сигнала в loop()
- Как определить размер Flash?
- Как изменить имя модуля ESP8266-12E по умолчанию
- Простой запрос GET с ESP8266HTTPClient
- В ESP-12E NodeMCU, какой выход PIN A0?
Почему вы чувствуете необходимость использовать библиотеку Ticker? В этом нет абсолютно никакой необходимости. Все, что вам нужно, это временная метка
millis()
., @MajenkoХорошо, но я никогда раньше не использовал millis(). Как это работает, я просто проверю. Если у вас есть пример, основанный на тех же сценариях, это будет потрясающе., @user3201500
Пока мы говорим, я пишу для вас., @Majenko