Treker (Damian Szymański) Listopad 17, 2018 Udostępnij Listopad 17, 2018 @tomica28, witam na forum Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start: Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników. Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć? Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości. Dnia 15.11.2018 o 16:31, tomica28 napisał: W kodzie jest błąd, ponieważ po wpisaniu pinu i ponownym uzbrojeniu ,i próbie wpisania pinu licznik pozycji nie jest przywracany do pozycji początkowej, co powoduje wywołanie alarmu Chodzi Ci o program z kursu, czy o program umieszczony przez innych użytkowników w komentarzach?
Treker (Damian Szymański) Listopad 19, 2018 Udostępnij Listopad 19, 2018 @tomica28, ok to gratuluję czujności i dziękuję za zgłoszenie, nikt wcześniej tego nie wychwycił. Zapisuję do poprawy
Mijaw92 Grudzień 2, 2018 Udostępnij Grudzień 2, 2018 Hej, Chcąc załadować program #include <Keypad.h> //biblioteka od klawiatury const byte ROWS = 4; // ile wierszy const byte COLS = 4; //ile kolumn byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy byte colPins[COLS] = {6, 7, 8, 9}; //piny kolum char keys[ROWS][COLS] = { //mapowanie klawiatury {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury void setup(){ Serial.begin(9600); } void loop(){ char klawisz = klawiatura.getKey(); if (klawisz){ Serial.println(klawisz); } } Wyskoczył błąd, że podana biblioteka Keypad nie istnieje. Znalazłem tę bibliotekę pod inna nazwą "Keyboard", załadowałem ją i zmieniłem linijkę: Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); na: Keyboard klawiatura = Keyboard( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); Teraz wyskakuje błąd: Arduino:1.8.5 (Windows 7), Płytka:"Arduino/Genuino Uno" In file included from C:\Users\MICHA~1\AppData\Local\Temp\arduino_modified_sketch_828268\sketch_dec02b.ino:1:0: E:\Elektronika\Arduino\libraries\Keyboard\src/Keyboard.h:29:2: warning: #warning "Using legacy HID core (non pluggable)" [-Wcpp] #warning "Using legacy HID core (non pluggable)" ^ sketch_dec02b:17: error: 'Keyboard' does not name a type Keyboard klawiatura = Keyboard( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury ^ C:\Users\MICHA~1\AppData\Local\Temp\arduino_modified_sketch_828268\sketch_dec02b.ino: In function 'void loop()': sketch_dec02b:24: error: 'klawiatura' was not declared in this scope char klawisz = klawiatura.getKey(); ^ exit status 1 'Keyboard' does not name a type Ten raport powinien zawierać więcej informacji jeśli w File -> Preferencje zostanie włączona opcja "Pokaż szczegółowe informacje podczas kompilacji" Nie bardzo wiem o co chodzi
Treker (Damian Szymański) Grudzień 7, 2018 Udostępnij Grudzień 7, 2018 @Mijaw92, witam na forum Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start: Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników. Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć? Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości. Dnia 2.12.2018 o 21:00, Mijaw92 napisał: Wyskoczył błąd, że podana biblioteka Keypad nie istnieje. Znalazłem tę bibliotekę pod inna nazwą "Keyboard", załadowałem ją i zmieniłem linijkę: Jaką masz pewność, że to odpowiednia biblioteka? Jeśli wybrałeś inną bibliotekę to programy nie będą działały - zmiana nazwy to zdecydowanie za mało. Biblioteka używana w kursie jest cały czas dostępna na GitHubie - link znajduje się w artykule. Zainstaluj ją i na pewno wszystko zadziała
brunobu Styczeń 9, 2019 Udostępnij Styczeń 9, 2019 @Treker mam pytanie czy dało by się dodać rysunki do drugiego kurs arduino tak jak w pierwszym? @Mijaw92 mam tak samo i również nie wiem co zrobić
Treker (Damian Szymański) Styczeń 9, 2019 Udostępnij Styczeń 9, 2019 @brunobu, witam na forum Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start: Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników. Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć? Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości. 2 godziny temu, brunobu napisał: @Treker mam pytanie czy dało by się dodać rysunki do drugiego kurs arduino tak jak w pierwszym? O jakie rysunki dokładnie pytasz? 2 godziny temu, brunobu napisał: @Mijaw92 mam tak samo i również nie wiem co zrobić Zainstaluj poprawną bibliotekę i nie będzie problemu. To, że biblioteka nazywa się tak samo to nic nie znaczy. Trzeba zainstalować dokładnie tę, która jest używana w kursie (link do GitHuba znajduje się w artykule).
Treker (Damian Szymański) Styczeń 11, 2019 Udostępnij Styczeń 11, 2019 Na ten moment nie planujemy takich schematów montażowych w tym kursie, ale zapisuję na listę sugestii. Jest szansa, że przy kolejnej aktualizacji uda się dodać takie grafiki. Mam jednak nadzieję, że na tym poziomie kursu (po wykonaniu ćwiczeń z poprzedniej serii) nie powinno być już większych problemów z samodzielnym złożeniem opisywanych tu układów na podstawie dostarczonych zdjęć i opisów
damianloew Sierpień 4, 2019 Udostępnij Sierpień 4, 2019 Witam, przy próbie zrealizowania przycisku Reset za pomocą przerwania, układ wcale nie reaguje na wciśnięcie przycisku i alarm nadal jest włączony. Co może być tutaj problemem? Do tego mam jeszcze pytanie dotyczące kondensatora przy diodach programowalnych. W części gdzie były one omawiane zastosowano kondensator i rezystor. W tej części kursu nie został użyty kondensator (także użyłem tylko rezystora i wszystko działa). Mam jeszcze problem z drobnymi zakłóceniami na buzzerze bez generatora (bardzo cichy pisk o różnej intensywności, np. w trakcie stanu czuwania, kiedy dioda bardzo szybko miga buzzer bardzo cicho 'pipka' w tempie migania diody), jakie są metody na zniwelowanie takich zakłóceń? Materiał bardzo solidnie wytłumaczony, myśle że dobrym pomysłem są dłuższe programy. Poniżej załączam cały kod. #include <Keypad.h> //biblioteka ulatwiajaca kontakt z klawiatura #include <Adafruit_NeoPixel.h> //biblioteka od panelu z ledami const byte ROWS = 4; //ile wierszy const byte COLS = 4; //ile kolumn //sa to stale dlatego const byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy, chyba chodzi o to ze to wektor o wielkosci zadeklarowanej jako ROWS byte colPins[COLS] = {6, 7, 8, 9}; //piny kolumn, wszystko widac na klawiaturze wystarczy sie przyjrzec char keys[ROWS][COLS]= //MAPOWANIE KLAWISZY, wychodzi na to ze to deklaracja macierzy o ROWS wierszach i COLS kolumnach składająca sięze znaków (char) o nazwie keys i wypisywane sa kolejne wiersze po przecinku { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; Keypad klawiatura = Keypad ( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //inicjalizacja klawiatury, po kolei mapa znakow klawiatury, piny wierszy, piny kolumn, liczba wierszy, liczba kolumn Adafruit_NeoPixel panelLED = Adafruit_NeoPixel(8, A1, NEO_GRB + NEO_KHZ800); #define buzzer 13 #define kontaktron 10 #define czujnikRuchu 11 #define przyciskReset 1 //cos nie dziala char klawisz = 0; //zmienna typu znak, ktora przyjmuje wartosc znaku odpowiadajacego wcisnietemu klawiszowi, jezli zaden nie zostanie int i=0; volatile int stanAlarmu = 1; byte pozycjaPinuAlarmu=1; //pozycja pinu, ktory musimy wpisac zeby bezpiecznei wejsc char pinCyfra1 = '1'; //nasz pin uniewazniajacy alarm char pinCyfra2 = '2'; char pinCyfra3 = '3'; char pinCyfra4 = '4'; int czasWpisywania = 0; //czas wpisywania pinu, max mamy 5s, z kazdym wejsciem w case 3 mamy opoznienie 50ms i wtedy za kazdym razem dodajemy do tej zmiennej 50, kiedy bedzie 50000 to alarm void setup() { attachInterrupt(digitalPinToInterrupt(przyciskReset), Reset, FALLING); Serial.begin(9600); pinMode(buzzer, OUTPUT); //ustawienie wyjsc/wejsc pinMode(kontaktron, INPUT_PULLUP); pinMode(czujnikRuchu, INPUT_PULLUP); pinMode(przyciskReset, INPUT_PULLUP); panelLED.begin(); panelLED.show(); } void loop() { switch (stanAlarmu) { case 1: //stan 1 czyli czuwanie, system czeka na uzbrojenie (az bedziemy wychodzic z domu panelLED.setPixelColor(0, panelLED.Color(0, 20, 0)); //dioda swieci na zielono, system nie jest uzbrojony panelLED.show(); klawisz = klawiatura.getKey(); if (klawisz=='A') //jezeli wcisniemy A na klawiaturze to system przechodzi w 2gi stan { for( i=1; i<=7; i++) //taka animacja uzbrajania, ktora trwa ok. 10s { panelLED.setPixelColor(i, panelLED.Color(0, 0, 20)); panelLED.show(); tone(buzzer, (900+i*200),100); //dzwiek do uzbrajania alarmu delay(710); } for(i=7; i>=1; i--) { panelLED.setPixelColor(i, panelLED.Color(20, 0, 0)); panelLED.show(); tone(buzzer, (900+i*200),100); //dzwiek do uzbrajania alarmu delay(710); } ZgaszeniePanelu(); stanAlarmu = 2; } break; case 2: // stan 2 czyli uzbrojenie, uaktywnia sie on po wcisnieciu A na klawiaturze panelLED.setPixelColor(7, panelLED.Color(20, 0, 0)); //system uzbrojony, ostatnia dioda miga szybko na czerwono (zeby bylo widac ze sytem caly czas dziala panelLED.show(); delay(50); panelLED.setPixelColor(7, panelLED.Color(0, 0, 0)); panelLED.show(); delay(50); if(digitalRead(kontaktron)== HIGH) //jezeli ktos otworzy drzwi - styki sie oddala, czyli stan wysoki bo nie laczy z masa to dajemy szanse na wpisanie kodu, czyli stan 3 { stanAlarmu=3; czasWpisywania=0; } else { if(digitalRead(czujnikRuchu)==HIGH) //jezeli czujnik wykryje ruch to stan 4 czyli od razu alarm { stanAlarmu=4; } } break; case 3: delay(50); czasWpisywania=czasWpisywania+50; klawisz = klawiatura.getKey(); //klawisz jest to znak, z klawisza ktory wciskamy (ten wynikajacy z mapowania if(klawisz) //jezeli zostanie odebrana jakas wartosc z klawiatury { tone(buzzer, 1000, 50); if(pozycjaPinuAlarmu == 1 && klawisz == pinCyfra1) //jezeli jestesmy na pozycji pierwszej i sie zgadza to idziemy dalej jezeli nie od razu alarm itd { pozycjaPinuAlarmu=2; } else { if(pozycjaPinuAlarmu == 2 && klawisz == pinCyfra2) { pozycjaPinuAlarmu=3; } else { if(pozycjaPinuAlarmu == 3 && klawisz == pinCyfra3) { pozycjaPinuAlarmu=4; } else { if(pozycjaPinuAlarmu == 4 && klawisz == pinCyfra4) { pozycjaPinuAlarmu=1; stanAlarmu=1; delay(50); //po to, zeby nie bylo charakterystycznej zmiany dzwieku na buzzerze przy ostatnim wcisnieciu } else { stanAlarmu=4; } } } } } if(czasWpisywania >= 5000) //jezeli zbyt dlugo wpisujemy (dluzej niz 5s) to wlacza sie alarm { stanAlarmu=4; } break; case 4: //wlacza sie alarm for(i=0 ;i<=7;i=i+2) { panelLED.setPixelColor(i, panelLED.Color(255, 0, 0)); panelLED.show(); panelLED.setPixelColor(i+1, panelLED.Color(0, 0, 255)); panelLED.show(); tone(buzzer, 3600+(i*100),40); delay(40); } for(i=6;i>=0;i=i-2) { panelLED.setPixelColor(i, panelLED.Color(0, 0, 255)); panelLED.show(); panelLED.setPixelColor(i+1, panelLED.Color(255, 0, 0)); panelLED.show(); tone(buzzer, 3600+(i*100),40); delay(40); } break; } Serial.println(stanAlarmu); } void ZgaszeniePanelu() { panelLED.clear(); panelLED.show(); } void Reset() { stanAlarmu=1; }
ethanak Sierpień 4, 2019 Udostępnij Sierpień 4, 2019 Nie możesz używać pinów 0 i 1 jeśli używasz Serial. @Treker - nie da się jakoś tej informacji wpleść w kurs? Bo ja już tyle razy to piszę że chyba wrzucę sobie do sygnaturki 2
Treker (Damian Szymański) Sierpień 4, 2019 Udostępnij Sierpień 4, 2019 31 minut temu, ethanak napisał: @Treker - nie da się jakoś tej informacji wpleść w kurs? Bo ja już tyle razy to piszę że chyba wrzucę sobie do sygnaturki Będzie to (i nie tylko to) podczas wielkiego odświeżania kursu, ale trochę to jeszcze zajmie. 1
damianloew Sierpień 5, 2019 Udostępnij Sierpień 5, 2019 @ethanak Racja, zapomniałem usunąć tej linijki. Jednak po usunięciu problem nadal występuje, wiem że piny 0 i 1 są też wykorzystywane przy wgrywaniu programu na płytkę, a to udało się zrobić. Dla pewności sprawdziłem jeszcze czy bez jakiejkolwiek komunikacji z komputerem układ będzie działał poprawnie (podłączenie tylko do zasilacza) i przycisk resetu wtedy także nie działa. Dodam jeszcze, że z pinem 2 wszystko działa poprawnie, jednak nie rozumiem dlaczego bez komunikacji z komputerem wykorzzystanie pinu 1 także jest kłopotliwe. Załączam jeszcze poprawiony kod. Cała reszta systemu oprócz przycisku Resetu działa prawiodłowo. #include <Keypad.h> //biblioteka ulatwiajaca kontakt z klawiatura #include <Adafruit_NeoPixel.h> //biblioteka od panelu z ledami const byte ROWS = 4; //ile wierszy const byte COLS = 4; //ile kolumn //sa to stale dlatego const byte rowPins[ROWS] = {5, 4, 3, 2}; //piny wierszy, chyba chodzi o to ze to wektor o wielkosci zadeklarowanej jako ROWS byte colPins[COLS] = {6, 7, 8, 9}; //piny kolumn, wszystko widac na klawiaturze wystarczy sie przyjrzec char keys[ROWS][COLS]= //MAPOWANIE KLAWISZY, wychodzi na to ze to deklaracja macierzy o ROWS wierszach i COLS kolumnach składająca sięze znaków (char) o nazwie keys i wypisywane sa kolejne wiersze po przecinku { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; Keypad klawiatura = Keypad ( makeKeymap(keys), rowPins, colPins, ROWS, COLS); //inicjalizacja klawiatury, po kolei mapa znakow klawiatury, piny wierszy, piny kolumn, liczba wierszy, liczba kolumn Adafruit_NeoPixel panelLED = Adafruit_NeoPixel(8, A1, NEO_GRB + NEO_KHZ800); #define buzzer 13 #define kontaktron 11 #define czujnikRuchu 12 #define przyciskReset 1 char klawisz = 0; //zmienna typu znak, ktora przyjmuje wartosc znaku odpowiadajacego wcisnietemu klawiszowi, jezli zaden nie zostanie int i=0; volatile int stanAlarmu = 1; byte pozycjaPinuAlarmu=1; //pozycja pinu, ktory musimy wpisac zeby bezpiecznei wejsc char pinCyfra1 = '1'; //nasz pin uniewazniajacy alarm char pinCyfra2 = '2'; char pinCyfra3 = '3'; char pinCyfra4 = '4'; int czasWpisywania = 0; //czas wpisywania pinu, max mamy 5s, z kazdym wejsciem w case 3 mamy opoznienie 50ms i wtedy za kazdym razem dodajemy do tej zmiennej 50, kiedy bedzie 50000 to alarm void setup() { attachInterrupt(digitalPinToInterrupt(przyciskReset), Reset, FALLING); pinMode(buzzer, OUTPUT); //ustawienie wyjsc/wejsc pinMode(kontaktron, INPUT_PULLUP); pinMode(czujnikRuchu, INPUT_PULLUP); pinMode(przyciskReset, INPUT_PULLUP); panelLED.begin(); panelLED.show(); } void loop() { switch (stanAlarmu) { case 1: //stan 1 czyli czuwanie, system czeka na uzbrojenie (az bedziemy wychodzic z domu panelLED.setPixelColor(0, panelLED.Color(0, 20, 0)); //dioda swieci na zielono, system nie jest uzbrojony panelLED.show(); klawisz = klawiatura.getKey(); if (klawisz=='A') //jezeli wcisniemy A na klawiaturze to system przechodzi w 2gi stan { for( i=1; i<=7; i++) //taka animacja uzbrajania, ktora trwa ok. 10s { panelLED.setPixelColor(i, panelLED.Color(0, 0, 20)); panelLED.show(); tone(buzzer, (900+i*200),100); //dzwiek do uzbrajania alarmu delay(710); } for(i=7; i>=1; i--) { panelLED.setPixelColor(i, panelLED.Color(20, 0, 0)); panelLED.show(); tone(buzzer, (900+i*200),100); //dzwiek do uzbrajania alarmu delay(710); } ZgaszeniePanelu(); stanAlarmu = 2; } break; case 2: // stan 2 czyli uzbrojenie, uaktywnia sie on po wcisnieciu A na klawiaturze panelLED.setPixelColor(7, panelLED.Color(20, 0, 0)); //system uzbrojony, ostatnia dioda miga szybko na czerwono (zeby bylo widac ze sytem caly czas dziala panelLED.show(); delay(50); panelLED.setPixelColor(7, panelLED.Color(0, 0, 0)); panelLED.show(); delay(50); if(digitalRead(kontaktron)== HIGH) //jezeli ktos otworzy drzwi - styki sie oddala, czyli stan wysoki bo nie laczy z masa to dajemy szanse na wpisanie kodu, czyli stan 3 { stanAlarmu=3; czasWpisywania=0; } else { if(digitalRead(czujnikRuchu)==HIGH) //jezeli czujnik wykryje ruch to stan 4 czyli od razu alarm { stanAlarmu=4; } } break; case 3: delay(50); czasWpisywania=czasWpisywania+50; klawisz = klawiatura.getKey(); //klawisz jest to znak, z klawisza ktory wciskamy (ten wynikajacy z mapowania if(klawisz) //jezeli zostanie odebrana jakas wartosc z klawiatury { tone(buzzer, 1000, 50); if(pozycjaPinuAlarmu == 1 && klawisz == pinCyfra1) //jezeli jestesmy na pozycji pierwszej i sie zgadza to idziemy dalej jezeli nie od razu alarm itd { pozycjaPinuAlarmu=2; } else { if(pozycjaPinuAlarmu == 2 && klawisz == pinCyfra2) { pozycjaPinuAlarmu=3; } else { if(pozycjaPinuAlarmu == 3 && klawisz == pinCyfra3) { pozycjaPinuAlarmu=4; } else { if(pozycjaPinuAlarmu == 4 && klawisz == pinCyfra4) { pozycjaPinuAlarmu=1; stanAlarmu=1; delay(50); //po to, zeby nie bylo charakterystycznej zmiany dzwieku na buzzerze przy ostatnim wcisnieciu } else { stanAlarmu=4; } } } } } if(czasWpisywania >= 5000) //jezeli zbyt dlugo wpisujemy (dluzej niz 5s) to wlacza sie alarm { stanAlarmu=4; } break; case 4: //wlacza sie alarm for(i=0 ;i<=7;i=i+2) { panelLED.setPixelColor(i, panelLED.Color(255, 0, 0)); panelLED.show(); panelLED.setPixelColor(i+1, panelLED.Color(0, 0, 255)); panelLED.show(); tone(buzzer, 3600+(i*100),40); delay(40); } for(i=6;i>=0;i=i-2) { panelLED.setPixelColor(i, panelLED.Color(0, 0, 255)); panelLED.show(); panelLED.setPixelColor(i+1, panelLED.Color(255, 0, 0)); panelLED.show(); tone(buzzer, 3600+(i*100),40); delay(40); } break; case 5: ZgaszeniePanelu(); stanAlarmu=1; break; } Serial.println(stanAlarmu); } void ZgaszeniePanelu() { panelLED.clear(); panelLED.show(); } void Reset() { stanAlarmu=5; }
ethanak Sierpień 5, 2019 Udostępnij Sierpień 5, 2019 5 minut temu, damianloew napisał: Dla pewności sprawdziłem jeszcze czy bez jakiejkolwiek komunikacji z komputerem układ będzie działał poprawnie (podłączenie tylko do zasilacza) i przycisk resetu wtedy także nie działa Piny 0 i 1 są (w uproszczeniu, dotyczy Arduino UNO i całej reszty na ATmega 328) używane: do wgrywania programu na płytkę do komunikacji Serial jako piny GPIO ogólnego przeznaczenia Przy czym: Jeśli coś jest podłączone do tych pinów, należy odłączyć to coś na czas wgrywania programu (nie zawsze jest to konieczne, ale warto się przyzwyczaić) Jeśli używamy w programie Serial.cośtam() nie możemy z oczywistych przyczyn użyć tych pinów do innych celów. Ogólnie: jeśli nie musimy, to nie używamy w programie tych pinów do innych rzeczy niż Serial, a jeśli już - to z pełną świadomością. Nie jestem pewien, jak Arduino zareaguje na niezainicjalizowany Serial, ale została Ci jeszcze jedna linijka Serial.println(). 2
damianloew Sierpień 5, 2019 Udostępnij Sierpień 5, 2019 @ethanak Usunąłem linijkę Serial.println z kodu oraz na czas wgrywania programu odłączyłem przewód z pinu 1. Nadal układ nie reaguje w żaden sposób na wciśnięcie przycisku. Dzięki za odpowiedzi, nie wiem dlaczego nadal przerwanie nie działa, może w jakiś inny sposób użycie tego pinu nie jest możliwe. Na przyszłość będę unikał takich sytuacji.
Pomocna odpowiedź
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ę »