Skocz do zawartości

Arduino dziwne zachowanie pętli While


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 to post
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 to post
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 to post
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 to post
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 to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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