Skocz do zawartości

Jak zakończyć wykonywanie takiej pętli?


Pomocna odpowiedź

Napisano

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

 

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

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>

 

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

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