Skocz do zawartości

Przerwanie pętli While


Hubertus99

Pomocna odpowiedź

Witam, jestem początkującym majsterkowiczem i bawię się w napisanie programu, który będzie sterować serwomechanizmem na zasadzie wpisywania w monitor portu szeregowego poszczególnych cyfr tylko kompletnie nie wiem jak wyjść z pętli while aby przerwał się obieg, czy jest jakiś uniwersalny sposób ? Pozdrawiam

#include <Servo.h>

#define LedCz 10
#define LedZl 11
#define LedZ 12

Servo serwomechanizm;
int pozycja = 0;
int zmiana = 6;
String odebraneDane;
int liczba = 0;

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  serwomechanizm.attach(9);
  pinMode(LedCz, OUTPUT);
  pinMode(LedZl, OUTPUT);
  pinMode(LedZ, OUTPUT);

  digitalWrite(LedCz, HIGH);
  digitalWrite(LedZl, LOW);
  digitalWrite(LedZ, LOW);
  
  Serial.println("Witaj w sterowaniu serwomechanizem!!");
  Serial.println("Praca - 1");
  Serial.println("Zatrzymanie - 2");
  Serial.println("Bledne dane - Zolta dioda");
}

void loop() {
  // put your main code here, to run repeatedly:
if(Serial.available()>0)
{
  odebraneDane=Serial.readStringUntil('\n');
  liczba = odebraneDane.toInt();
  while(liczba == 1)
  {
    digitalWrite(LedCz, LOW);
    digitalWrite(LedZl, HIGH);
    digitalWrite(LedZ, LOW);
    if(pozycja < 180)
    {
      serwomechanizm.write(pozycja);
    }
    else
    {
      pozycja = 0;
    }
    pozycja = pozycja + zmiana;
    delay(200);
  if(liczba == 2)
  {
   break;
      digitalWrite(LedCz, HIGH);
      digitalWrite(LedZl, LOW);
      digitalWrite(LedZ, LOW);
    pozycja = 0;
  }
  else
  {
  digitalWrite(LedCz, LOW);
  digitalWrite(LedZl, LOW);
  digitalWrite(LedZ, HIGH);
  }
}
}
}

 

Link do komentarza
Share on other sites

A wiec tak problem polega na tym ze jak wybiorę cyfrę „1” w monitorze portu szeregowego to program wchodzi do pętli while i wszystko działa poprawnie, ale gdy chce wybrać opcje zatrzymanie czyli poprostu wpisać cyfrę „2” to niestety nie przechodzi mi do dalszej części programu tylko dalej tkwi w pętli while 

Link do komentarza
Share on other sites

Teraz poukładaj sobie ładnie nawiasy i wcięcia i zobacz co zrobiłeś.

Masz w skrócie:

liczba = odbierz_dane();
dopóki liczba jest równa 1 {
  rób coś;
  jeśli liczba jest równa 2 { // a niby skąd się te dwa wzięło jeśli jest równa jeden?
    przerwij pętlę;
  }
}

Jeśli wewnątrz pętli nie będziesz odbierać danych, to program w żaden magiczny sposób ich nie odbierze...

A spróbujesz to samo napisać bez użycia jakichkolwiek pętli? Będzie łatwiej.

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

Witam ponownie, wciąż w tym kodzie ten serwomechanizm nie chce pracować alternatywnie próbowałem na switch'ach i też nic wysyłam kod

#include <Servo.h>

#define LedCz 10
#define LedZl 11
#define LedZ 12

Servo serwomechanizm;
int pozycja = 0;
int zmiana = 6;
String odebraneDane;
int liczba = 0;

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(9600);
  serwomechanizm.attach(9);
  pinMode(LedCz, OUTPUT);
  pinMode(LedZl, OUTPUT);
  pinMode(LedZ, OUTPUT);

  digitalWrite(LedCz, HIGH);
  digitalWrite(LedZl, LOW);
  digitalWrite(LedZ, LOW);
  
  Serial.println("Witaj w sterowaniu serwomechanizem!!");
  Serial.println("Praca - 1");
  Serial.println("Zatrzymanie - 2");
  Serial.println("Bledne dane - Zolta dioda");
}

void loop() {
  // put your main code here, to run repeatedly:
if(Serial.available()>0)
{
  odebraneDane=Serial.readStringUntil('\n');
  liczba = odebraneDane.toInt();

  if(liczba==1){
    
    digitalWrite(LedCz, LOW);
    digitalWrite(LedZl, HIGH);
    digitalWrite(LedZ, LOW);
    
    if(pozycja<180){
      serwomechanizm.write(pozycja);
    }else{
      pozycja = 0;
    }
    pozycja=pozycja+zmiana;
    delay(200);
    }
    
    else if(liczba ==2){
    digitalWrite(LedCz, HIGH);
    digitalWrite(LedZl, LOW);
    digitalWrite(LedZ, LOW);
    pozycja = 0;
    serwomechanizm.write(pozycja);
    }

    else{
   digitalWrite(LedCz, LOW);
   digitalWrite(LedZl, LOW);
   digitalWrite(LedZ, HIGH);

   Serial.println("Nieznana zmienna !!");
    }
  }
}

 

Link do komentarza
Share on other sites

Tak jeszcze dopowiem, że poprostu ten warunek wykonuje się tylko raz, a ja chciałbym ze jak kliknę jedynkę na klawiaturze komputera to silnik poprostu zaczyna pracować, nie mam pomysłu jak to zrobić bez pętli, lecz gdy daje while no to zatrzymuje się w błędnym kole.

Link do komentarza
Share on other sites

Dnia 6.09.2020 o 20:55, Hubertus99 napisał:

nie wiem jak wyjść z pętli while aby przerwał się obieg, czy jest jakiś uniwersalny sposób ?

To jeszcze warto wspomnieć o instrukcji break; - zobacz

Pozdrawiam,

Edytowano przez Belferek
Link do komentarza
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.