Skocz do zawartości

Jak zakończyć wykonywanie takiej pętli?


WojtekMazur

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

 

Link do komentarza
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
Link do komentarza
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>

 

Link do komentarza
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()

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

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.