Robofun 機器人論壇

標題: 詢問有甚麼方式可以取代delay 的指令 [打印本頁]

作者: mickey    時間: 2017-10-20 08:14
標題: 詢問有甚麼方式可以取代delay 的指令
請問各位大大

想請問有甚麼方式可以取代delay 的指令
我在程式中有寫一個判斷式
當判斷式成立後, 會用delay  指令, delay 5 秒後, 在執行判斷式成立後要做的動作
但是發現, delay 這個指令會拖慢整個程式的運作
也就是這條判斷式不管是否成立. 其他運作的程式反映出來的動作都會變慢
把delay 拿掉後, 整個程式運作就很順
請問有其他方式嗎? 需要delay , 但是又不要影響其他判斷式的運作
謝謝

作者: 超新手    時間: 2017-10-20 08:33
unsigned char State = 0;
unsigned int Prev;
void loop() {
  if(State == 0) {
     if(判斷式1) {
        State = 1;
        Prev = millis();
     }   
  } else {
    unsigned int Time = millis() - Prev;
    if(Time >= 5000) {
      if(判斷式2) {        
      }
      State = 0;
    }
  }
}
作者: mickey    時間: 2017-10-23 08:17
超新手 發表於 2017-10-20 08:33
unsigned char State = 0;
unsigned int Prev;
void loop() {

感謝大大幫忙
但是小弟是剛接觸,還是有點看不懂 , 下面是我的程式.想要請問要如何改進去呢
我是要取代最後一個判斷式中的delay
請問要如何修改..
感謝

int pin = 10;  
int ledPin1 = 11;
int ledPin2 = 12;  
int valve = 14;
int photocellPin = 2;  
int photocellPin1 = 3;
int val1 = 0;         
int val2 = 0;         

void setup() {
pinMode(pin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(valve, OUTPUT);

  }
void loop() {
  val1 = digitalRead(photocellPin);
  if(val1==HIGH){
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, LOW);
     }
else{
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
   }
  
   val2 = digitalRead(photocellPin1);
   if(val2==HIGH){
   digitalWrite(pin, HIGH);
            }
else{
   digitalWrite(pin, LOW);
   }

  if(val1== HIGH || val2==LOW){
  delay(5000);
  digitalWrite(valve, HIGH);  
    }
}



作者: 超新手    時間: 2017-10-23 11:40
你這個程式有點奇怪
只要 val1等於 HIGH 或是 val2等於LOW
valve 就會在 5 秒後就為 HIGH
永遠不會變 LOW

unsigned char State = 0;
unsigned int Prev;
void loop() {
..................
  if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  } else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }
}
作者: mickey    時間: 2017-10-25 08:01
超新手 發表於 2017-10-23 11:40
你這個程式有點奇怪
只要 val1等於 HIGH 或是 val2等於LOW
valve 就會在 5 秒後就為 HIGH

謝謝大大
我的程式是在監控2 個sensor 的作動
因為有時val1 等於LOW , val2 等於HIGH
這時我就不讓valve 去做動
我再把程式修改一下再測試看看
感謝大大的幫忙
作者: mickey    時間: 2017-12-25 16:34
謝謝大大...已經修改程式去測試使用...沒問題
另外請問, 如果我需要2 個地方去做delay ( 不同判斷程式)...請問另一段要如何加入呢?
感謝大大
作者: 超新手    時間: 2017-12-25 17:13
另外定義一個 int Prev2;
unsigned char State = 0;
unsigned int Prev;
unsigned int Prev2;
void setup() {
...........................
Prev =  millis();
Prev2 =  millis();
}
void loop() {
//第一組
  if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  } else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }
//第二組
  if (判斷式) {
      Prev2 = millis();
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      
    }
  }
}
作者: mickey    時間: 2017-12-26 01:58
謝謝大大
有個問題, 我是要在判斷式的前半段去做delay 的動作,這要怎麼改呢
if((val1==LOW) && (val2==HIGH)){
      delay(5000);
     digitalWrite(botpin, HIGH);
       }
else{
   digitalWrite(botpin, LOW);
   }
作者: 超新手    時間: 2017-12-26 05:20
本帖最後由 超新手 於 2017-12-26 05:24 編輯

程式本來就是前半段加 delay
if (State == 0) {
    if (val1 == LOW &&val2 == HIGH) {
      State = 1;
      Prev = millis();
    } else {
       digitalWrite(valve, LOW);
   }
  } else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }
作者: mickey    時間: 2017-12-26 15:14
謝謝大大幫忙...不過有些問題.
我按照大大的方式去修改, 發現2個問題
1.判斷式 if((val1==LOW) && (val2==HIGH)) 的結果怪怪的
   並不會是   val1==LOW 及 val2==HIGH 同時成立時, 才delay 5 秒後 執行 digitalWrite(botpin, HIGH)
2.判斷式 if((val1==LOW) && (val2==HIGH)) 不成立時, 也會等5 秒才去執行  digitalWrite(botpin, LOW)
    這個部分不須 delay 5秒..

unsigned char State = 0;
unsigned char State2 = 0;
unsigned int Prev;  
unsigned int Prev2;

if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  }
  else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }

if (State2 == 0) {
    if((val1==LOW) && (val2==HIGH)){
      State2 = 1;
      Prev2 = millis();
    } else {
       digitalWrite(botpin, HIGH);
   }
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      digitalWrite(botpin, LOW);
      State2 = 0;
    }
  }


作者: 超新手    時間: 2017-12-26 15:42
本帖最後由 超新手 於 2017-12-26 15:54 編輯

你括號括錯了
中間少了一個, 應該跑到最下面去了
if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  }
  else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  } //少了這個右括號, 少了這個右括號, 少了這個右括號

if (State2 == 0) {
    if((val1==LOW) && (val2==HIGH)){
      State2 = 1;
      Prev2 = millis();
    } else {
       digitalWrite(botpin, HIGH);
   }
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      digitalWrite(botpin, LOW);
      State2 = 0;
    }
  }
// 所以你應該在這邊會多一個右括號, 記得去掉



作者: mickey    時間: 2017-12-26 15:54
不好意思...寫的有點亂
程式為

unsigned char State = 0;
unsigned int Prev;  


if((val1==LOW) && (val2==HIGH)){
      delay(5000);
     digitalWrite(botpin, HIGH);
      }
else{
   digitalWrite(botpin, LOW);
  }

if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  }
  else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }

原本後面那一段的判斷式有5秒delay, 大大已經幫我修改
但是因為一些需求, 第一段的判斷式也需要加入5秒delay
所以想請大大幫忙修改..
而樓上的修改方式, 我是按照大大教導的去修改出來的
所以有點怪怪的
想麻煩大大幫忙一下
感恩喔
作者: 超新手    時間: 2017-12-26 15:55
本帖最後由 超新手 於 2017-12-26 16:06 編輯

己經回答在 11 樓
你括號括錯地方

作者: mickey    時間: 2017-12-26 16:31
感謝大大...大大不好意思...上面括號可以能是貼錯
正確的是這樣..
出現的問題就是跟上面說的一樣


  
if (State2 == 0) {
    if((val1==LOW) && (val2==HIGH)){
      State2 = 1;
      Prev2 = millis();
    }
    else  {
      digitalWrite(botpin, HIGH);
   }
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      digitalWrite(botpin, LOW);
      State2 = 0;
    }
  }
   

if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  }
  else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }

作者: mickey    時間: 2017-12-26 16:34
原本的程式是這樣

if((val1==LOW) && (val2==HIGH)){
       delay(5000);
     digitalWrite(botpin, HIGH);
     
       }
else{
   digitalWrite(botpin, LOW);
    }

修改後為

  
if (State2 == 0) {
    if((val1==LOW) && (val2==HIGH)){
      State2 = 1;
      Prev2 = millis();
    }
    else  {
      digitalWrite(botpin, HIGH);
   }
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      digitalWrite(botpin, LOW);
      State2 = 0;
    }
  }
作者: 超新手    時間: 2017-12-26 16:41
你 high low 寫反了
if (State2 == 0) {
    if((val1==LOW) && (val2==HIGH)){
      State2 = 1;
      Prev2 = millis();
    }
    else  {
      digitalWrite(botpin, LOW);
   }
  } else {
    unsigned int Time2 = millis() - Prev2;
    if (Time2 >= 5000) {
      digitalWrite(botpin, HIGH);
      State2 = 0;
    }
  }
   

if (State == 0) {
    if (val1 == HIGH || val2 == LOW) {
      State = 1;
      Prev = millis();
    }
  }
  else {
    unsigned int Time = millis() - Prev;
    if (Time >= 5000) {
      digitalWrite(valve, HIGH);
      State = 0;
    }
  }
作者: mickey    時間: 2017-12-26 17:13
感謝大大幫忙糾正,已經有正常動作了
只是在判斷式未成立時, 未成立的執行動作時間一樣會delay
不過delay 的時間不會像設定需求一樣長 (大約是設定需求的一半)
還是感謝大大幫忙我這個新手喔




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2