2016-12-03 18 views
0

漠然としたタイトルの申し訳ありませんが、私は実際に私の問題が何であるか分からないので、何を置くべきか分からなかった。 Iv'eは、arduinoに接続されたモーションセンサーのコードを書いています。毎回スクリプトを実行するたびに、何らかの理由でマークされたwhileループをバイパスし、その下のコードを実行して停止します。私のarduinoに問題がある

int buzzPin = 8; 
int upPin = 7; 
int downPin = 6; 
int motionPin = 12; 
int redLed = 4; 
int amberLed = 3; 
int greenLed = 2; 

void setup() { 
    pinMode(buzzPin, OUTPUT); 
    pinMode(redLed, OUTPUT); 
    pinMode(amberLed, OUTPUT); 
    pinMode(greenLed, OUTPUT); 
    pinMode(upPin, INPUT); 
    pinMode(downPin, INPUT); 
    pinMode(motionPin, INPUT); 
} 

void loop() { 
    delay(1000); 
    digitalWrite(greenLed, HIGH); 
    digitalWrite(amberLed, LOW); 
    while(!digitalRead(upPin)==HIGH); //this is just bypassed when 'upPin' is not high 
    if(digitalRead(upPin)==HIGH){ 
    digitalWrite(greenLed, LOW); 
    digitalWrite(amberLed, HIGH); 
    digitalWrite(buzzPin, HIGH); //delay before arming the motion sensor 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(250); 
     digitalWrite(buzzPin, LOW); 
     delay(250); 
     digitalWrite(buzzPin, HIGH); 
     delay(1000); 
     digitalWrite(buzzPin, LOW); 
    } //stops here... 
    while(!digitalRead(motionPin)==HIGH); 
    disarm(); 
    alarm(); 
} 

bool disarm(){ //button combination to disarm the motion sensor and stop the alarm 
    int i = 0; 
    while(true){ 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(upPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(upPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(downPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(upPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(downPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    while(digitalRead(upPin)||digitalRead(downPin)); 
    while(!digitalRead(upPin)||!digitalRead(downPin)){i++; 
    delay(1000); 
    if(i == 5){ 
     return(false); 
     } 
    } 
    if(digitalRead(downPin)==HIGH){ 
     int i = 0; 
     } 
    else{continue;} 
    break; 
    } 
    return(true); 
    delay(50); 
    return(false); 
    } 

    void alarm(){ 
    digitalWrite(redLed, HIGH); 
    digitalWrite(amberLed, LOW); 
    while(disarm()==false){ 
     digitalWrite(buzzPin, HIGH); 
     delay(500); 
     digitalWrite(buzzPin, LOW); 
     delay(500); 
     } 
    } 

誰かが私の問題点を教えてもらえれば、それをどのように修正すればよいだろうか。

+0

配線の写真を投稿する必要があると思います。 – Hampus

+0

ちょうど推測ですが、while(digitalRead(upPin)!= HIGH);を試しましたか? – KMoussa

答えて

1

あなたのループ()

はこれを行いますmotionPinを永遠にLOWにすると、その「停止」に気付かないでしょう。

while()はarduinoの主な機能を無効にするため、arduinoコーディングでは常に疑わしいです。ループ関数を永遠に実行します。

1

最初のwhileループのコメントには、ピンが高くない場合はバイパスされます。しかし、あなたは否定的な演算子(!)を持っているのは、確かに奇妙に見える条件の直前です。私はそれを削除することをお勧めします。その直後のステートメントも、チェックしている条件にちょうどループしたので不必要なようです。

void loop() { 
    show_green(); 
    hang_until(upPin, LOW); // this can last forever 
    show_amber(); 
    buzz_a_while(); // blocks a couple of seconds 
    hang_until(motionPin, LOW); // this seems to last forever 
    disarm(); 
    alarm(); 
    delay(1 sec); 
} 

だから、単にupPinを強制:(ループが、非中断遅延のひどい長続きコレクションではありません)

関連する問題