为什么第二个 PIR 传感器总是高电平?

Why 2nd PIR sensor is always HIGH?

我从串行监视器上的 'inputPintwo' 得到一个常量 HIGH。当 'inputPin' 变为高电平时,继电器被触发并正常工作,因为 'inputPintwo' 也处于高电平(一直)。

我的设置非常类似于:2 PIR motion sensors +Arduino

我没有像上面回答的问题那样使用引脚 0 或 1。我已经用另一个传感器更换了传感器,以防硬件损坏。我还拔下了传感器,它仍然显示为高电平。跳线在两个传感器上重新触发。

    int ledPin = 13;
    int inputPin = 2;
    int inputPintwo = 4;
    int pirState = LOW;
    int val = 0;
    int valtwo = 0;
    #define RELAY1  7

    void setup() {
      pinMode(ledPin, OUTPUT);
      pinMode(inputPin, INPUT);
      pinMode(inputPintwo, INPUT);
      pinMode(RELAY1, OUTPUT);
      Serial.begin(9600);
    }

    void loop(){
      val = digitalRead(inputPin);
      valtwo = digitalRead(inputPintwo);

      if (val == HIGH && valtwo == HIGH) {
        digitalWrite(ledPin, HIGH);
        if (pirState == LOW) {
          Serial.println("Motion detected!");
          pirState = HIGH;
          Serial.println("Light ON");
          digitalWrite(RELAY1,1);
          delay(500);
          digitalWrite(RELAY1,0);
          delay(500);
          digitalWrite(RELAY1,1);
          delay(500);
          digitalWrite(RELAY1,0);
          delay(500);
          digitalWrite(RELAY1,1);
          }
        }
      else {
        digitalWrite(ledPin, LOW);
        if (pirState == HIGH){
          Serial.println("Motion ended!");
          digitalWrite(RELAY1,0);
          pirState = LOW;
          Serial.println("Light OFF");

        }
      }
    }

我希望两个传感器仅在检测到运动时才变为高电平,这将导致继电器打开和关闭几次,然后保持打开状态,直到传感器上的计时器用完。

要确定问题,我建议您从检查硬件开始。您将需要 voltmeter/multimeter.

  1. 仔细检查您是否正确连接了传感器(检查数据表)。你没有忘记连接吗?下拉电阻?
  2. 检查传感器上的电源电压——电压是否在 制造商规格?
  3. 如果您使用的是面包板,请检查连接。
  4. 检查传感器输出行为(电压),是否有运动。电压是否恒定?恒定电压意味着 PIR 传感器工作不正常。在执行此测试之前,断开 Arduino 输入的输出。

如果一切正常或者您没有电压表,请尝试断开 PIR 传感器并在 Arduino 引脚 4 和地之间连接一根电线。 digitalRead(inputPintwo) return 低吗?如果是,您知道读取引脚状态工作正常。


下面请查看与您的代码相关的一些建议:

  • 使用#define 指令或static const int 变量类型来定义Arduino 引脚,就像您使用继电器输出引脚RELAY1 一样。

示例:

#define LED_PIN 13
#define INPUT_PIN 2
#define INPUT_PINTWO 4

static const int ledPin = 13;
static const int inputPin = 2;
static const int inputPintwo = 4;
  • 在您的情况下,如果您只对数字值感兴趣 (LOW/HIGH),请在输入引脚上使用内置上拉电阻。因此日志。浮动输入引脚上的电压电平被定义为(高电平)。如果不使用上拉电阻,电压既可以对数。 0(低)或日志。 1(高),什么会导致奇怪的 program/state 机器行为

要激活输入引脚中的上拉电阻,请使用

pinMode(inputPin, INPUT_PULLUP);
pinMode(inputPintwo, INPUT_PULLUP);