Skocz do zawartości
WojtekMazur

Jak zakończyć wykonywanie takiej pętli?

Pomocna odpowiedź

Witaj. Jestem totalnie zielony w programowanie, nie wiem jak zakończyć wykonywanie pętli. Fragment kodu poniżej sprawdza czy przycisk jest wciśnięty, jeżeli tak to wykonuje funkcję "SMS". Chciałbym aby po ustawieniu stanu wysokiego funkcja wykonała się tylko jeden raz i później program ma czekać aż położenie przycisku znowu będzie na LOW (jest to przycisk bistabilny). Pomocy:)

if (buttonState == HIGH)
	{
		SMS();
	}

 

Udostępnij ten post


Link to post
Share on other sites

Teoretycznie pętla jest po prostu nie w tym miejscu co trzeba. Działałoby coś takiego:

if (buttonState == HIGH) {
  SMS();
  while (buttonState == HIGH);{
    buttonState = digitalRead(pin);
  }
}

ale tak się po prostu nie robi. Powinieneś zareagować nie na stan przycisku, ale na jego zmianę z niskiego na wysoki.

Czyli coś w stylu:

static int oldButtonState = LOW;
if (buttonState == HIGH && oldButtonState == LOW) {
  SMS();
}
oldButtonState = buttonState;

Jak widzisz - nie ma tu żadnych pętli.

W praktyce możesz użyć biblioteki Bounce2, która załatwi za Ciebie również potencjalne drgania styków wyłącznika, a kod będzie sprowadzał się do:

button.update();
if (button.rose()) SMS();

 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Pięknie dziękuję za odpowiedź.

static int oldButtonState = LOW;
if (buttonState == HIGH && oldButtonState == LOW) {
  SMS();
}
oldButtonState = buttonState;

Ten kod działa dokładnie tak jak chciałem, tylko faktycznie przy wyłączaniu następują czasami drgania styków i funkcja wykonuje się jeszcze raz. Próbowałem zaimplementować ten fragment kodu wykorzystujący bibliotekę Bounce2, ale przy kompilacji pojawia się komunikat że "button" nie jest zadeklarowany. Powinienem utworzyć jeszcze jakąś zmienną button, czy to już jest zapisane gdzieś w tej bibliotece?:)

void loop(){
  button.update();
if (button.rose()) SMS();
  }

Na samej górze jest oczywiście zadeklarowana biblioteka:

#include <Bounce2.h>

 

Udostępnij ten post


Link to post
Share on other sites

Jeśli zainstalowałeś bibliotekę to w PLIK-PRZYKLADY znajdziesz przykłady jej użycia. Samo dołączenie pliku nagłówkowego #include Bounce2.h nie wystarczy. W swoim programie musisz utworzyć obiekt klasy Bounce np.:

// Instantiate a Bounce object
Bounce button = Bounce();

Teraz dopiero będziesz miał dostęp do metod tej klasy np. button.rose()

Udostępnij ten post


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!

Gość
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...