Skocz do zawartości

Zagnieżdżona pętla IF wykonująca się przez ściśle określony czas


Pomocna odpowiedź

Napisano

Cześć, mam problem.

Chodzi o to, że nie potrafię zrobić takiego warunku, by pętla wykonywała się przez określony czas.

Schemat taki:

If (warunek)

program 1

else

if (warunek 2)

program 2 - wykonuje się przez 3 ms

else

program 3

Jest jakaś sprytna metoda na to?

Dokładniej ma to wyglądać tak:

for(unsigned long x = millis(); millis() - x < 3;) {
zrup_cos():
}

Albo coś w tym stylu...

Mam coś podobnego i niestety nie działa :/

#include 
unsigned long koniec, roznica;
unsigned long start = millis();

void setup() {
 Serial.begin(115200);
 delay(500);

}

 void loop() {
    double napiecie;
    napiecie=analogRead(A0);

if (napiecie>618)
   {
     Serial.print(" U = ");
     Serial.println(napiecie);
   }
   else
   {

    if(roznica<1000)
     {

     Serial.print("t=");
     Serial.print("roznica ");
     Serial.print(roznica);
     Serial.print(" U = ");
     Serial.println(napiecie);
     koniec = millis();
     roznica = koniec-start;
     }
  }
}

Podobne to nie to samo.

Zmienną start inicjalizujesz na początku, a potem sprawdzasz różnicę. Czyli pętla się będzie wykonywać ileśtam milisekund od startu programy, a nie startu pętli (zaistnienia warunku).

Ok, rozumiem, ale...

No właśnie, przy pętli for, warunek istnieje cały czas - pętla wykonuje się w nieskończoność. I za nic nie wiem jak to rozwiązać.

No właśnie już nie wiem. Pętla wykonuje się w nieskończoność, a nie tylko przez 3 ms. I to mnie zastanawia. Może mam jakiś błąd w myśleniu? Chodzi mi o wykonanie prostego programu działającego jak na tym schemacie.

Skadnię znam.

void loop() {
    //unsigned long tp, tk, t;
    double napiecie;
   // double tz = millis();

   napiecie=analogRead(A0);
   if (napiecie>618)
   {
     //tp=micros();
     Serial.print("t=");
     //Serial.print(tp);
     Serial.print(" I = ");
     Serial.println(napiecie);
   }
   else
   for(unsigned long x = millis(); millis() - x <3;)
   {
    //start = millis();
   // if(roznica<3)
     //{

     //tp=micros();
     Serial.print("t=");
     //Serial.print(tp);
     Serial.print("roznica ");
     Serial.print(roznica);
     Serial.print(" I = ");
     Serial.println(napiecie);
     //unsigned long koniec = millis();
     //roznica = koniec-start;
     }

     }

Wybaczcie komentarze w kodzie, ale po prostu już na tyle sposobów kombinowałem, że ciężko jest usuwać wszystko na bieżąco

Od zaistnienia warunku. To oczywiste, ale zmienną start wstawiałem chyba w każdą możliwą linijkę kodu, bo kombinowałem na milion sposobów. I wiele to nie zmieniało

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