Arduino - 无需使用延迟()的PIR运动传感器代码

问题描述 投票:0回答:1

我有一个Arduino设置与多个传感器打印到串行端口。最初,我让PIR传感器实现了几个内置的延迟,这样它就不会发送运动检测信息。 然而,延迟()函数当然会暂停整个代码,并干扰其他传感器。

我想做的是

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

我知道这是绝对错误的,因为我认为现在的设置方式永远不会进入循环。 我已经尝试了其他几种结构,但我没有看到我需要做什么。 这种情况下,我是否需要构造一个状态机的本质?如果有任何帮助思考的地方,我将感激不尽!

c arduino motion infrared sensors
1个回答
0
投票

你很接近了。你只需要在某个地方设置 previousMillis。那么,你的定时的起始点是什么?就是当PIR传感器第一次检测到运动时。对吧?或者换一种方式,你想从上次它没有检测到运动的时候开始计时。所以只需添加一行,如果PIR没有看到任何运动,那么它就会将previousMillis设置为毫秒()。这样一来,每当它检测到运动时,foreverMillis就会有上次没有检测到运动的时间。

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 设置在你现在的位置。因为这将使你从那个点开始计时。这将导致你每隔一毫秒就得到一个 "检测到运动",因为你每次打印的时候基本上都是重新开始计时。

© www.soinside.com 2019 - 2024. All rights reserved.