Skocz do zawartości

Resetowanie esp32 przy dotknięciu obudowy wyświetlacza i2C


startrek1p2p

Pomocna odpowiedź

Hej,
Mam taki dziwny problem, który zaczął występować po około roku normalnego działania.
Zrobiłem projekt, który składał się z esp32, przycisków, wyświetlacza lcd 2x16 na i2c oraz modułu podwójnego przekaźnika.
Wszystko to razem połączone działało bardzo dobrze, aż pewnego razu podczas użytkowania wyświetlacz włączył podświetlenie, mimo iż w kodzie w danym miejscu nie powinien. W miejscu gdzie miał wyświetlać tekst, pojawiły się krzaczki. Po kilku wystąpieniach tego błędu zacząłem sprawdzać co jest nie tak i stwierdziłem, że wyświetlacz jest do wymiany. Po jego wymienieniu nic się nie poprawiło, więc wymieniłem całą resztę: ESP, ponownie wyświetlacz wraz z większością okablowania oraz wgrałem ten sam kod tylko ze zmienionymi pinami.

IMG20240125184442.thumb.jpg.24f397e4f79cc9c5dfbe00bdaae487e0.jpgIMG20240125184447.thumb.jpg.db666e26e7c703d36adae6a63e537d94.jpg
Dalej nic to nie dało więc wymieniłem wyświetlacz po raz trzeci, z takim samym skutkiem.

Ostatnio jednak zauważyłem pewną prawidłowość. Po włączeniu prądu mogę normalnie dotykać wyświetlacz i wszystko działa jak należy.

VID20240126170608.thumb.gif.6851cefa3b0c06d21a7b36874a288233.gif

Dopiero kiedy się przejdę lub poczekam kilka minut(prawdopodobnie uzbieram jakieś ładunki), a następnie dotknę obudowy wyświetlacza lub jego okolic około 2cm, to dzieje się jedna z dwóch rzeczy.
Pierwsza z nich - tracę kontakt z wyświetlaczem, esp działa prawidłowo tylko nic nie wiedzę na wyświetlaczu.
Druga, esp umiera do czasu wyłączenia prądu i ponownego uruchomienia.
2140483150_VID20240126170636(1).thumb.gif.b942562a57dfaf1f5fe52bfef75c5c18.gif

obudowa jest drewniana pomalowana srebrnym sprayem. sprawdziłem miernikiem, że ona nie przewodzi.
IMG20240126182802.thumb.jpg.89fcacaa7319cd75dd8bd666d3fbf97f.jpg

Czy ktoś spotkał się z takim zachowaniem i ma jakiś pomysł jak temu zaradzić? Jeżeli będzie taka potrzeba wieczorem dodam schemat jak to jest ze sobą połączone. 

Link do komentarza
Share on other sites

(edytowany)

Kod Programu


Plik główny:

#define koniec_litery 25
#define kasowanie 26
#define przekaznik2 32
#define przekaznik 33
#define kreska 34
#define kropka 35
// sda 22
// scl 21

#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <Wire.h>
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <AsyncElegantOTA.h>
#include <AsyncTCP.h>
#include "stronaHtml.h"

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // dla zielonego 0x3F a dla niebieskiego 0x27
void wyswietl();
bool a, b, c;
const String prawidlowe = "sos123";
String NazwaGrupy = "$";
String otrzymane = "";
String litera = "";
int x = 0;
bool boolstart = 0;
const int max_lenght_string = 17;
bool zmiana = 0;

///////////////////////WIFI GLOBAL/////////////////////////////

const char *ssid = "pokój maga";
const char *password = "12345678";

WiFiServer wifiServer(80);

// Set your Static IP address
IPAddress local_IP(192, 168, 1, 75);
// Set your Gateway IP address
IPAddress gateway(192, 168, 1, 1);

IPAddress subnet(255, 255, 255, 0);

const uint16_t port = 80;
const char *dzwiek = "192.168.1.78";
const char *helikopter = "192.168.1.76";
const char *powietrze = "192.168.1.77";
const char *przyciski = "192.168.1.74";

WiFiClient client;

AsyncWebServer server(100);

const char *PARAM_INPUT_1 = "input1";

void setup() {
  pinMode(przekaznik, OUTPUT);
  digitalWrite(przekaznik, HIGH);

  Serial.begin(9600);
  SPI.begin();
  lcd.clear();
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.backlight();  // zalaczenie podswietlenia
  pinMode(przekaznik2, OUTPUT);

  pinMode(kropka, INPUT_PULLUP);
  pinMode(kreska, INPUT_PULLUP);
  pinMode(kasowanie, INPUT_PULLUP);
  pinMode(koniec_litery, INPUT_PULLUP);
  digitalWrite(przekaznik2, HIGH);

  /////////////////////////WIFI SET//////////////////////////
  // Configures static IP address
  if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("STA Failed to configure");
  }
  delay(100);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connected to the WiFi network");
  Serial.println(WiFi.localIP());

  wifiServer.begin();
  ///////////////////////////////////////////////////////////////
  //wyświetlenie na stronie głownej po wpisaniu adresu ip
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(200, "text/html", index_html);
  });

  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send_P(200, "text/plain", otrzymane.c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send_P(200, "text/plain", litera.c_str());
  });
  server.on("/GroupName", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send_P(200, "text/plain", NazwaGrupy.c_str());
  });

  server.on("/", HTTP_POST, [](AsyncWebServerRequest *request) {
    int params = request->params();
    for (int i = 0; i < params; i++) {
      AsyncWebParameter *p = request->getParam(i);
      if (p->isPost()) {
        if (p->name() == "naz") {
          String incomincMessage = p->value().c_str();
          if (incomincMessage == "") {
            NazwaGrupy = "$puste";
          } else if (incomincMessage == " ") {
            NazwaGrupy = "$puste2";
          } else if (incomincMessage.length() >= 16) {
            NazwaGrupy = "$zadlugie";
          } else {
            NazwaGrupy = p->value().c_str();
          }
        }
      }
    }
    request->send(200, "text/html", index_html);
  });

  AsyncElegantOTA.begin(&server);  // Start AsyncElegantOTA
  server.begin();
  Serial.println("HTTP server started");
  Serial.println("=====Koniec setupa=====");
  lcd.noBacklight();
}

void loop() {

  if (boolstart == 1) {
    if ((digitalRead(kropka) == LOW) && (a == 0)) {
      if (litera.length() <= max_lenght_string) {
        a = 1;
        litera = litera + '*';
        wyswietl();
        delay(200);
      }
    } else if (digitalRead(kropka) == HIGH) {
      a = 0;
    }

    if ((digitalRead(kreska) == LOW) && (b == 0)) {
      if (litera.length() <= max_lenght_string) {
        b = 1;
        litera = litera + '-';
        wyswietl();
        delay(200);
      }
    } else if (digitalRead(kreska) == HIGH) {
      b = 0;
    }

    if ((otrzymane == prawidlowe) || (otrzymane == "$ 70") || (otrzymane == NazwaGrupy)) {
      Serial.println("to jest dobre haslo");
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("wezwano pomoc na:");
      lcd.setCursor(4, 1);
      lcd.print("ad47154");
      digitalWrite(przekaznik, LOW);
      for (int i = 0; i < 3; i++) {
        sendData(przyciski, '3');
        delay(100);
      }
      while (true) {
        delay(1000);
        client = wifiServer.available();
        if (client) {
          delay(10);
          char dat = receiveData();
          delay(10);
          if (dat == '2') {
            delay(10);
            digitalWrite(przekaznik2, LOW);
            delay(10);
          }
          if (dat == 'z') {  //restart
            Serial.println(dat);
            lcd.noBacklight();
            delay(100);
            Serial.println("podswietlenie wylaczone");
            ESP.restart();
          }
        }
      }
    }

    if ((digitalRead(kasowanie) == LOW) && (litera != "")) {
      Serial.println("kasujemy");
      litera = "";
      wyswietl();
      delay(1000);
      if (digitalRead(kasowanie) == LOW) {
        otrzymane = "";
      }
    } else if ((digitalRead(kasowanie) == LOW) && (litera == "")) {
      int dlu = otrzymane.length();
      Serial.println(dlu);
      otrzymane.remove(dlu - 1);
      wyswietl();
      delay(500);
    }
    if ((digitalRead(koniec_litery) == LOW) && (c == 0)) {
      if (otrzymane.length() <= max_lenght_string) {
        tlumacz(litera);
      }
      litera = "";
      c = 1;
      wyswietl();
      delay(130);
    } else if (digitalRead(koniec_litery) == HIGH) {
      c = 0;
    }
  }
  client = wifiServer.available();
  if (client) {
    delay(10);
    char dat = receiveData();
    delay(10);
    if (dat == '2') {
      delay(10);
      digitalWrite(przekaznik2, LOW);
      delay(10);
    }
    if (dat == 'z') {  //restart
      Serial.println(dat);
      ESP.restart();
    }
    if (dat == 'u') {
      Serial.println(dat);
      otrzymane = prawidlowe;
      lcd.backlight();
      void wyswietl();
    }
    if (dat == 's') {
      Serial.println(dat);
      boolstart = 1;
      lcd.backlight();
    }
  }
}

char tlumacz(String t) {
  if (t == "*-") {
    otrzymane = otrzymane + 'a';
  } else if (t == "-***") {
    otrzymane = otrzymane + 'b';
  } else if (t == "-*-*") {
    otrzymane = otrzymane + 'c';
  } else if (t == "-**") {
    otrzymane = otrzymane + 'd';
  } else if (t == "*") {
    otrzymane = otrzymane + 'e';
  } else if (t == "**-*") {
    otrzymane = otrzymane + 'f';
  } else if (t == "--*") {
    otrzymane = otrzymane + 'g';
  } else if (t == "****") {
    otrzymane = otrzymane + 'h';
  } else if (t == "**") {
    otrzymane = otrzymane + 'i';
  } else if (t == "*---") {
    otrzymane = otrzymane + 'j';
  } else if (t == "-*-") {
    otrzymane = otrzymane + 'k';
  } else if (t == "*-**") {
    otrzymane = otrzymane + 'l';
  } else if (t == "--") {
    otrzymane = otrzymane + 'm';
  } else if (t == "-*") {
    otrzymane = otrzymane + 'n';
  } else if (t == "---") {
    otrzymane = otrzymane + 'o';
  } else if (t == "*--*") {
    otrzymane = otrzymane + 'p';
  } else if (t == "--*-") {
    otrzymane = otrzymane + 'q';
  } else if (t == "*-*") {
    otrzymane = otrzymane + 'r';
  } else if (t == "***") {
    otrzymane = otrzymane + 's';
  } else if (t == "-") {
    otrzymane = otrzymane + 't';
  } else if (t == "**-") {
    otrzymane = otrzymane + 'u';
  } else if (t == "***-") {
    otrzymane = otrzymane + 'v';
  } else if (t == "*--") {
    otrzymane = otrzymane + 'w';
  } else if (t == "-**-") {
    otrzymane = otrzymane + 'x';
  } else if (t == "-*--") {
    otrzymane = otrzymane + 'y';
  } else if (t == "--**") {
    otrzymane = otrzymane + 'z';
  } else if (t == "*----") {
    otrzymane = otrzymane + '1';
  } else if (t == "**---") {
    otrzymane = otrzymane + '2';
  } else if (t == "***--") {
    otrzymane = otrzymane + '3';
  } else if (t == "****-") {
    otrzymane = otrzymane + '4';
  } else if (t == "*****") {
    otrzymane = otrzymane + '5';
  } else if (t == "-****") {
    otrzymane = otrzymane + '6';
  } else if (t == "--***") {
    otrzymane = otrzymane + '7';
  } else if (t == "---**") {
    otrzymane = otrzymane + '8';
  } else if (t == "----*") {
    otrzymane = otrzymane + '9';
  } else if (t == "-----") {
    otrzymane = otrzymane + '0';
  } else if (t == "*****-***") {
    otrzymane = ("$ 70");
  }
}

void wyswietl() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(otrzymane);
  lcd.setCursor(0, 1);
  lcd.print(litera);
}

//////////////////wysylanie i odbieranie///////////////
void sendData(const char *petent, char dat) {
  client.connect(petent, port);
  client.print(dat);
  Serial.print("Sent to: ");
  Serial.print(petent);
  delay(100);
  client.stop();
}

char receiveData() {
  Serial.print("Connected with: ");
  char c;
  Serial.print(client.remoteIP());
  Serial.print(", ");
  while (client.connected()) {
    while (client.available() > 0) {
      c = client.read();
    }
    delay(10);
  }
  Serial.println(c);
  client.stop();
  Serial.println("Petent disconnected");
  return c;
}

Plik - stronaHtml.h 

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1,charset="utf-8"">
    <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .czcionka_napisow{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP32 Mors</h2>
  <h4>mors z ota. wpisz /update aby wgrac nowy plik .bin</h4>
  <p>
    <span class="czcionka_napisow">Napis</span> 
    <span id="temperature">%TEMPERATURE%</span>
  </p>
  <p>
    <span class="czcionka_napisow">mors kod</span>
    <span id="humidity">%HUMIDITY%</span>
  </p>

  <p>
    <span class="czcionka_napisow">nazwa</span>
    <span id="GroupName">%GROUPNAME%</span>
  </p>

    <form action="/" method="POST">
    wprowadz nazwe: <input type="text" name="naz">
    <input type="submit" value="zatwierdz">
  </form><br>

</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 100 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 100 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("GroupName").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/GroupName", true);
  xhttp.send();
}, 100 ) ;

</script>
</html>)rawliteral";

Schemat nie jest idealny ale mniej więcej tak to wygląda 
Schematic_mors_2024-01-27.thumb.png.1d45615a0da0806e2d8dbaf4db3732cb.pngWidget pre

Edytowano przez startrek1p2p
formatowanie
Link do komentarza
Share on other sites

Tak na szybko, bo noc późna:

  1. ESP32 pracuje w logice 3,3V, a Ty przez przyciski podajesz mu na wejścia 5V. To mu może nie wyjść na zdrowie.
  2. Wszystkie wejścia są skonfigurowane jako INPUT_PULLUP, co wymusza stan wysoki dla rozwartego przycisku. Jego zwarcie też podaje stan wysoki, a więc nie wiem jak to ma działać.
  3. Nie wiem z jakiego zasilacza jest to wszystko zasilane, ale te przekaźniki biorą sporo prądu. Na to wszystko potrzeba na pewno więcej niż 1A.
  4. W programie są odniesienia do magistrali SPI, choć na schemacie nie ma żadnego urządzenia tak podłączonego.
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

- brak kondensatorów filtrujących, chyba że to rysynek poglądowy.

- te + 5V to woła o pomstę

Link do komentarza
Share on other sites

(edytowany)

Wczoraj pomieszałem połączenia przycisków. tak to wygląda w rzeczywistości:
Schematic_morsv2_2024-01-27.thumb.png.45e8772a3a5577767e0ac9d8338761f5.png


Zapomniałem jeszcze dodać diod które są razem z przyciskiem. Wedle opisu działają miedzy 3-12V.

 

4 godziny temu, 99teki napisał:

- brak kondensatorów filtrujących, chyba że to rysynek poglądowy.

są dwa niewielkie dodałem na schemacie powyżej

 

13 godzin temu, jand napisał:

Nie wiem z jakiego zasilacza jest to wszystko zasilane, ale te przekaźniki biorą sporo prądu. Na to wszystko potrzeba na pewno więcej niż 1A

Zasilacza to 300W atx zamontowany w odległości około 2m od urządzenia, przewody dostarczające zasilanie to kabel głośnikowy 2x0,75. Podczas działania na zaciskach przy urządzeniu pokazuje 5.01 V

 

13 godzin temu, jand napisał:

W programie są odniesienia do magistrali SPI, choć na schemacie nie ma żadnego urządzenia tak podłączonego.

Bibliotekę dodałem przypadkowo tak samo jak Wire.h, już je usuwam i wgrywam program do ESP.

Gdy dotknę obudowy wyświetlacza i mam włączony port szeregowy, to wyświetla mi się takie coś:

*�PTUU���UUTE���\�TjJTWUWUJ���u��\�(�TJRJuuTT��U���-QBU��j��EJRZq��RZquTZq���RZq��WխQ(���խQ(Eե�I���TUUZEu����(��UVKEu��RUQjUVKUEuP�+��T���Q��T\�T��UV+U��Q��T*�PTUU���UUTE���\�TjJTWUWUJ���u��\�(�TJRJuuTT��U���-QBU

Niezależnie jakie ustawię Baud zawsze są to znaki nie do odczytu, sprawdzałem w zakresie 300-2000000. Aktualny pochodzi z prędkości 115200

Edytowano przez startrek1p2p
Link do komentarza
Share on other sites

Według nowego schematu 5V jest nadal podawane na wejścia ESP32. Czemu nie zasilisz przycisków z 3.3V - masz te napięcie dostępne z ESP32.

Link do komentarza
Share on other sites

(edytowany)

- nie używane piny esp32 ustaw jako wyjście w stanie niskim, lub przynajmniej jako wejścia z podciąganiem. Nie powinno się pozostawiać wiszących wejść

- obudowa jest metalowa? Jeśli tak to czy podłączona do masy/uziemienia?

Edytowano przez _LM_
Link do komentarza
Share on other sites

(edytowany)
39 minut temu, jand napisał:

Według nowego schematu 5V jest nadal podawane na wejścia ESP32. Czemu nie zasilisz przycisków z 3.3V - masz te napięcie dostępne z ESP32.

napięcie mierzone miedzy przyciskiem a masą

IMG20240127161701.thumb.jpg.c4f31f985bb6d8fa9f0e3818ebcf6f64.jpgimage.thumb.png.8a6b2217c44c147e7418dfdd96acba38.png

21 minut temu, _LM_ napisał:

- obudowa jest metalowa? Jeśli tak to czy podłączona do masy/uziemienia?

 

21 godzin temu, startrek1p2p napisał:

obudowa jest drewniana pomalowana srebrnym sprayem. sprawdziłem miernikiem, że ona nie przewodzi.
IMG20240126182802.thumb.jpg.89fcacaa7319cd75dd8bd666d3fbf97f.jpg

Jeżeli chodzi o czarny pasek przy wyświetlaczu to metalowa 

 

Edytowano przez startrek1p2p
Link do komentarza
Share on other sites

37 minut temu, _LM_ napisał:

- nie używane piny esp32 ustaw jako wyjście w stanie niskim, lub przynajmniej jako wejścia z podciąganiem. Nie powinno się pozostawiać wiszących wejść

dodanie tego fregmentu w kodzie nie pomogło 

const uint8_t Tab []={12,13,14,15,16,17,18,19,21,22,23,27,36,39}; 
void setup() {
    for (int n : Tab) {
    pinMode(n, INPUT_PULLUP);
  }

 

1 godzinę temu, jand napisał:

Czemu nie zasilisz przycisków z 3.3V - masz te napięcie dostępne z ESP32.

tak sie dzieje po zmianie na 3,3V. Przyciski sie same naciskają, mają stan nieustalony.
VID20240127164957.thumb.gif.e1bbe2e26ba296c0dab691bf15e5c6b4.gif

  • Lubię! 1
Link do komentarza
Share on other sites

obawiam się że gpio padło, jak masz możliwość to przełącz na inne piny, ewentualnie podmień esp

Link do komentarza
Share on other sites

32 minuty temu, _LM_ napisał:

obawiam się że gpio padło

Też się tego obawiam. Spróbuj jeszcze podciągnąć wejścia od przycisków do 3,3V dodatkowymi opornikami (rzędu 1k).

Link do komentarza
Share on other sites

 

1 godzinę temu, jand napisał:

Spróbuj jeszcze podciągnąć wejścia od przycisków do 3,3V dodatkowymi opornikami

Zdecydujcie się, czy przyciski mają być w stanie HIGH i zwierane do masy, czy w stanie LOW i zwierane do VCC. Stan spoczynkowy ma być wymuszany przez rezystory ~10k zewnętrzne lub wewnętrzne podciągnięcie do VCC (niektóre uC mają też możliwość wewnętrznie zrobić pullDown). Wciśnięcie ma przełączać napięcie  IO na stan przeciwny.

Program musi być zgodny z wybraną koncepcją.

Im mniejszy rezystor tym bliżej zwarcia, w szczególności podanie wprost na przycisk 3.3V i łączenie go do GND, im większy tym większe zakłócenia, w szczególności w ogóle brak połączenia rezystorem z GND/VCC.

Nie wiem jak dotarłeś do budowy sterownika, nie ogarniając obsługi przycisku. A nawet jak to podłączysz już prawidłowo to dalej nie jest ogarnięciem drgań styków w sterowniku delay. Jest na pęczki bibliotek do przycisków - bounce2, oneButton, easyButton, itd.

ESP i jego piny mogły przeżyć, bez wyjęcia modułu i przetestowania na stykówce bym go nie skreślał. Napięcie 5V było podawane przez led, tam w ogóle może nie być zasilania jeśli przyciski są ustawione PULLUP w programie, to zasilanie jest potrzebne by led zaświeciła przy wciśnięciu przycisku, tylko wtedy powinien płynąć prąd. Przy opisie led 3-12V sugerowałoby istnienie tam wbudowanego rezystora, inaczej zaświeciła by tylko raz.

Link do komentarza
Share on other sites

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ę »
×
×
  • 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.