Skocz do zawarto┼Ťci

Forbotowy robot - zmiana delay() na millis()


Pomocna odpowied┼║

Hej! 
Jeszcze jestem zielony, ale walcz─Ö. ­čśë
Moja wiedza to na razie kurs Arduino I i co┼Ť tam echem o millis.

Jestem w trakcie modyfikacji robota z forbotowego kursu, opr├│cz zmian w budowie, wprowadzam te┼╝ zmiany w programie.

Jednym z za┼éo┼╝e┼ä jest eliminacja wstrzymuj─ůcych program delay├│w.

 

Aktualnie pracuj─Ö nad sekcj─ů jazdy autonomicznej. Pope┼éni┼éem dzia┼éaj─ůcy program z millisami, ale kolega @ethanak┬áwskaza┼é mi, ┼╝e no nie do ko┼äca. ­čśë

Zatem, na pocz─ůtku kody z kursu (┼╝eby w jednym miejscu by┼éo):
Kontaktowe wykrywania/omijanie przeszk├│d:

if (digitalRead(L_SIDE_SENSOR) == LOW) {
    //Jesli przeszkoda po lewej stronie
    //Jedz wstecz i wydawaj dzwiek
    leftMotor(-40);
    rightMotor(-40);
    digitalWrite(BUZZER, 1);
    delay(800);
    //Obrot w miejscu w prawo
    leftMotor(40);
    rightMotor(-40);
    digitalWrite(BUZZER, 0);
    delay(140);
    //Koniec warunku wracamy do jazdy prosto
  }
 
  
  if (digitalRead(R_SIDE_SENSOR) == LOW) {
    //Jesli przeszkoda po prawej stronie
    //Jedz wstecz i wydawaj dzwiek
    leftMotor(-40);
    rightMotor(-40);
    digitalWrite(BUZZER, 1);
    delay(800);
    //Obrot w miejscu w lewo
    leftMotor(-40);
    rightMotor(40);
    digitalWrite(BUZZER, 0);
    delay(140);
    //Koniec warunku wracamy do jazdy prosto
  }

 

Wykrywanie przeszk├│d czujnikiem ultrad┼║wi─Ökowym:

void loop() {
  //Czy wykryto przeszkode w zakresie 0-40 cm
  if (zmierzOdleglosc() > 40) {
    leftMotor(40); //Jesli nie, to jedz prosto
    rightMotor(40);
  } else {
     //Jesli przeszkoda
     stopMotors(); //Zatrzymaj robota
     serwo.write(20); //Skrec czujnikiem w prawo
     delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji
 
    //Sprawdz, czy po prawej stronie jest przeszkoda
    if (zmierzOdleglosc() > 40) {
       //Jesli jest pusto
      leftMotor(40);
      rightMotor(-40);
      delay(400); //Obracaj w prawo przez 400 ms
    } else {
      //Je┼Ťli po prawej jest przeszkoda
      serwo.write(160); //Obroc czujnik w lewo
      delay(800); //Poczekaj 800ms dla ustabilizowania konstrukcji
 
      //Sprawdz, czy po lowej stronie jest przeszkoda
      if (zmierzOdleglosc() > 40) {
         //Jesli jest pusto
        leftMotor(-40);
        rightMotor(40);
        delay(400); //Obracaj w lewo przez 400 ms
      } else {
        //Jesli z przodu, z lewej i prawej jest przeszkoda
        digitalWrite(BUZZER, 1);
        delay(500);
        digitalWrite(BUZZER, 0);
        //Daj sygnal buzzerem
      }
    }
    //Po sprawdzeniu przeszkod po bokach
    //Ustaw czujnik prosto    
    serwo.write(90);
  }
 
  //Opoznienie 100ms, poniewa┼╝ nie ma potrzeby sprawdza─ç przeszkod czesciej
  delay(100); 
}

 

 

 

Aktualnie pope┼éni┼éem tak─ů funkcj─Ö, ┼é─ůcz─ůc─ů wykrywanie przeszk├│d przez kra┼äc├│wki i sonar:

void jazdaAuto() { //Funkcja jazdy autonomicznej
  ekspander.digitalWrite(LEDjazda, 1);
  unsigned long kontakt = 0; //Zmienne przechowuj─ůca czas startu
  unsigned long przeszkoda = 0;

  if (digitalRead(lewySensor) == LOW) { //Je┼╝eli przeszkoda po lewej
    zatrzymajSilniki();
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 100) {} //Poczekaj 100 ms
    lewySilnik(-80); //Cofnij kawałek
    prawySilnik(-80);
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 800) {} //Cofaj przez 800 ms
    lewySilnik(80); //Skr─Ö─ç w prawo
    prawySilnik(-80);
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 800) {} //Skr─Öcaj przez 800 ms
    zatrzymajSilniki();
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 100) {} //Poczekaj 100 ms
  }
  
  if (digitalRead(prawySensor) == LOW) { //Je┼╝eli przeszkoda po prawej
    zatrzymajSilniki();
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 100) {} //Poczekaj 100 ms
    lewySilnik(-80); //Cofnij kawałek
    prawySilnik(-80);
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 800) {} //Cofaj przez 800 ms
    lewySilnik(-80); //Skr─Ö─ç w lewo
    prawySilnik(80);
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 800) {} //Skr─Ö─ç w lewo przez 800 ms
    zatrzymajSilniki();
    kontakt = millis(); //Aktualizuj czas startu
    while (millis() - kontakt < 100) {} //Poczekaj 100 milisekund
  }
  
  if (sonarDystans() > 30) { // Je┼╝eli w odleg┼éo┼Ťci 30 cm nie ma przeszkody
    lewySilnik(90); // To jed┼║ prosto
    prawySilnik(90);
  } else { // Je┼╝eli wykry┼ée┼Ť przeszkod─Ö
    serwo.attach(SERWO_PIN); // Pod┼é─ůcz serwo
    zatrzymajSilniki();    
    serwo.write(700); // Skr─Ö─ç czujnikiem w prawo
    przeszkoda = millis();
    while(millis() - przeszkoda < 800) {}; //Poczekaj 800 ms
    if (sonarDystans() > 30) { // Je┼╝eli w odleg┼éo┼Ťci 30 cm nie ma przeszkody
      lewySilnik(70); // Skr─Öcaj w prawo
      prawySilnik(-70);
      serwo.write(1400); // Ustaw serwo do pozycji domy┼Ťlnej
      przeszkoda = millis();
      while(millis() - przeszkoda < 800) {}; // Skr─Öcaj przez 800 ms
      serwo.detach(); // Od┼é─ůcz serwo
    } else { // Je┼╝eli wykry┼ée┼Ť przeszkod─Ö
      serwo.write(2100); // Skr─Ö─ç czujnikiem w lewo
      przeszkoda = millis();
      while(millis() - przeszkoda < 800) {}; //Poczekaj 800 ms
      if (sonarDystans() > 30) { // Je┼╝eli w odleg┼éo┼Ťci 30 cm nie ma przeszkody
        lewySilnik(-70); // Skr─Öcaj w lewo
        prawySilnik(70);
        serwo.write(1400); // Ustaw serwo domy┼Ťlnie
        przeszkoda = millis();
        while(millis() - przeszkoda < 800) {}; // Skr─Öcaj przez 800 ms
        serwo.detach(); // Od┼é─ůcz serwo            
      } else { // Je┼╝eli z ka┼╝dej strony jest przeszkoda
        serwo.write(1400); // Ustaw serwo domy┼Ťlnie
        digitalWrite(BUZZER, 1); // Daj sygnał buzzerem
        przeszkoda = millis();
        while(millis() - przeszkoda < 500) {}; //Buzzer w┼é─ůczony przez 500 ms
        digitalWrite(BUZZER, 0); //Wy┼é─ůcz buzzer
        serwo.detach(); //Od┼é─ůcz serwo           
      }
    }
  }
  przeszkoda = millis();
  while (millis()-przeszkoda < 100) {} //Op├│┼║nienie 100 ms dla wykrywania przeszk├│d
}

 

Edytowano przez Danyeru
Link do komentarza
Share on other sites

W mi─Ödzyczasie pope┼éni┼éem takiego potworka, ale po wykryciu przeszkody z przodu, obraca┼é czujnik od razu w lewo i jak nie wykry┼é przeszkody, to rusza┼é do przodu nie odwracaj─ůc czujnika.
Wiem, ┼╝e gdzie┼Ť dzwoni, ale nie do ko┼äca...┬á­čśů

void jazdaAuto(){
  ekspander.digitalWrite(LEDjazda, 1);
  czasSonar = millis();
  roznicaSonar = czasSonar - odmierzSonar;
  if (roznicaSonar >= 100UL) {
    odmierzSonar = czasSonar;
    if (sonar() > 30) { //Je┼╝eli w odleg┼éo┼Ťci 30 cm brak przeszkody
    lewySilnik(95); //Jed┼║ prosto
    prawySilnik(95);
    }
      else {
        serwo.attach(SERWO_PIN); //Pod┼é─ůcz serwo
        zatrzymajSilniki();
        serwo.write(25); //Sp├│jrz w prawo
        czasPrawo = millis();
        roznicaPrawo = czasPrawo - odmierzPrawo;
        if (roznicaPrawo >= 500UL) {
          odmierzPrawo = czasPrawo;
          if (sonar() > 30) { //Je┼╝eli w odleg┼éo┼Ťci 30 cm brak przeszkoday
          lewySilnik(70); //Skr─Ö─ç w prawo
          prawySilnik(-70);
          czasSkretP = millis();
          roznicaSkretP = czasSkretP - odmierzSkretP;
            if (roznicaSkretP >= 1000UL){
              odmierzSkretP = czasSkretP;
              zatrzymajSilniki();
              serwo.write(85); //Ustaw serwo na wprost
              serwo.detach(); //Od┼é─ůcz serwo
            }
          }
            else {
              serwo.write(155); //Sp├│jrz w lewo
              czasLewo = millis();
              roznicaLewo = czasLewo - odmierzLewo;
                if (roznicaLewo >= 500) {
                  odmierzLewo = czasLewo;
                  if (sonar() > 30){ //Je┼╝eli w odleg┼éo┼Ťci 30 cm brak przeszkody
                    lewySilnik(-70); //Skr─Ö─ç w lewo
                    prawySilnik(70);
                    czasSkretL = millis();
                    roznicaSkretL = czasSkretL - odmierzSkretL;
                      if (roznicaSkretL >= 1000UL){
                        odmierzSkretL = czasSkretL;
                        zatrzymajSilniki();
                        serwo.write(85); //Ustaw serwo na wprost
                        serwo.detach(); //Od┼é─ůcz serwo
                      }
                  }
                    else {
                      serwo.write(85); //Ustaw serwo na wprost
                      serwo.detach(); //Od┼é─ůcz serwo
                      digitalWrite(BUZZER,1);
                      czasBuzzer = millis();
                      roznicaBuzzer = czasBuzzer - odmierzBuzzer;
                        if (roznicaBuzzer >= 500UL){
                          odmierzBuzzer = czasBuzzer;
                          digitalWrite(BUZZER,0);
                        }                      
                    }
                }
 
            }
        }
    }
  }
 
  if (digitalRead(lewySensor) == LOW) { //Je┼╝eli dotkniesz przeszkody po lewej
    zatrzymajSilniki();
    czasLewyDotyk = millis();
    roznicaLewyDotyk = czasLewyDotyk - odmierzLewyDotyk;
      if (roznicaLewyDotyk >= 100UL){ //Zatrzymaj si─Ö na 100 ms
        odmierzLewyDotyk = czasLewyDotyk;
        lewySilnik(-70); //Cofnij się kawałek
        prawySilnik(-70);
        czasLeweCofanie = millis();
        roznicaLeweCofanie = czasLeweCofanie - odmierzLeweCofanie;
          if (roznicaLeweCofanie >= 500UL) { //Cofaj przez 500 ms
            odmierzLeweCofanie = czasLeweCofanie;
            lewySilnik(70); //Obracaj w prawo
            prawySilnik(-70);
            czasLewyObrot = millis();
            roznicaLewyObrot = czasLewyObrot - odmierzLewyObrot;
              if (roznicaLewyObrot >= 1000UL){ //Obracaj przez sekund─Ö
                odmierzLewyObrot = czasLewyObrot;
                zatrzymajSilniki();
              }
          }
      }
  }
 
  if (digitalRead(prawySensor) == LOW) { //Je┼╝eli dotkniesz przeszkody po prawej
    zatrzymajSilniki();
    czasPrawyDotyk = millis();
    roznicaPrawyDotyk = czasPrawyDotyk - odmierzPrawyDotyk;
      if (roznicaPrawyDotyk >= 100UL){ //Zatrzymaj si─Ö na 100 ms
        odmierzPrawyDotyk = czasLewyDotyk;
        lewySilnik(-70); //Cofnij się kawałek
        prawySilnik(-70);
        czasPraweCofanie = millis();
        roznicaPraweCofanie = czasPraweCofanie - odmierzPraweCofanie;
          if (roznicaPraweCofanie >= 500UL) { //Cofaj przez 500 ms
            odmierzPraweCofanie = czasPraweCofanie;
            lewySilnik(-70); //Obracaj w lewo
            prawySilnik(70);
            czasPrawyObrot = millis();
            roznicaPrawyObrot = czasPrawyObrot - odmierzPrawyObrot;
              if (roznicaPrawyObrot >= 1000UL){ //Obracaj przez sekund─Ö
                odmierzPrawyObrot = czasPrawyObrot;
                zatrzymajSilniki();
              }
          }
      }
  }      
}


DHT22 pracuje na millis i jest ok, ale nie potrafię się odnaleźć w nieco bardziej złożonym przypadku.

Link do komentarza
Share on other sites

Ja bym to trochę zmienił i rozpisał maszynę stanów...millis() używasz tak często że być może lepsza opcja było by użycie funkcji...

fun(last_time, 1000); 

bool fun(uint32_t & last, uint32_t interval) { 
  if(millis() - last > interwal) { 
    last = millis(); 
    return true;
   } else { 
    return false;
 }

 

Edytowano przez farmaceuta
  • Lubi─Ö! 1
Link do komentarza
Share on other sites

@farmaceuta bardzo fajny przykład (tylko zmień typ drugiego argumentu na uint32_t i popraw literówkę)

@Danyeru┬áproblem w tym, ┼╝e traktujesz "delay" jako jaki┼Ť strasznie fujasty wynalazek diab┼éa i robisz w┼éasn─ů konstrukcj─Ö... kt├│ra w rzeczywisto┼Ťci robi dok┼éadnie to samo tylko z mniejsz─ů dok┼éadno┼Ťci─ů (w folderze instalacyjnym Arduino masz gdzie┼Ť plik wiring.c i mo┼╝esz zobaczy─ç jak dzia┼éa ten "systemowy" delay. Uprzedzam: funkcja yield() nie robi nic) i jest dok┼éadnie tak samo fujasta ­čÖé

W swoim kodzie masz co┼Ť takiego:

void loop() {
  zr├│b_co┼Ť();
  zr├│b_co┼Ť_jeszcze();
  poczekaj_chwilk─Ö();
}
  

Je┼Ťli chcesz pozby─ç si─Ö czekania, to raczej powinno by─ç co┼Ť w stylu:

void loop()
{
  if (przyszed┼é_czas_na_zrobienie_czego┼Ť()) zr├│b_co┼Ť();
  if (przyszed┼é_czas_na_zrobienie_czego┼Ť_jeszcze()) zr├│b_co┼Ť_jeszcze();
}
  

Je┼Ťli teraz owe "zr├│bcosie" potraktujesz tak samo, oka┼╝e si─Ö ┼╝e nie masz ┼╝adnych op├│┼║nie┼ä, ale za to wielce krzaczasty g─ůszcz if├│w... ale w┼éa┼Ťnie dlatego wymy┼Ťlono co┼Ť co si─Ö nazywa "maszyna stan├│w" i bardzo skutecznie eliminuje owe krzaki.

Tak przy okazji: "automat sko┼äczony" i "maszyna stan├│w" to takie bardzo m─ůdre nazwy, ale w rzeczywisto┼Ťci jest to ca┼ékiem proste i nie ma si─Ö czego obawia─ç.

Na tym polega owo "przestawienie my┼Ťlenia" o kt├│rym pisa┼éem na czacie.

Ale... je┼Ťli nie sko┼äczy┼ée┼Ť ca┼éego kursu Arduino (a zdaje si─Ö ┼╝e tylko pierwsz─ů cz─Ö┼Ť─ç) to lepiej sko┼äcz ca┼éy, bo takie przeskakiwanie do produ mo┼╝e by─ç nieskuteczne.

 

  • Lubi─Ö! 1
Link do komentarza
Share on other sites

Zarejestruj si─Ö lub zaloguj, aby ukry─ç t─Ö reklam─Ö.
Zarejestruj si─Ö lub zaloguj, aby ukry─ç t─Ö reklam─Ö.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i monta┼╝ PCB - wybierz sprawdzone PCBWay!
┬á┬á ÔÇó Darmowe p┼éytki dla student├│w i projekt├│w non-profit
┬á┬á ÔÇó Tylko 5$ za 10 prototyp├│w PCB w 24 godziny
┬á┬á ÔÇó Us┼éuga projektowania PCB na zlecenie
┬á┬á ÔÇó Monta┼╝ PCB od 30$ + bezp┼éatna dostawa i szablony
┬á┬á ÔÇó Darmowe narz─Ödzie do podgl─ůdu plik├│w Gerber
Zobacz r├│wnie┼╝ ┬╗ Film z fabryki PCBWay

To nie jest tak, ┼╝e sko┼äczy┼éem pierwsz─ů cz─Ö┼Ť─ç kursu i pozjada┼éem wszystkie rozumy, oczywi┼Ťcie b─Öd─Ö kontynuowa┼é. ­čśë

 

Tutaj zrobiłem jeden skok do przodu przy okazji czujnika DHT.

A, ┼╝e przegl─ůdaj─ůc forum pod tematami pierwszej cz─Ö┼Ťci kursu cz─Östo widzia┼éem w postach wypowiedzi typu "lepiej u┼╝yj millis, zainteresuj si─Ö millis", no to si─Ö zainteresowa┼éem nieco ponad kursem, mo┼╝e nieco na wyrost. ­čśů­čĄ¬

Robot oprócz jeżdżenia wysyła dane z czujnika i ma mieć konkretne sekwencje grup LED, zatem czy ten aktualny delay w manewrach nie wpłynie na te funkcje?

 

Zatem dzi─Ökuj─Ö za wskaz├│wki, zainteresuj─Ö si─Ö t─ů maszyn─ů stan├│w i tym rozwi─ůzaniem od Farmaceuty. ­čÖâ

Link do komentarza
Share on other sites

Delay won do kosza zanim nie┬á przejdxiesz na esp. A to tego co chcesz w┼éa┼Ťnie s─ů maszyny stan├│w (mo┼╝esz ich mie─ç wiecej ni┼╝ jedn─ů).

Link do komentarza
Share on other sites

(edytowany)

Dobra, id─Ö uczy─ç si─Ö dalej, a p├│ki co, ogarn─ů┼éem w ten spos├│b, dla sekcji z czujnikiem odleg┼éo┼Ťci:

 

enum States {
  PROSTO,
  PATRZ_PRAWO,
  OBROT_PRAWO,
  PATRZ_LEWO,
  OBROT_LEWO,
  ALARM,
  ZATRZYMAJ,
};

void jazdaAuto() { //Funkcja jazdy autonomicznej
  ekspander.digitalWrite(LEDjazda, 1); //W┼é─ůcz LED informuj─ůcy o je┼║dzie autonomicznej
  static States obecnyStan = PROSTO; //Domy┼Ťlny stan
  static unsigned long czasStanu = 0; //Zmienna dla timera
  const int doPrzeszkody = 20; //Odleg┼éo┼Ť─ç wykrywania przeszkody w cm

  switch (obecnyStan) {
    case PROSTO:
      if (sonarDystans() <= doPrzeszkody) { //Je┼╝eli w zadanej odleg┼éo┼Ťci jest przeszkoda
        obecnyStan = ZATRZYMAJ; //Przejd┼║ do zatrzymania
        czasStanu = millis(); //Ustaw czas dla timera
        serwo.attach(SERWO_PIN); //Pod┼é─ůcz serwo
      } else { //Jed┼║ prosto
        lewySilnik(90);
        prawySilnik(90);
      }
      break;

    case ZATRZYMAJ:
      zatrzymajSilniki();
      if (millis() - czasStanu >= 500) {
        obecnyStan = PATRZ_PRAWO; //Przejd┼║ do wykrywania przeszkody po prawej
        czasStanu = millis();
      }
      break;

    
    case PATRZ_PRAWO: //Wykrywanie przeszk├│d po prawej
      serwo.write(25); //Ustw serwo w prawo
      if (millis() - czasStanu >= 200) { //Patrz przez 200 ms dla ustabilizowania serwa
        if (sonarDystans() > doPrzeszkody) { //Je┼╝eli nie ma przeszk├│d bli┼╝ej ni┼╝ zadana odleg┼éo┼Ť─ç
          obecnyStan = OBROT_PRAWO; //Skr─Ö─ç w prawo
          czasStanu = millis(); //Ustaw czas dla timera
        } else { //Je┼╝eli jest przeszkoda
          obecnyStan = PATRZ_LEWO; //Przejd┼║ do wykrywania przeszkody po lewej
          czasStanu = millis(); //Ustaw czas dla timera
        }
      }
      break;
      
    case OBROT_PRAWO: //Skr─Öt w prawo
      lewySilnik(70);
      prawySilnik(-70);
      serwo.write(85); //Ustaw serwo na wprost      
      if (millis() - czasStanu >= 800) { //Skr─Öcaj przez 800 ms
        serwo.detach();
        obecnyStan = PROSTO; //Przejd┼║ do jazdy na prosto
        czasStanu = millis(); //Uataw czas dla timera
      }
      break;

    case PATRZ_LEWO: //Wykrywanie przeszk├│d po lewej
      serwo.write(155); //Obr├│─ç serwo w lewo
      if (millis() - czasStanu >= 250) { //Patrz przez 200 ms dla ustabilizowania serwa
        if (sonarDystans() > doPrzeszkody) { //Je┼╝eli nie ma przeszkody w zadanej odleg┼éo┼Ťci
          obecnyStan = OBROT_LEWO; //Skr─Ö─ç w lewo
          czasStanu = millis(); //Ustaw czas dla timera
        } else { //Je┼╝eli jest przeszkoda
          obecnyStan = ALARM; //W┼é─ůcz alarm
          czasStanu = millis(); //Ustaw czas dla timera
        }
      }
      break;

    case OBROT_LEWO: //Skr─Öt w lewo
      lewySilnik(-70);
      prawySilnik(70);
      serwo.write(85); //Ustaw serwo na wprost
      if (millis() - czasStanu >= 800) { //Skr─Öcaj przez 800 ms
        serwo.detach();
        obecnyStan = PROSTO; //Przejd┼║ do jazdy prosto
        czasStanu = millis(); //Ustaw czas dla timera
      }
      break;

    case ALARM:
      serwo.write(85); //Ustaw serwo na wprost
      digitalWrite(BUZZER, 1); //W┼é─ůcz buzzer
      if (millis() - czasStanu >= 500) { //Po upływie 500 ms
        digitalWrite(BUZZER, 0); //Wy┼é─ůcz buzzer
        serwo.detach();
        obecnyStan = PROSTO; //Przejd┼║ do jazdy prosto
        czasStanu = millis(); //Ustaw czas dla timera
      }
      break;
}

 

Edytowano przez Danyeru
Link do komentarza
Share on other sites

No i w┼éa┼Ťnie z┼éapa┼ée┼Ť o co chodzi.To co prawda jeszcze nie jest taki kod jak powinien by─ç docelowo, ale zasada jest w┼éa┼Ťnie taka.

  • Lubi─Ö! 2
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.