kinn12 Napisano Styczeń 12, 2017 Udostępnij Napisano Styczeń 12, 2017 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 More sharing options...
deshipu Styczeń 12, 2017 Udostępnij Styczeń 12, 2017 Trudno cokolwiek powiedzieć o kodzie, którego nam nie pokazałeś. Mamy zgadywać w jaki sposób zrobiłeś z tego funkcję i gdzie popełniłeś przy tym błąd? Link do komentarza Share on other sites More sharing options...
kinn12 Styczeń 12, 2017 Autor tematu Udostępnij Styczeń 12, 2017 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 More sharing options...
deshipu Styczeń 12, 2017 Udostępnij Styczeń 12, 2017 A napisz jeszcze jak tej funkcji używasz. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
kinn12 Styczeń 12, 2017 Autor tematu Udostępnij Styczeń 12, 2017 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 More sharing options...
deshipu Styczeń 12, 2017 Udostępnij Styczeń 12, 2017 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. Link do komentarza Share on other sites More sharing options...
Elvis Styczeń 12, 2017 Udostępnij Styczeń 12, 2017 kinn12, zastanów się czy if jest niezbędny w Twojej funkcji. Czy warunek jest spełniony czy nie i tak robisz to samo. Link do komentarza Share on other sites More sharing options...
kinn12 Styczeń 13, 2017 Autor tematu Udostępnij Styczeń 13, 2017 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. Link do komentarza Share on other sites More sharing options...
Elvis Styczeń 13, 2017 Udostępnij Styczeń 13, 2017 To chociaż digitalWrite możesz przenieść poza if-a. Dzięki temu nie będzie duplikacji kodu. Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »