Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
Bezsmarowe i bezobsługowe produkty do drukarek 3D!

Złożony problem z przyciskami

Autor Wiadomość
bear 



Posty: 9
Wysłany: 10-02-2018, 21:42   

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.
Kod programu: Zaznacz cały
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);
}

Warto przeczytać » OpenCV - #2 - Wykrywanie obiektów


Ostatnio zmieniony przez bear 10-02-2018, 21:43, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Belferek 



Posty: 128
Pomógł: 5 razy
Otrzymał 7 piw(a)
Wysłany: 10-02-2018, 23:06   

bear napisał/a:
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.
Kod programu: Zaznacz cały

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

Ostatnio zmieniony przez Belferek 10-02-2018, 23:26, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
bear 



Posty: 9
Wysłany: 14-02-2018, 00:12   

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?

Kod programu: Zaznacz cały
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);

  }
   
}

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Atmega - problem z b... Arduino ATmega 328-k... Poszukuję kogoś z A... Arduino i programowa...
lub przeszukaj forum po wybranych tagach: problem, przyciskami, zlozony


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki