2016-09-20 49 views
0

功能:已切换LED和MotorFan国家无法延迟之后切换回

用户接近超声/红外传感器连接到Arduino的乌诺,如果接近距离小于20cm,的超声triggerPin /红外传感器将从低电平切换到高电平 - > 0列表将切换到'1列表。

当超声波/红外传感器从“0”切换到“1”时,状态LED和状态MotorFan将从低电平切换到高电平。只要超声波传感器的返回数据为'1',两种状态都将保持不变。

当用户离开超声波/红外传感器的距离时,超声波/红外传感器的触发脉冲将从高电平切换到低电平 - > 1列表将被切换到0列表。

但是,此时,状态LED和状态MotorFan将保持在高电平状态10秒,然后切换到低电平状态。如果另一个用户靠近接近传感器并且超声波/红外传感器在10s的延迟内切换回'1',则状态LED和状态MotorFan应保持在高电平状态而不切换。

因此,正确的流量如下:

超声/红外传感器返回“0' - >但是,当感测用户(距离< 20)超声/红外传感器内切换为” 1'的超声波时/红外传感器切换到1,MotorFan状态和LED状态将从LOW超声波/红外切换到HIGH传感器返回1时感测接近度 - >但当感测用户更多(距离> 20)超声波/红外线传感器切换为0,此时,MotorFan状态和LED状态将保持在高电平状态10秒钟,然后切换至低电平。条件:当另一个用户在延迟10s之前接近时,MotorFan状态和LED状态将保持高电平状态。

我所做:

我已经分配了以下数字引脚以下vairable:

超声波传感器的trigPin是数字引脚8的超声波传感器的echoPin是数字引脚9返聘电机风扇是数字引脚5 LED分配给继电器4.

其次,我试图利用millis()来获得时间,如果它应该超过10000的限制,它将数字写入两个状态到LOW从高。

代码: const int的trigPin = 8; const int echoPin = 9; //电机风扇连接到arduino针脚号 const int FanPin = 5; 字节中继= 4;

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

void setup() { 
    Timer = millis(); 
    pinMode(FanPin, OUTPUT); // Set pinMode for FanPin as OUTPUT, display 
    pinMode(trigPin, OUTPUT); 
    pinMode(relay, OUTPUT); 
    pinMode(echoPin, INPUT); 
    Serial.begin(9600); // Open serial port to communicate with the Ultrasaonic Sensor 
} 

void loop() { 

    digitalWrite(trigPin, LOW); 
    delayMicroseconds(2); 

    digitalWrite(trigPin, HIGH); 
    delayMicroseconds(10); 
    digitalWrite(trigPin, LOW); 

    duration = pulseIn(echoPin, HIGH); 

    distance = duration * 0.034/2; 

    if (distance < 20) { 
    // Write a pin of HIGH 
    Serial.println("1"); 
    //Set motor-fan to operate 
    digitalWrite(FanPin, HIGH); 
    digitalWrite(relay, HIGH); 
    } else { 

    Serial.println("0"); 
    //Check if Timer is longer than 10s 

    if ((millis() - Timer) > Interval) { 
     digitalWrite(FanPin, LOW); 
     digitalWrite(relay, LOW); 
    } 

    } 
    delay(100); 
} 

问题:

所述传感器是能够从“0”切换到“1”时读出的接近,其次,它也能够切换两个LED状态和motorFan状态从低到高。

然而,无论是LED状态和motorFan切换回低时,从高分到低分的Arduino传感器切换,无需等待10秒延迟

我想索取这方面的一些援助,我完全卡住在这个问题上。

感谢

+0

0)您将在设置阶段获取startTime(timer)的值。 (1)你的间隔设置为1000,即1千毫秒 - 一秒。 (2)您可能希望重新触发10秒延迟。如果是这样,每次最后的差值超过10,000时(即,在您的代码的最后一个if块中执行),获取计时器的新值。 – enhzflep

+0

@enhzflep,我已编辑,但没有得到结果 – Luke

+0

@enhzflep so你是什​​么意思?因为我编辑并更改了间隔变量为10000,并且它仍然没有显示正确的行为 – Luke

回答

0

您在setup()功能,这意味着你做它只有一次,在系统启动时将值分配给Timer。我会移动Timer = millis();if (distance < 20) {的条件。然后,如果用户移动了感应距离,您已经有了“最后一次接触”的时间。请记住:如果您想在启动时执行某些操作,请将它放入setup()。如果你想要重复执行某些东西 - 将其放入loop()

+0

所以我把'Timer = millis()'放在'if(distance <20){'condition is to设置最后一次感应动作的接触时间,是吗? – Luke

+0

@Luke是的。它的范围内,'定时器'将不断更新。当您超出范围时,更新停止,并且您可以从最后一次联系中测量10秒。 – mactro

+0

好吧,谢谢你指出我。 – Luke