Skocz do zawartości

Arduino dziwne zachowanie pętli While


Pomocna odpowiedź

Napisano (edytowany)

Witam wszystkich. Podczas programowania Arduino do mojego urządzenia napotkałem dziwne zachowanie się dwóch pętli While. Program wykonuje się w pierwszej aby po spełnieniu warunku przejść do drugiej. Niestety program w pętli While 1 wykonuje się bardzo wolno ( co widać na terminalu ), a w drugiej z normalną prędkością. Pomaga usunięcie z pętli linijki sterującej pracą silnika krokowego (co jest nie zrozumiałe dla mnie ponieważ sterowanie powinno się wykonać dopiero po spełnieniu warunku IF, oraz to że kod wewnątrz obu pętli właściwie jest taki sam). Proszę o pomoc bo brakuje i już pomysłów. Poniżej kod o którym mowa:

void loop()
{
   while (digitalRead(X_lewy)==HIGH){
   Serial.println("While 1");
       if (digitalRead(Z_up)==LOW)
       digitalWrite(12,HIGH);                                     //zezwolenie na ruch stepper 1& 2
 {a=a-384;stepper1.runToNewPosition(a); delay (1000);}
        digitalWrite(12,LOW);                                    //brak zezwolenia na ruch stepper 1& 2
          }  //////// koniec pętli while 1 /////////
digitalWrite(12,HIGH);                                              //zezwolenie na ruch stepper 1& 2
      {d=d+576;stepper2.runToNewPosition(d); delay(200);}
      digitalWrite(12,LOW);                                        //brak zezwolenia na ruch stepper 1& 2

  while (digitalRead(X_prawy) == HIGH){
       Serial.println("WHILE 2");
       if (digitalRead(Z_up)==LOW)
       {  digitalWrite(12,HIGH);                               //zezwolenie na ruch stepper 1& 2
 {a=a+384;stepper1.runToNewPosition(a); delay (1000);}
        digitalWrite(12,LOW);}                               //brak zezwolenia na ruch stepper 1& 2
         } //////// koniec pętli while 2 //////////
      digitalWrite(12,HIGH);                                 //zezwolenie na ruch stepper 1& 2
  {d=d+576;stepper2.runToNewPosition(d); delay(200);}
      digitalWrite(12, LOW);                                //brak zezwolenia na ruch stepper 1& 2
}

 

Edytowano przez Gieneq
48 minut temu, papi napisał:

       if (digitalRead(Z_up)==LOW)        digitalWrite(12,HIGH);              

Ten warunek steruje tylko wykonaniem tej jednej instrukcji.

@papi, jeśli kod ten zaznaczyć w Arduino IDE i nacisnąć Ctrl + T (automatyczne formatowanie), to będzie:

void loop()
{
  while (digitalRead(X_lewy) == HIGH) {
    Serial.println("While 1");
    if (digitalRead(Z_up) == LOW)
      digitalWrite(12, HIGH);                                    //zezwolenie na ruch stepper 1& 2
    {
      a = a - 384;
      stepper1.runToNewPosition(a);
      delay (1000);
    }
    digitalWrite(12, LOW);                                   //brak zezwolenia na ruch stepper 1& 2
  }  //////// koniec pętli while 1 /////////
  digitalWrite(12, HIGH);                                             //zezwolenie na ruch stepper 1& 2
  {
    d = d + 576;
    stepper2.runToNewPosition(d);
    delay(200);
  }
  digitalWrite(12, LOW);                                       //brak zezwolenia na ruch stepper 1& 2

  while (digitalRead(X_prawy) == HIGH) {
    Serial.println("WHILE 2");
    if (digitalRead(Z_up) == LOW)
    { digitalWrite(12, HIGH);                              //zezwolenie na ruch stepper 1& 2
      {
        a = a + 384;
        stepper1.runToNewPosition(a);
        delay (1000);
      }
      digitalWrite(12, LOW);
    }                               //brak zezwolenia na ruch stepper 1& 2
  } //////// koniec pętli while 2 //////////
  digitalWrite(12, HIGH);                                //zezwolenie na ruch stepper 1& 2
  {
    d = d + 576;
    stepper2.runToNewPosition(d);
    delay(200);
  }
  digitalWrite(12, LOW);                                //brak zezwolenia na ruch stepper 1& 2
}

Gdy się przestrzega higieny w formatowaniu kodu, to łatwiej widać strukturę. I błędy w niej.

  • Lubię! 1

Ok, wielkie dzięki za okazaną wyrozumiałość i pomoc. Jutro sprawdzę krok po kroku cenne wskazówki.

Nie wytrzymałem i zamiast iść spać -  sprawdziłem. Wiedząc czego szukać.....w jednym miejscu nie żałowałem nawiasów a w drugim przeciwnie. Teraz wszystko działa tak jak sobie zaplanowałem. Wypróbowałem także wpisanie pętli while w pętlę while i także działa (w necie znalazłem tylko wzmiankę,że tak można). Będę pamiętał o ctl+T. Jeszcze raz wielkie podziękowania za pomoc. 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...