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

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.