Arduino - код датчика движения PIR без использования delay ()

У меня установлена ​​Arduino с несколькими датчиками, печатающими на последовательный порт. Изначально у меня был датчик PIR с несколькими встроенными задержками, чтобы он не спамил сообщение об обнаружении движения. Однако функция delay (), конечно же, приостанавливает весь код и мешает другим датчикам.

Что я хочу сделать:

1) Когда датчик движения находится в высоком состоянии в течение x времени, распечатайте ОДНО сообщение на серийный номер.

2) Вставьте здесь короткий промежуток времени, когда он не обнаруживает движения

3) Если датчик движения высокий в течение времени ‹x, он ничего не делает.

Общая идея состоит в том, чтобы использовать программное обеспечение также для минимизации ложных срабатываний. Я пытался использовать функцию millis () для управления им, но без особого успеха. Вероятно, это действительно простое решение, и я его просто не вижу.

void loop() {

  // Get value from motion sensor
  pirValue = digitalRead(pirPin);  //detectedPin
  // See if motion Detected
  unsigned long currentMillis = millis();

  if (pirValue == 1 && (currentMillis - previousMillis >= interval) ){
    previousMillis = millis();

    // Display Triggered LED for 3 seconds
    digitalWrite(detectedLED, HIGH);
    motionDetected = 1;
    Serial.println("motion detected");
    //delay(3000);

  } else {
    digitalWrite(detectedLED, LOW);
  }

Я знаю, что это абсолютно неправильно, так как я думаю, что способ, которым он установлен сейчас, в цикл никогда не войдет. Я пробовал несколько других структур, но не вижу, что мне нужно делать. Это ситуация, когда мне нужно по существу построить конечный автомат? Любая помощь в осмыслении этого будет оценена!


person BonnieG    schedule 29.04.2020    source источник


Ответы (1)


Вы близки. Вам просто нужно где-то установить previousMillis. Итак, какова отправная точка вашего времени? Это когда датчик PIR впервые обнаруживает движение. Правильно? Или, другими словами, вы хотите отследить время, когда в последний раз не было обнаружено движение. Так что просто добавьте строку, чтобы, если PIR не видит никакого движения, он устанавливает для previousMillis значение millis (). Таким образом, всякий раз, когда он улавливает движение, previousMillis будет последний раз, когда его не было.

void loop() {

  // Get value from motion sensor
  pirValue = digitalRead(pirPin);  //detectedPin
  // See if motion Detected
  unsigned long currentMillis = millis();
  if (pirValue == LOW) {
    previousMillis = millis();
  }

  if (pirValue == HIGH && (currentMillis - previousMillis >= interval) ){

    // Display Triggered LED for 3 seconds
    digitalWrite(detectedLED, HIGH);
    motionDetected = 1;
    Serial.println("motion detected");
    //delay(3000);

  } else {
    digitalWrite(detectedLED, LOW);
  }

Вы не хотите устанавливать previousMillis там, где он есть сейчас. Потому что с этого момента вы начнете отсчет времени. Это приведет к тому, что вы будете получать «обнаружение движения» через каждые миллисекунды интервала, поскольку вы в основном начинаете отсчет времени каждый раз, когда печатаете это.

person Delta_G    schedule 29.04.2020
comment
Большое спасибо! Думаю, теперь у меня это почти получилось. Просто нужно поработать это с остальной частью кода для других моих датчиков, и я буду в порядке. - person BonnieG; 30.04.2020