2016-09-20 71 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