延迟后,Arduino电机风扇不会从高电平切换到低电平

时间:2016-11-22 04:22:56

标签: arduino delay arduino-uno

功能性:

利用红外传感器切换LED灯和motorFAN的状态。因此,当满足触发距离条件时,LED灯和motorFAN状态都将从LOW切换到HIGH。在延迟5秒后,只要满足触发距离条件,motorFAN状态将从HIGH切换到LOW,而LED灯的状态将保持为HIGH。当不再满足触发距离时,LED灯将切换到LOW。

问题:

当满足触发距离条件时,LED灯和motorFAN状态都将从LOW切换到HIGH。

但是,在延迟5秒后,motorFan状态不会从HIGH切换到LOW,它仍然会保持高电平。

第二个问题,当不再满足触发距离条件时,LED灯和motorFan状态都从HIGH切换到LOW。当再次满足条件时,只有LED灯从LOW切换到HIGH,但电机风扇状态没有切换并保持在LOW状态。

因此,需要寻求帮助来纠正问题以及做错了什么。 感谢。

代码:

const int signalPin = 1; //wire pin to analog for IR Sensor 
//Motor-Fan connected to arduino pin number
//const  int FanPin = 5;

//Motor-Fan Relay
byte FanRelay = 4;
//const int FanRelay = 4;
//Light Relay
byte LightRelay = 6;
//const int LightRelay = 5;
int IRSignal; //variable signal, will hold the analog value read by Arduino


long duration;
int distance;
unsigned long Timer;
unsigned long Interval = 10000; //teh repeat Interval
unsigned long SmellInterval = 10000;

void setup() 
{
  //Execute only once at startup 

  //pinMode (FanPin , OUTPUT) ; // Set pinMode for FanPin as OUTPUT, display  
  pinMode (signalPin, INPUT);  //infared sensor line will be an input to the   Arduino
  pinMode(FanRelay, OUTPUT);
  pinMode(LightRelay, OUTPUT);
  Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor
}

void loop() 
{

  //execute multiple times in a loop

  IRSignal = analogRead(signalPin); //arduino reads the value from the infared sensor
  distance = 9462 / (IRSignal -16.92);
  Serial.println(distance);
  if(distance < 30 && distance > 0)
  {
    Timer = millis(); 
    // Write a pin of HIGH
    Serial.println("1");

    digitalWrite (FanRelay, HIGH);
    digitalWrite (LightRelay, HIGH);

    if (Timer > SmellInterval){
      //digitalWrite (FanPin, LOW);
      digitalWrite (FanRelay, LOW);
    }
  }
  else
  {
    Serial.println("0");
    //Check if Timer is longer than 10s

    if ((millis()-Timer)>Interval){
      //digitalWrite (FanPin, LOW);
      //digitalWrite (FanRelay, LOW);
      digitalWrite (LightRelay, LOW);
    }
  }
  delay(1000);
}

1 个答案:

答案 0 :(得分:0)

问题在于:

Timer = millis(); 
....
if (Timer > SmellInterval){
  //digitalWrite (FanPin, LOW);
  digitalWrite (FanRelay, LOW);
}

Timer变量将保持当前值millis(),即上次重置时的系统时间。这意味着,if条件将始终在运行程序10秒后得到满足。

这就是为什么FanRelay在你的条件第二次满足时保持低的原因 - 足够的时间到期,所以在它开启后立即关闭。

延迟后关闭也不起作用(顺便说一句,你的延迟都是10秒,而不是你在帖子中提到的5秒)。您需要仅在第一次满足距离条件时保存时间并检查该时刻的时差。

有关类似示例,请参阅RegEx match open tags except XHTML self-contained tags。如果您使用状态机概念,您的设计将更易读并且易于调试。有些阅读https://www.arduino.cc/en/Tutorial/BlinkWithoutDelaywiki。在状态机中,您可以定义一组状态(如no_object_detected, object_just_detected, object_detected_a_while_ago),以及它们之间的转换(当它们发生时,以及它们发生时应该执行的操作)。