Skocz do zawartości

Przerwanie pętli While


Pomocna odpowiedź

Napisano

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);
  }
}
}
}

 

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 

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.

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 !!");
    }
  }
}

 

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.

A mi się tak coś wydaje, że może wystarczyłoby w tym kodzie przenieść jeden z nawiasów klamrowych z końca  funkcji loop() do linijki następującej po linijce:

liczba = odebraneDane.toInt();

(edytowany)
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

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