Skocz do zawartości

Złożony problem z przyciskami


bear

Pomocna odpowiedź

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);
}
Link do komentarza
Share on other sites

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.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

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

 }

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