Skocz do zawartości

Funkcja pamiętająca poprzedni stan


Pomocna odpowiedź

Napisano

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

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

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

}

Właśnie dlatego zapytałem jak ją wołasz, bo widziałem, że zwracasz w niej stan -- więc mogłeś wynik funkcji przypisywać ponownie do oryginalnej zmiennej i też by działało.

Tak jest niezbędny, ponieważ to jest tylko prosty przykład co ten if ma robić. Ląduje tam jeszcze serwo - zależnie od stanu różne pozycje i buzer.

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