Skocz do zawartości

Arduino problem z kolejnością przełączników


startrek1p2p

Pomocna odpowiedź

Cześć, napotkałem na problem, który próbowałem rozwiązać z dwoma kolegami (studentami), ale się nie udało.

Otóż chciałem stworzyć program w którym trzeba w odpowiedniej kolejności włączyć bezpieczniki (działają jak przełączniki kołyskowe) a następnie świeci się dioda .

Problem następuje w tym, że arduino odczytuje je tak jakby były cały czas włączane i pomimo wprowadzenia złej kolejności program tyle razy w sekundzie sprawdza je, że w końcu dochodzi do dobrej kombinacji. Wiem, że część z kombinacją jest dobra, bo działa ale na przyciskach wyciskowych. I tutaj prawdopodobnie jest mój błąd, czyli w samej deklaracji czy to ma być "INPUT" bądź "INPUT_PULLUP"  (te dwa sprawdzałem) czy jeszcze jakaś inna?

Po przemyśleniach doszedłem do wniosku, że to trzeba przerobić tak, aby działał na zmianę stanu z niskiego na wysoki bądź odwrotnie, ale też nie mam pojęcia jak tego dokonać. 

'

 

int code=0;
int flag=4;

void setup() {

Serial.begin(9600);

pinMode(A1, INPUT); //Przycisk 1 
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(A6, INPUT);

pinMode(5, OUTPUT);
pinMode(7, OUTPUT); //Wyjście diody 1.1
pinMode(8, OUTPUT);// wyjscie diody 1.2
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);

digitalWrite(5, HIGH);


}

void loop() {
  
  /////DIODY
    if (digitalRead(A1) == HIGH) { //Jeśli przycisk jest wciśnięty
    digitalWrite(7, HIGH); //Włączenie diody 1.1
     digitalWrite(8, LOW); //Wyłączenie diody 1.2
} else { //Jeśli przycisk nie jest wciśnięty
     digitalWrite(8, HIGH); //Włączenie diody 1.2
    digitalWrite(7, LOW); //Wyłączenie diody 1.1
}

if (digitalRead(A2) == HIGH) { //Jeśli przycisk jest wciśnięty
    digitalWrite(9, HIGH); //Włączenie diody 2.1
     digitalWrite(10, LOW); //Wyłączenie diody 2.2
} else { //Jeśli przycisk nie jest wciśnięty
     digitalWrite(10, HIGH); //Włączenie diody 2.2
    digitalWrite(9, LOW); //Wyłączenie diody 2.1
}

if (digitalRead(A3) == HIGH) { //Jeśli przycisk jest wciśnięty
    digitalWrite(11, HIGH); //Włączenie diody 3.1
     digitalWrite(12, LOW); //Wyłączenie diody 3.2
} else { //Jeśli przycisk nie jest wciśnięty
     digitalWrite(12, HIGH); //Włączenie diody 3.2
    digitalWrite(11, LOW); //Wyłączenie diody 3.1
}

///////////////////////////// PRZYCISKI

  if ((digitalRead(A1) == HIGH)&&(flag!=0)) { //Jeśli przycisk jest wciśnięty
     Serial.println(code);
      flag = 0;
     coder();
}

if ((digitalRead(A2) == HIGH)&&(flag!=1)) { //Jeśli przycisk jest wciśnięty     
     Serial.println(code);
flag = 1;
     coder();
}

  if ((digitalRead(A3) == HIGH)&&(flag!=2)) { //Jeśli przycisk jest wciśnięty
     Serial.println(code);
   flag = 2;
     coder();
     }

}
//////////////////// KOLEJNOSC

void coder(){

  
switch(flag){
  case 0:
  if(code==0){
    code++;
  }
  else{
    code=0;
  }
  break;
  
  case 1:
  if(code==1){
    code++;
  }
  else{
    code=0;
  }
  break;
  
  case 2:
  if(code==2){
    code++;
  }
  else{
    code=0;
  }
  break;
}
Serial.println(code);
if(code==3){
  flag=4;
  code=0;
  
  digitalWrite(5, LOW);
  delay(1000);
  digitalWrite(5, HIGH);

  
}
}

 

Edytowano przez startrek1p2p
Link do komentarza
Share on other sites

Jeśli nie chcesz bawić się w jakieś dodatkowe elementy, to przyciski/przełączniki/zestyki podłączasz tak by zwierały wejścia Arduino do GND a deklaracje pinów muszą zawierać opcję INPUT_PULLUP. Inaczej to nie zadziała. Zwarcie przełącznika daje wtedy stan niski i nie da się inaczej - musisz to w programie uwzględnić.

25 minut temu, startrek1p2p napisał:

trzeba w odpowiedniej kolejności włączyć bezpieczniki

Jeśli mówisz o kolejności w czasie a nie o jednorazowej kombinacji wszystkich na raz, to musisz tę kolejność wykrywać. Musisz zatem mieć ją jakoś w programie zaszytą (tablica?) i sprawdzać, czy kolejne stany są osiągane. Gdy ktoś po drodze się pomyli, sygnalizujesz stan błędu, wracasz do początku (tak ma być?), czekasz na rozłączenie wszystkich i znów czekasz na pierwszy poprawny przycisk.

BTW: Co studiujecie?

  • Lubię! 1
Link do komentarza
Share on other sites

Dzięki, wcześniej miałem na INPUT_PULLUP i działało najlepiej z wypróbowanych (to już n'ta wersja) jak będę miał trochę więcej czasu to coś porobię i dam znać o efektach.

A studiujemy kierunek techniczno informatyczny czyli wszystkiego po trochu(elektronika, mechanika, informatyka) 

Link do komentarza
Share on other sites

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

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.