Skocz do zawartości

Funkcja pamiętająca poprzedni stan


kinn12

Pomocna odpowiedź

Cześć,

Napisałem program który po naciśnięciu przycisku zmienia stan diody na przeciwny i zapamiętuje ten stan. Czyli naciskam przycisk dioda się zapala, po kolejnym naciśnięciu się gasi. Wszystko fajnie działa. Tutaj kod:

boolean buttonState1 = true; // aktualny stan zaświecenia diody
int buttonPin1 = 10; //pin do odczytu stanu przycisku
int led1 = 7;   //pin do obsługi diody

void setup() {

pinMode(led1, OUTPUT); //Dioda jako wyjście
pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(led1, HIGH); //Wyłączenie diody
}

void loop() {

  if (digitalRead(buttonPin1) == LOW) {
     delay(20); //20ms na obsługę drgań styków
     buttonState1 = !buttonState1; //ustawienie przeciwnego stanu diody
     if (buttonState1 == true){
       digitalWrite(led1, buttonState1);
     }  else {
       digitalWrite(led1, buttonState1);
     }
     while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
     }
}

Chciałem zrobić z tego funkcje, aby nie powtarzać kodu, ponieważ chce użyć tego kilka razy w programie i tutaj zrobiły się schody. Po naciśnięciu dioda się zapala, jednak po kolejnym naciśnięciu już się nie gasi. Tak jakby stan się nie aktualizował.

Jak to spakować w funkcję aby to sprawnie działało??

Link do komentarza
Share on other sites

Tak, właśnie tak, przydał by się kod. Dzięki, już wrzucam.

boolean dioda(int dioda, int przycisk, int stan){
     delay(20); //20ms na obsługę drgań styków
     stan = !stan; //ustawienie przeciwnego stanu diody
     if (stan == true){
       digitalWrite(dioda, stan);
     }  else {
       digitalWrite(dioda, stan);
     }
     while (digitalRead(przycisk) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
  // }
   return stan;
}
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

Dobra już ogarnąłem. Zapomniałem, że w C robimy kopie zmiennych wchodząc do funkcji. Wystarczyło dodać odwołanie przez referencję do zmiennej przechowującej stan.

Wrzucam kod, może komuś się przyda.

Chyba, że macie jeszcze jakieś zastrzeżenia co do tej funkcji to chętnie posłucham

void dioda(int dioda, int przycisk, boolean & stan){

     delay(20); //20ms na obsługę drgań styków
     stan = !stan; //ustawienie przeciwnego stanu diody
     if (stan == true){
       digitalWrite(dioda, stan);
     }  else {
       digitalWrite(dioda, stan);
     }
     while (digitalRead(przycisk) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków

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

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.