Skocz do zawartości

Arduino dziwne zachowanie pętli While


papi

Pomocna odpowiedź

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
Link do komentarza
Share on other sites

48 minut temu, papi napisał:

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

Ten warunek steruje tylko wykonaniem tej jednej instrukcji.

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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

Link do komentarza
Share on other sites

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. 

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.