bear Luty 10, 2018 Autor tematu Udostępnij Luty 10, 2018 Już się słucham. Tak wygląda zależność, przy próbie wysterowania dwóch wyjść nic się nie dzieje. Tutaj cały kod, jest to dopiero poczatek. StanX służy do określenia stanu który ma później posłużyć do załączania odpowiedniego wyjścia. Tak sobie to wymyśliłem ale nie wiem czy dobrze. int przekaznik1 = 2; //przekaznik1 podĹ‚Ä…czamy do pinu 2 int przekaznik2 = 3; //przekaznik2 podĹ‚Ä…czamy do pinu 3 int przekaznik3 = 4; //przekaznik1 podĹ‚Ä…czamy do pinu 4 int przekaznik4 = 5; //przekaznik1 podĹ‚Ä…czamy do pinu 5 int przekaznik5 = 6; //przekaznik1 podĹ‚Ä…czamy do pinu 6 int przekaznik6 = 7; //przekaznik1 podĹ‚Ä…czamy do pinu 7 int przycisk1 = 8; //przycisk1 podĹ‚Ä…czamy do pinu 8 int przycisk2 = 9; //przycisk2 podĹ‚Ä…czamy do pinu 9 int przycisk3 = 10; //przycisk1 podĹ‚Ä…czamy do pinu 10 int przycisk4 = 11; //przycisk1 podĹ‚Ä…czamy do pinu 11 int przycisk5 = 12; //przycisk1 podĹ‚Ä…czamy do pinu 12 int przycisk6 = 13; //przycisk1 podĹ‚Ä…czamy do pinu 13 boolean Stan1; boolean Stan2; boolean Stan3; boolean Stan4; void setup() { pinMode(przekaznik1, OUTPUT); //przekaznik1 jako wyjĹ›cie pinMode(przekaznik2, OUTPUT); //przekaznik2 jako wyjĹ›cie pinMode(przekaznik3, OUTPUT); //przekaznik3 jako wyjĹ›cie pinMode(przekaznik4, OUTPUT); //przekaznik4 jako wyjĹ›cie pinMode(przekaznik5, OUTPUT); //przekaznik5 jako wyjĹ›cie pinMode(przekaznik6, OUTPUT); //przekaznik6 jako wyjĹ›cie pinMode(przycisk1, INPUT_PULLUP); //przycisk1 jako wejĹ›cie pinMode(przycisk2, INPUT_PULLUP); //przycisk2 jako wejĹ›cie pinMode(przycisk3, INPUT_PULLUP); //przycisk3 jako wejĹ›cie pinMode(przycisk4, INPUT_PULLUP); //przycisk4 jako wejĹ›cie pinMode(przycisk5, INPUT_PULLUP); //przycisk5 jako wejĹ›cie pinMode(przycisk6, INPUT_PULLUP); //przycisk6 jako wejĹ›cie digitalWrite(przekaznik1, LOW); //stan poczÄ…tkowy przekaznika1 niski digitalWrite(przekaznik2, LOW); //stan poczÄ…tkowy przekaznika2 niski digitalWrite(przekaznik3, LOW); //stan poczÄ…tkowy przekaznika3 niski digitalWrite(przekaznik4, LOW); //stan poczÄ…tkowy przekaznika4 niski digitalWrite(przekaznik5, LOW); //stan poczÄ…tkowy przekaznika5 niski digitalWrite(przekaznik6, LOW); //stan poczÄ…tkowy przekaznika6 niski Serial.begin(9600); //PrÄ™dkość komunikacji z portem } void loop() { int przycisk1 = digitalRead(8); //Odczytuje stan wejscia 1 int przycisk2 = digitalRead(9); //Odczytuje stan wejscia 2 int przycisk3 = digitalRead(10); //Odczytuje stan wejscia 3 int przycisk4 = digitalRead(11); //Odczytuje stan wejscia 4 if(przycisk1 == LOW && przycisk2 == HIGH) { Stan1 = true; Stan2 = false; Serial.println(F("Stan1")); } else if(przycisk2 == LOW && przycisk1 == HIGH) { Stan2 = true; Stan1 = false; Serial.println(F("Stan2")); } if(przycisk3 == LOW && przycisk4 == HIGH) { Stan3 = true; Stan4 = false; Serial.println(F("Stan3")); } else if(przycisk4 == LOW && przycisk3 == HIGH) { Stan4 = true; Stan3 = false; Serial.println(F("Stan4")); } delay(1000); } Cytuj Link do komentarza Share on other sites More sharing options...
Belferek Luty 10, 2018 Udostępnij Luty 10, 2018 Tak wygląda zależność, przy próbie wysterowania dwóch wyjść nic się nie dzieje. Zgodnie z tabelą stanów jaką nam pokazujesz w Twoim programie można wyróżnić trzy różne procedury jakie należy uwzględnić. Planujesz wykorzystać do tego 4 przyciski, a wystarczą 2. Przyciski wykorzystują porty cyfriwe Arduino więc każdy port można potraktować jako bit - odczytamy z niego 0 lub 1 w zależności czy przycisk jest wciśnięty czy nie. Jeśli tak to pytanie brzmi: ile potrzebuję portów [bitów] by uzyskać możliwość minimum 3 (jak pokazuje tabela) kombinacji?. Odpowiedź jest prosta ilosc_kombinacji_bitow = 2^ILE_BITOW. Jak widzisz tutaj już dla n = 2 otrzymujesz możliwość 4 kombinacji, a kombinacje te to 00,01,10,11 - innej opcji nie ma! W Arduino Uno za dużo tych portów do dyspozycji nie mamy więc może warto to przemyśleć. Dodałbym 2 diody LED, a ponieważ masz tylko 2 przypadki "aktywne" można byłoby zrobić tak: PRZYCISK1 - wybór trybu, każde wciśnięcie zmienia żądany tryb wyjść (0101 na 1010) DIODY LED - sygnalizują wybrany tryb wyjść PRZYCISK2 - zatwierdzenie wybranego trybu przez PRZYCISK1 Wprost liczba wykorzystanych portów się nie zmienia (też 4), ale pojawia się możliwość sygnalizacji stanu urządzenia. Na końcu pętli loop używasz delay() czyli "zamrażasz" swój procesor. W sumie to nie jest najlepsza praktyka programowania. Zobacz kurs Arduino: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418 lub poczytaj np to: https://starter-kit.nettigo.pl/2016/04/biblioteka-timers-16-4-0/ Oczywiście i na forum cała masa dyskusji jest w tym temacie. Może warto nad tym się zastanowić? [ Dodano: 10-02-2018, 23:24 ] I jeszcze jedno. Jeśli w programie chcesz zdefiniować stałą np. numer pinu, do którego podłączyłem przycisk to wygodniej zrobić to tak np. #define IN1 8 //przycisk dostęp przez digitalRead(IN1) Przeanalizuj wartość zmiennej przycisk1 w Twoim programie. Na początku ma wartość 8, a później? Definiując w ten sposób stałe, gdy np. podłączysz przycisk do innego portu to nie zmieniasz numeru portu w w wywołaniu digitalRead() (a tych wywołań może być wiele i łatwo o błąd) tylko zmieniasz jego definicję. Zauważ, że na końcu #define nie ma średnika. 1 Cytuj Link do komentarza Share on other sites More sharing options...
bear Luty 13, 2018 Autor tematu Udostępnij Luty 13, 2018 Dziękuje Ci bardzo za odpowiedź, na początku chcę zrobić to tak aby mi to chodziło pod każdym aspektem. Oczywiście twoja propozycja jest dobra co do przycisków ale problem leży w tym że to ja muszę się "dostosować" do chociażby przełączników a nie one do mnie stąd 4 a nie dwa. W każdym razie rozszerzyłem swój kod o dalszą funkcję ale mam mały problem z którym nie mogę sobie poradzić. Cóż, dalsza część kodu sprawdza którą kombinację przycisków wybraliśmy i zależnie od tego załącza wybrane wyjścia jednoczenie blokując możliwość wyboru np. dwóch wyjść z jednej pary. To wszystko wrzuciłem w pętle while oraz dodałem element "Wyjscie" który jest odpowiedzialny za odliczanie czasu, wyłączenie wyjść po X czasie i wrócenie na początek pętli oczekując na kombinację. Problem leży w tym że po wyborze kombinacji, załączeniu wyjść i ich wyłączeniu po ustalonych 5s program prawdopodobnie zapamiętuje stan wejść i powtarza kod w kółko czyli sam załącza od nowa te same wyjście, odczekuje X czasu, wyłącza je i od nowa załącza i tak w kółko. W czym leży problem? int przekaznik1 = 2; //przekaznik1 podĹ‚Ä…czamy do pinu 2 int przekaznik2 = 3; //przekaznik2 podĹ‚Ä…czamy do pinu 3 int przekaznik3 = 4; //przekaznik1 podĹ‚Ä…czamy do pinu 4 int przekaznik4 = 5; //przekaznik1 podĹ‚Ä…czamy do pinu 5 int przekaznik5 = 6; //przekaznik1 podĹ‚Ä…czamy do pinu 6 int przekaznik6 = 7; //przekaznik1 podĹ‚Ä…czamy do pinu 7 int przycisk1 = 8; //przycisk1 podĹ‚Ä…czamy do pinu 8 int przycisk2 = 9; //przycisk2 podĹ‚Ä…czamy do pinu 9 int przycisk3 = 10; //przycisk1 podĹ‚Ä…czamy do pinu 10 int przycisk4 = 11; //przycisk1 podĹ‚Ä…czamy do pinu 11 int przycisk5 = 12; //przycisk1 podĹ‚Ä…czamy do pinu 12 int przycisk6 = 13; //przycisk1 podĹ‚Ä…czamy do pinu 13 boolean Stan1; boolean Stan2; boolean Stan3; boolean Stan4; boolean Wyjscie; boolean End; void setup() { pinMode(przekaznik1, OUTPUT); //przekaznik1 jako wyjĹ›cie pinMode(przekaznik2, OUTPUT); //przekaznik2 jako wyjĹ›cie pinMode(przekaznik3, OUTPUT); //przekaznik3 jako wyjĹ›cie pinMode(przekaznik4, OUTPUT); //przekaznik4 jako wyjĹ›cie pinMode(przekaznik5, OUTPUT); //przekaznik5 jako wyjĹ›cie pinMode(przekaznik6, OUTPUT); //przekaznik6 jako wyjĹ›cie pinMode(przycisk1, INPUT_PULLUP); //przycisk1 jako wejĹ›cie pinMode(przycisk2, INPUT_PULLUP); //przycisk2 jako wejĹ›cie pinMode(przycisk3, INPUT_PULLUP); //przycisk3 jako wejĹ›cie pinMode(przycisk4, INPUT_PULLUP); //przycisk4 jako wejĹ›cie pinMode(przycisk5, INPUT_PULLUP); //przycisk5 jako wejĹ›cie pinMode(przycisk6, INPUT_PULLUP); //przycisk6 jako wejĹ›cie digitalWrite(przekaznik1, LOW); //stan poczÄ…tkowy przekaznika1 niski digitalWrite(przekaznik2, LOW); //stan poczÄ…tkowy przekaznika2 niski digitalWrite(przekaznik3, LOW); //stan poczÄ…tkowy przekaznika3 niski digitalWrite(przekaznik4, LOW); //stan poczÄ…tkowy przekaznika4 niski digitalWrite(przekaznik5, LOW); //stan poczÄ…tkowy przekaznika5 niski digitalWrite(przekaznik6, LOW); //stan poczÄ…tkowy przekaznika6 niski Wyjscie = false; Serial.begin(9600); //PrÄ™dkość komunikacji z portem } void loop() { Serial.println(F("loop")); while(Wyjscie = true) { int przycisk1 = digitalRead(8); //Odczytuje stan wejscia 1 int przycisk2 = digitalRead(9); //Odczytuje stan wejscia 2 int przycisk3 = digitalRead(10); //Odczytuje stan wejscia 3 int przycisk4 = digitalRead(11); //Odczytuje stan wejscia 4 delay(1000); if(przycisk1 == LOW && przycisk2 == HIGH) { Stan1 = true; Stan2 = false; Serial.println(F("Stan1")); } else if(przycisk2 == LOW && przycisk1 == HIGH) { Stan2 = true; Stan1 = false; Serial.println(F("Stan2")); } if(przycisk3 == LOW && przycisk4 == HIGH) { Stan3 = true; Stan4 = false; Serial.println(F("Stan3")); } else if(przycisk4 == LOW && przycisk3 == HIGH) { Stan4 = true; Stan3 = false; Serial.println(F("Stan4")); } if(Stan1 == true && Stan2 == false && Stan3 == true && Stan4 == false) { Serial.println(F("Wysterowanie wyjĹ›cia 1 i 3")); digitalWrite(przekaznik1, HIGH); digitalWrite(przekaznik2, LOW); digitalWrite(przekaznik3, HIGH); digitalWrite(przekaznik4, LOW); Wyjscie = false; } if(Stan1 == true && Stan2 == false && Stan3 == false && Stan4 == true) { Serial.println(F("Wysterowanie wyjĹ›cia 1 i 4")); digitalWrite(przekaznik1, HIGH); digitalWrite(przekaznik2, LOW); digitalWrite(przekaznik3, LOW); digitalWrite(przekaznik4, HIGH); } if(Stan1 == false && Stan2 == true && Stan3 == true && Stan4 == false) { Serial.println(F("Wysterowanie wyjĹ›cia 2 i 4")); digitalWrite(przekaznik1, LOW); digitalWrite(przekaznik2, HIGH); digitalWrite(przekaznik3, HIGH); digitalWrite(przekaznik4, LOW); } if(Stan1 == false && Stan2 == true && Stan3 == false && Stan4 == true) { Serial.println(F("Wysterowanie wyjĹ›cia 2 i 4")); digitalWrite(przekaznik1, LOW); digitalWrite(przekaznik2, HIGH); digitalWrite(przekaznik3, LOW); digitalWrite(przekaznik4, HIGH); } if(Wyjscie == false) { Serial.println(F("Wyjscie")); delay(5000); digitalWrite(przekaznik1, LOW); digitalWrite(przekaznik3, LOW); break; } delay (1000); } } Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!