Arduino - 不使用 delay() 的 PIR 运动传感器代码

Arduino - PIR motion sensor code without using 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);
  }

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

你很接近。您只需要在某处设置 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。因为那会让你从那时开始计时。这将导致您每隔 interval 毫秒获得一个 "motion detected",因为您基本上是在每次打印时重新开始计时。