2017-05-07 95 views
2

我需要使LED閃爍僅100毫秒,循環中的延遲功能使我的代碼非常無響應。用millis替換延遲

if (readString.indexOf("?23") >0){ 
    digitalWrite(23, LOW); 
    delay(100); 
    digitalWrite(23, HIGH); 
} 

有一個簡單的方法與millis更換delay只有一次閃爍?我試過這個,但不起作用

unsigned long interval1=1000; // the time we need to wait 
unsigned long previousMillis1=0; // millis() returns an unsigned long. 

if (readString.indexOf("?22") >0){ 
    if ((unsigned long)(millis() - previousMillis1) >= interval1) { 
    previousMillis1 = millis(); 
    digitalWrite(22, LOW); 
    } 
    digitalWrite(22, HIGH); 

你們能幫我嗎?我想不明白。

+0

你可以編輯幷包含完整的'loop()'函數嗎? –

+0

C++ 11的'std :: condition_variable's有一些方法可以在一段指定的時間內等待一個條件變量,這可以用毫秒來指定。 –

+0

你在做C或C++嗎? – alk

回答

1

我假設你試圖打開LED 100ms,當字符串變量readString包含已定義的文字字符串,然後將其關閉。

我認爲你的代碼中缺少else,因爲如果沒有它,digitalWrite(22, LOW)關閉LED將直接跟着digitalWrite(22, HIGH),這將再次打開LED。在執行previousMillis1 = millis()時,您讓LED不斷閃爍,不僅一次。 嘗試是這樣的:

unsigned long interval1=100; // the time we need to wait 
unsigned long previousMillis1=0; // millis() returns an unsigned long. 
boolean led_blinking = false; 

void loop(){ 
    if (readString.indexOf("?22") >0 && !led_blinking){ 
     led_blinking = true; 
     previousMillis1 = millis(); 
    } 
    if (led_blinking && millis() - previousMillis1 <= interval1) { 
     digitalWrite(22, HIGH); 
    } else { 
     digitalWrite(22, LOW); 
     led_blinking = false; 
     readString = ""; /* resetting the string variable to prevent 
          further blinking, until the variable is set 
          by another part of the code */ 
    } 

    // Do other task of the main loop 
} 

需要注意的是,根據需要來執行主循環的休息時間,這裏的時間不準確。但是,如果你只想有一個你的狀況的視覺標誌,這就足夠了。 如果您不想重置字符串變量,那麼可以使用另一個布爾變量,您可以在設置字符串變量時設置該變量。但不要忘記重置它而不是字符串變量。

+0

謝謝你播種多克里斯我會檢查你的代碼 –