• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zagadka zręcznościowa z ograniczonym czasem na reakcję
#1
Hej, mam pytanie. Kombinuje już jakiś czas i nie jestem w stanie wyszukać rozwiązania. Będzie to mój pierwszy wpis także proszę o wyrozumiałość bo jestem samoukiem. Chodzi to żeby magnes na końcu wyłączył się po wykonaniu ustalonej kombinacji ruchów ( w tym przypadku wciśnięcie po kolei trzech guzików). Ale chce żeby czas na wciśnięcie każdego guzika był ograniczony. Czyli po wciśnięciu pierwszego mamy np 2 sekundy na naciśnięcie drugiego. Jak uda się wcisnąć drugi w wyznaczonym czasie to mamy kolejne 2 sekundy na wciśnięcie trzeciego. Jeżeli nie zdążymy wcisnąć któregoś guzika w czasie to wracamy do punktu początkowego. Światełko LED jest przyczepione obok swojego guzika i sygnalizuje który guzik należy teraz nacisnąć. Najlepiej by było żeby guzik drugi i trzeci były nieaktywne, a aktywowały się dopiero po wciśnięciu guzika poprzedzającego. Ma to być zagadka zręcznościowa. W późniejszym etapie guziki będę zastępował np odbiornikami podczerwieni ale zasada działania pozostaje ta sama. Proszę o pomoc i nakierowanie mnie w jaki sposób mogłoby to wyglądać. W moim przypadku wymyśliłem że w momencie kiedy wszystkie ledy zgasną to jest końcowy efekt ale może istnieje jeszcze prostsze rozwiązanie. 

void setup()
{
  pinMode(13, INPUT); //guzik1
  pinMode(12, INPUT); //guzik2

  pinMode(11, INPUT); //guzik3
  
pinMode(5, OUTPUT); //led1
  pinMode(4, OUTPUT); //led2
  pinMode(3, OUTPUT); //led3

  pinMode(2, OUTPUT); //elektromagnez
 
  digitalWrite(13, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(4, LOW);
  digitalWrite(5, HIGH);
  digitalWrite(3, LOW);
  digitalWrite(11, HIGH);
}

void loop()
{

  if (digitalRead(13)==LOW) //guzik1
  {
    digitalWrite(5, LOW); //led1 gaśnie
    digitalWrite(4, HIGH); //led2 zapala się
  }
 
 
  if (digitalRead(12)==LOW) //guzik2
  {
      digitalWrite(4, LOW); //led2 gaśnie
      digitalWrite(3, HIGH); //led3 zapala się
  }
   
 
  if (digitalRead(11)==LOW) //guzik3
    {
      digitalWrite(3, LOW); //led3 gaśnie
      }

 
  if ((digitalRead(5)==LOW)&&(digitalRead(4)==LOW)&&(digitalRead(3)==LOW)) //kiedy wszystkie ledy są zgaszone
 
   
  {
        digitalWrite(2, LOW); //zwora magnetyczna wyłacza się
  }
}



najpierw klikamy guzik1 po kliknięciu gaśnie led1 i zapala się led2. W tym momencie mamy 2 sekundy żeby nacisnąć guzik2, jeśli zdążymy to gaśnie led2 i zapala się led3 i mamy kolejne 2 sekundy żeby wcisnąć guzik3. Po wciśnięciu guzika3 gaśnie led3 i wyłącza się zwora magnetyczna. Jeżeli w którymkolwiek momencie nie zdążymy wcisnąć guzika w odpowiednim czasie to cała sekwencja wraca do początkowej czyli znowu pali się tylko led1 i musimy od nowa wcisnąć guzik1. Dobrze by było gdyby guzik2 aktywował się dopiero po wciśnięciu guzika1, a guzik3 dopiero po wciśnięciu guzika2. Z góry dziękuje za pomoc Smile
 
Odpowiedź
#2
Zacznij od migania led bez używania delay, czyli naucz się używać millis. Jakoś musisz mierzyć czas, a program nie może czekać na naciśnięcie przycisku stojąc w miejscu. Potem dodaj przycisk, drugi, trzeci, naucz się obsługiwać drgania styków albo wykorzystaj jedną z wielu bibliotek, np. easybutton, debounce2, buttonOne.
Na razie w ogóle program się wykonuje milion razy na sekundę, jedno naciśnięcie przycisku zauważy jako setki impulsów.
Gdybyś taki impuls np. na pin 13 zasymulował cyfrowo to led w takim programie:
digitalWrite(5, LOW); //led1 gaśnie
digitalWrite(4, HIGH); //led2 zapala się
zostanie zaświecony (czy zgaszony) na jakieś 63ns, nie zauważyłbyś takiego błysku. Nawet jeśli Aruduino ma te funkcje wolniejsze niż być powinny to i tak będzie to 1 -2 us.
Jak to ogarniesz to wystarczy wygenerować liczbę pseudolosową z grupy wszystkich kombinacji na tych przyciskach, dla 3 będzie 6 liczb, sprawdzić czy w określonym czasie są podawane cyfry tej liczby, ledy to wizualizują i każdy przycisk da inną cyfrę.
Bez mierzenia czasu nic nie zrobisz.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
Nigdzie w swoim programie nie odmierzasz czasu. Jakim więc cudem chcesz żeby czas na reakcję wyniósł 2 sekundy?
Ogarnij temat millis() i uciekaj od prób z wykorzystaniem delay();
 
Odpowiedź
#4
(31-03-2023, 17:40)MadMrQ napisał(a): Nigdzie w swoim programie nie odmierzasz czasu. Jakim więc cudem chcesz żeby czas na reakcję wyniósł 2 sekundy?
Ogarnij temat millis() i uciekaj od prób z wykorzystaniem delay();
Mój program celowo wyczyściłem po to żeby pokazać jak ma być to zbudowane. a czy istnieje funkcja która aktywuje/dezaktywuje czujnik(w tym przypadku guzik) tak żeby ten drugi był aktywny dopiero po naciśnięciu pierwszego, a trzeci po naciśnięciu drugiego?
 
Odpowiedź
#5
Taką funkcję musisz sobie napisać sam.
Żeby "zdezaktywować" przycisk musisz przestać w programie odpytywać o stan pinu, na którym go zainstalowałeś.

Polecam poczytać o bibliotece Button - powinna wyjaśnić wszystko.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości