2016-12-03 3 views
0

извините за смутное название, но я не знал, что положить, потому что я действительно не знаю, в чем моя проблема. Iv'e написал код для датчика движения, подключенного к ардуину. Каждый раз, когда я запускаю скрипт, он по какой-то причине обходит замкнутый цикл i, а затем выполняет код под ним и останавливается.У меня проблемы с моим 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

ваш цикл()

(который не является петля, но ужасно длительный сбор, не прерываемых задержек)

делает это:

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 и motionPin на LOW навсегда, и вы не заметите, что «остановитесь».

while() всегда подозрительно в кодировании arduino, поскольку он отключает основную функцию arduino: запустите функцию цикла навсегда.

1

Вы пишете в комментарии к первому циклу while, что его можно обойти, если штырь не высок. Но тогда у вас есть оператор-отрицатель (!) Непосредственно перед тем условием, которое кажется странным. Я предлагаю вам удалить это. Утверждение сразу после этого также кажется излишним, поскольку он просто вошел в цикл именно на том условии, что он проверяет.