功能性:
利用红外传感器切换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);
}
答案 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/BlinkWithoutDelay和wiki。在状态机中,您可以定义一组状态(如no_object_detected, object_just_detected, object_detected_a_while_ago
),以及它们之间的转换(当它们发生时,以及它们发生时应该执行的操作)。