Arduino - код датчика движения PIR без использования задержки () - PullRequest
0 голосов
/ 30 апреля 2020

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

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

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

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

3) Если датчик движения высок в течение времени

Общая идея заключается в том, чтобы использовать программное обеспечение для минимизации ложных срабатываний. Я пытался использовать функцию 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);
  }

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

1 Ответ

0 голосов
/ 30 апреля 2020

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

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);
  }

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

...