• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Arduino zamek na kolejno wciskane klawisze

Object Storage Arubacloud
+3 głosów
906 wizyt
pytanie zadane 5 kwietnia 2015 w C i C++ przez Wiru Początkujący (400 p.)
Witam, jak w/w problem nie wiem jak najsensowniej go ugryźć, bo stosowanie funkcji if() jest mało przejrzyste a pewnie da się to zrobić w prostszy sposób co miał by robic kod

1ON,2OFF>>1ON,2ON>>1OFF,2ON>>1OFF,2OFF

Przy bardziej złożonej kombinacji stosowanie if staje się maksymanie nieprzejrzyste. :/

@Edit: np po zastosowaniu odpowiedniej kombinacji tych przycisków zaświeci się dioda.

Pozdrawiam, Adam.

3 odpowiedzi

+2 głosów
odpowiedź 5 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)

Osobiście polecałbym użycie tablicy jednowymiarowej. W tablicy ustawiamy, np. kod 5 znakowy i pętlą for sprawdzamy czy kolejno użyte przyciski odpowiadają kolejnym indeksom w tablicy.

Oto przykład:

#include <iostream>

bool tab [5] = {1,1,0,1,0,};
bool tab1 [5];
using namespace std;
int z;
int main()
{
	 cout<<"Wprowadz kod uzywajac przyciskow 1 i 0 \n";
	 for (int i = 0; i<5;i++)
	 {
	 	cin>>tab1 [i];
	 }
	 for (int s = 0; s <5; s++)
	 {
	 	if (tab1 [s] == tab [s])
	 	{
	 		z++;
		}
	 }
	 if(z == 5)
	 cout<< "Podales poprawny kod, gratulacje";
	 else
	 cout<< "Bledny kod!!";
	 
}

Ja użyłem zmiennej "z" jako sumy kontrolnej.

Mam nadzieję, że pomogłem.

Pozdrawiam

komentarz 5 kwietnia 2015 przez Wiru Początkujący (400 p.)

Jak najbardziej :) jednak z tym samym problemem co wyżej. Nie jestem tu w stanie rozróżnić kiedy mam wciśnięte jednocześnie 2 przyciski tz może to wyglądać tak

1 dla 1ON

0 dla 2 ON

1ON,2OFF (tutaj nabijamy np 1)>>1ON,2ON (teraz nabijamy 0)>>1OFF,2ON (teraz nic się nie zmieni) == czyli nasza tablica to [10]

Dokładnie taki sam efekt otrzymamy wciskając taką oto kombinacje

1ON,2OFF>>1OFF,2ON == też mamy [10]

cały problem polega na tym w jaki sposób mogę jak by każdą możliwą opcję dla innej wartości kodowej. Tz, że np dla 1OFF,2OFF wartość bd 0 ect tak jak napisałem wyżej 
"0=1OFF,2OFF

1=1ON,2OFF 

2=1OFF,2ON

3=1ON,2ON"

tz po jednoczesnym wciśnięciu 0 i 1 daje nam wartość wyjściową 3 i taka jest zapisana w kodzie czyli rozpatrując przykład wyżej

1ON,2OFF(daje nam to wartośc 1)>>(cały czas trzymając klawisz 1 wciskamy klawisz 2)1ON,2ON(co daje nam wartośc wyjściową 3)>>(teraz trzymając klawisz 2 puszczamy klawisz 1)1OFF,2ON(co daje nam wartośc wyjściową 2) == teraz nasza tabela wygląda tak [132] zamiast jak wyżej [10] i tutaj w głównej mierze leży problem :/
Oczywiście daje plusik 

 

komentarz 5 kwietnia 2015 przez Arsetus Gaduła (4,760 p.)

Używając zmiennej typu "bool" można zapobiegnąć tego typu wypadkom. W indeksach tablicy nie można zapisać innych wartości niż 0 oraz 1.

W moim przykładzie do jednego indeksu można wpakować tylko jedną wartość.

Jeśli dalej widzisz jakiś problem to polecam poczytać ten rozdział kursu:

http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Wyszukiwanie-frazy-w-tekscie/352

Abyś wyciągnął z tego kursu jak najwięcej, naprowadzę cię tylko co powinieneś zrobić z tą wiedzą, a mianowicie:

Stworzenie zmiennej typu "string", i sprawdzanie po kolei jej znaków, np. jeśli wpisano 101 to dla każdego znaku po kolei sprawdza czy jest on jedynka lub zerem i przypisuje go do odpowiedniego indeksu w tablicy. Wszystko powinno być w pętli.

Pozdrawiam.

komentarz 5 kwietnia 2015 przez Wiru Początkujący (400 p.)

Nie rozumiem dlaczego mam używać stringa. jeśli np użyje obrazowo coś takiego

 

byte tab [5];

  byte zap [5] = {2,3,1,0,2}; //Kod, 

//teraz chciał bym ładnie switch odpytać wartości tz

switch(){
case 1: (digitalRead(1)==LOW && digitalRead(2)==LOW)
wpisz 0


case 2: (digitalRead(1)==HIGH && digitalRead(2)==LOW)
wpisz na następne pole 1

case 3: (digitalRead(1)==LOW && digitalRead(2)==HIGH)
wpisz na następne pole 2

case 4: (digitalRead(1)==HIGH && digitalRead(2)==HIGH)
wpisz na następne pole 3

break;
}

(poglądowo pewnie są blędy)

z tym, że nie wiem w jaki sposób użyć w tym wypadku w/w sumy kontrolnej, lub jak kto woli jak dobrze użyć pętli for by zliczała mi zmiany stanów np z 1ON,2ON na 1OFF,2ON i dodała w tym momęcie 1. być może mój trop z case jest błędny i powinienem go całkowicie zastąpić pętlami for?

+1 głos
odpowiedź 5 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Nie znam się, ale wypowiem ;-)

A może zrobić np. zmienną (string), do której przycisk ON dodaje  "1" a OFF "0", i po kilku wciśnięciach byłoby np coś takiego: "00110101011100" i funkcja która wyszukuje odpowiedni ciąg i jeżeli jest on na końcu stringa to otwiera zamek?

Oczywiście należy to jakoś zabezpieczyć przed "przepełnieniem" zmiennej itp. w tym wypadku jest tylko jeden if.
komentarz 5 kwietnia 2015 przez Wiru Początkujący (400 p.)
Bardzo dobry pomysł z jednym małym problemem, że string nie wykryje mi wciśnięcia 2 przycisków jednocześnie. tz że mogę puścić poprzedni przycisk a string i tak wpisze np 0 które odpowiadało by np za 2 przycisk. Jednak można np zastosować funkcje char, i np zdefiniować

0=1OFF,2OFF

1=1ON,2OFF

2=1OFF,2ON

3=1ON,2ON

 

I to by wyglądało już całkiem fajnie bo można w łatwy sposób modyfikować kod bd starał się coś takiego skonstułować, w razie pytań na pewno zgłoszę się po następne pomoce.
komentarz 5 kwietnia 2015 przez Kabotyn Mądrala (5,650 p.)
Dokładnie. A do porównywania kodu własciwego z kodem "wyciskanym" możesz się zastanowić czy np. nie zrobić tablicy char która ma zawsze np. 10 znaków (długość kodu) i nowe znaki zawsze dodaje na końcu, a początkowe wywala. Wtedy wystarczy porównać zawartość dwóch tablic.

Chociaż, tablice to chyba zły pomysł lepsze byłoby coś w stylu listy albo kolejki.

Tak rzucam tylko pomysłami.
0 głosów
odpowiedź 5 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Może użyj switcha, jak nie da rady to jesteś niestety skazany na ify.

Podobne pytania

+4 głosów
2 odpowiedzi 976 wizyt
pytanie zadane 6 kwietnia 2015 w C i C++ przez Wiru Początkujący (400 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 9 czerwca 2023 w C i C++ przez Bartek7630 Nowicjusz (190 p.)
+1 głos
3 odpowiedzi 1,144 wizyt

92,620 zapytań

141,471 odpowiedzi

319,805 komentarzy

62,003 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...