Ten post chciałbym poświęcić na przygotowanie programu pobierającego dane o koronowirusie.
[Źródło: http://paulobrien.co.nz/2017/03/16/esp32-programming-with-arduino-on-windows/]
W celu pobrania aktualnych danych posłużę się następującym serwerem NovelCovid. Link do strony na githubie: https://github.com/novelcovid/api
Aby pobrać aktualne dane dla Polski należy wysłać następujące żądanie:
- https://corona.lmao.ninja/countries/poland
W odpowiedzi wyświetlą się następujące informacje w formacie JSON:
- {
- "country":"Poland",
- "cases":425,
- "todayCases":70,
- "deaths":5,
- "todayDeaths":0,
- "recovered":13,
- "active":407,
- "critical":3,
- "casesPerOneMillion":11
- }
Powyższa ramka jest już nieaktualna. Została zastąpiona następującą:
- {
- "country":"Poland",
- "countryInfo
- {
- "_id":616,
- "iso2":"PL",
- "iso3":"POL",
- "lat":52,
- "long":20,
- "flag":"https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/pl.png"
- },
- "cases":2055,
- "todayCases":193,
- "deaths":31,
- "todayDeaths":9,
- "recovered":7,
- "active":2017,
- "critical":3,
- "casesPerOneMillion":54,
- "deathsPerOneMillion":0.8,
- "updated":1585600658521
- }
Zmiany polegają na dodaniu dokładniejszych informacji o kraju, ilości śmierci na milion mieszkańców oraz czas aktualizacji.
Innym sposobem jest pobranie wszystkich wyników z całego świata:
- https://corona.lmao.ninja/all
Odczytana odpowiedź to:
- {
- "cases":776069,
- "deaths":37126,
- "recovered":164622,
- "updated":1585601858656,
- "active":574321
- }
//---------------------------------------------------------------------------------------------------------------------
Adres strony został zmieniony. Tym razem dane można pobrać wykorzystując następujące linki:
Dodatkowo ilość danych dla wszystkich krajów została zwiększona. Teraz JSON wygląda następująco:
//---------------------------------------------------------------------------------------------------------------------
Pozostałe opcje można sprawdzić na stronie projektu na Githubie.
###AKTUALIZACJA###:
Adres strony został zmieniony. Tym razem dane można pobrać wykorzystując następujące linki:
- https://corona.lmao.ninja/v2/countries/
- https://corona.lmao.ninja/v2/all/
Dodatkowo ilość danych dla wszystkich krajów została zwiększona. Teraz JSON wygląda następująco:
- {
- "updated":1587114100141,
- "cases":2190317,
- "todayCases":9009,
- "deaths":147027,
- "todayDeaths":1556,
- "recovered":553672,
- "active":1489618,
- "critical":56601,
- "casesPerOneMillion":281,
- "deathsPerOneMillion":18,
- "tests":18455619,
- "testsPerOneMillion":2367.7,
- "affectedCountries":212
- }
//---------------------------------------------------------------------------------------------------------------------
Pozostałe opcje można sprawdzić na stronie projektu na Githubie.
Poniżej przykładowy program wypisujący dane w przez uart:
Powyższy przykład pozwala na wyciągnięcie danych dla trzech krajów oraz dla danych globalnych.
Powyższy przykład pozwala na wyciągnięcie danych dla trzech krajów oraz dla danych globalnych.
- #include <ArduinoJson.h>
- #include <WiFi.h>
- #include <HTTPClient.h>
- //-------------------------------------------------
- #define JSON_BUFF_DIMENSION 500
- //---------------------------------------------------
- #define POLAND "poland"
- #define ITALY "italy"
- #define GERMANY "germany"
- //---------------------------------------------------
- const char* ssid = "SSID";
- const char* password = "PASSWORD";
- //---------------------------------------------------
- const String COUNTRIES_STRING = "https://corona.lmao.ninja/v2/countries/";
- const String GLOBAL_DATA_STRING = "https://corona.lmao.ninja/v2/all";
- //---------------------------------------------------
- String jsonStringText;
- String countryArray[3] = {POLAND, ITALY, GERMANY};
- //---------------------------------------------------
- void setup() {
- Serial.begin(115200);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.print("Connection with WIFI Network....");
- }
- Serial.println("Connected!");
- jsonStringText.reserve(JSON_BUFF_DIMENSION);
- }
- //---------------------------------------------------
- void loop(){
- if ((WiFi.status() == WL_CONNECTED))
- {
- HTTPClient http;
- for(uint8_t i=0;i<3;i++)
- {
- http.begin(COUNTRIES_STRING + countryArray[i]); //Specify the URL
- int httpResponseCode = http.GET(); //Make the request
- if (httpResponseCode > 0)
- {
- jsonStringText = http.getString();
- Serial.println(httpResponseCode);
- Serial.println(jsonStringText);
- parseCountryJsonData(jsonStringText.c_str());
- }
- else
- {
- Serial.println("Http Request Error");
- }
- }
- http.begin(GLOBAL_DATA_STRING); //Specify the URL
- int httpResponseCode = http.GET(); //Make the request
- if (httpResponseCode > 0)
- {
- jsonStringText = http.getString();
- Serial.println(httpResponseCode);
- Serial.println(jsonStringText);
- parseGlobalJsonData(jsonStringText.c_str());
- }
- else
- {
- Serial.println("Http Request Error");
- }
- http.end();
- }
- delay(100000);
- }
- void parseGlobalJsonData(const char * jsonString)
- {
- DynamicJsonDocument jsonBuffer(1000);
- auto error = deserializeJson(jsonBuffer, jsonString);
- if (error) {
- Serial.println("Deserialize error");
- Serial.println(error.c_str());
- return;
- }
- else
- {
- Serial.println("Deserialize OK!");
- }
- //---------------------------------------------------
- size_t len = measureJson(jsonBuffer);
- Serial.println("Msg Len: " + String(len));
- Serial.println("********************************************************");
- Serial.println("Global data:");
- int cases = jsonBuffer["cases"];
- Serial.println("1 - Cases: " + String(cases));
- int deaths = jsonBuffer["deaths"];
- Serial.println("2 - Deaths: " + String(deaths));
- int recovered = jsonBuffer["recovered"];
- Serial.println("3 - Recovered: " + String(recovered));
- Serial.println("********************************************************");
- }
- void parseCountryJsonData(const char * jsonString)
- {
- //----------------------------------------------------
- DynamicJsonDocument jsonBuffer(1500);
- auto error = deserializeJson(jsonBuffer, jsonString);
- //----------------------------------------------------
- if (error) {
- Serial.println("Deserialize error");
- Serial.println(error.c_str());
- return;
- }
- else
- {
- Serial.println("Deserialize OK!");
- }
- //---------------------------------------------------
- size_t len = measureJson(jsonBuffer);
- Serial.println("Msg Len: " + String(len));
- //---------------------------------------------------
- Serial.println("********************************************************");
- String country = jsonBuffer["country"];
- Serial.println("1 - Country: " + country);
- int cases = jsonBuffer["cases"];
- Serial.println("2 - Cases: " + String(cases));
- int todayCases = jsonBuffer["todayCases"];
- Serial.println("3 - Today cases: " + String(todayCases));
- int deaths = jsonBuffer["deaths"];
- Serial.println("4 - Deaths: " + String(deaths));
- int todayDeaths = jsonBuffer["todayDeaths"];
- Serial.println("5 - Today deaths: " + String(todayDeaths));
- int recovered = jsonBuffer["recovered"];
- Serial.println("6 - Recovered: " + String(recovered));
- int active = jsonBuffer["active"];
- Serial.println("7 - Active: " + String(active));
- int critical = jsonBuffer["critical"];
- Serial.println("8 - Critical: " + String(critical));
- int casesPerOneMillion = jsonBuffer["casesPerOneMillion"];
- Serial.println("8 - Case Per One Million: " + String(casesPerOneMillion));
- Serial.println("********************************************************");
- }
Dla powyższego programu dane zostaną wyświetlone w konsoli. Poniżej otrzymane wyniki operacji dla trzech wybranych krajów.
Dane dla wszystkich przypadków:
Do lepszej prezentacji danych można wykorzystać np. wyświetlacz 2x16 lub inny dostępny.
Ja wykorzystałem wyświetlacz TFT 4'3 cala o rozdzielczości 480x272 (producent AV-Display). Sterowanie wyświetlaczem odbywa się przez interfejs UART (sklep, dokumentacja).
Głównym powodem jego wykorzystania jest prosta obsługa oraz to, że akurat mam taki model nieużywany.
Sterowanie odbywa się przez przesłanie odpowiedniej ramki danych do wyświetlacza.
Chciałbym tutaj jeszcze zaznaczyć, że wykorzystuje czcionki podstawowe bez polskich znaków. Dlatego teksty wyświetlane na ekranie będą w języku angielskim.
Głównym powodem zastosowania języka angielskiego jest dosyć mozolny i nieprzyjemny proces przygotowania czcionki z polskimi znakami. Jest to oczywiście możliwe, natomiast zajmuje sporo czasu i trzeba poświecić sporo uwagi na obsługę programu w języku chińskim.
Tak więc w celu wyświetlenia tekstu na ekranie należy przesłać:
- HZBXX Xa Ya C Cb Str
Gdzie XX oznacza wielkość czcionki:
- 16,
- 24,
- 32,
- 48,
- 64.
W celu wyświetlenia tekstu należy podać kolor jakim zostanie uzupełnione tło pod napisem. Niestety nie widzę w dokumentacji możliwości wyświetlenia tekstu w transparentnego. Co oznacza, że najlepiej jako tło pod tekstem zastosować jednolity kolor dostępny na wyświetlaczu zamiast np. zdjęcia.
Załadowanie zdjęcia umieszczonego na karcie SD przy wyświetlaczu:
- LOAD Xa Ya Path
Wyświetlacz pozwala na wyświetlenie plików jpg, gif, png itp. w tym plików png transparentnych.
ESP32 posiada następujące interfejsy UART:
UART0 - RX: GPIO3; TX: GPIO1;
UART1 - RX: GPIO9; TX: GPIO10;
UART2 - RX: GPIO3; TX: GPIO17;
Interfejs UART0 wykorzystywany jest przez podłączenie kablem USB. Wobec tego wykorzystam UART1. Głównym powodem jest chęć zostawienia łatwego interfejsu UART w celu debugowania bądź wyświetlania danych po transmisji szeregowej.
Należy także pamiętać, że w ESP32 min. linie UART mogą zostać przypisane przez użytkownika do innych wyprowadzeń w dowolny sposób.
Do przesłania danych przygotowuję osobny plik description.h zawierający dostępne wartości czcionek:
- enum enum_FontSize {
- FontSize_16 = 16,
- FontSize_24 = 24,
- FontSize_32 = 32,
- FontSize_48 = 48,
- FontSize_64 = 64
- };
Funkcje odpowiedzialne za sterowanie wyświetlaczem:
- void LCD_PrintStringWithBg(const char * str, const uint16_t len, const enum enum_FontSize fontSize,
- const uint16_t posX, const uint16_t posY, const uint16_t textColor, const uint16_t bgColor) {
- uint8_t text[len + 1];
- memset(text, 0, sizeof text);
- memcpy(text, str, len);
- char bufferOut[64];
- int bufSize = sprintf(bufferOut, "HZB%d %d %d %d %d %s\n\r", fontSize, posX, posY, textColor, bgColor, text);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- }
- void LCD_LoadPicture(const char * path, const uint16_t posX, const uint16_t posY) {
- char bufferOut[64];
- memset(bufferOut, 0, sizeof bufferOut);
- int bufSize = sprintf(bufferOut, "LOAD %d %d %s\n\r", posX, posY, path);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- }
- int LCD_ClearScreen(uint16_t bgColor) {
- if(bgColor > 65535) {
- return 0;
- }
- char bufferOut[16];
- int bufSize = sprintf(bufferOut, "CLS %d\n\r", bgColor);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- return bufSize;
- }
Poniżej całość programu:
- #include <ArduinoJson.h>
- #include <WiFi.h>
- #include <HTTPClient.h>
- #include "declaration.h"
- //-------------------------------------------------
- #define COLOR_AQUA (uint16_t)0x07FF
- #define COLOR_BLACK (uint16_t)0x0000
- #define COLOR_BLUE (uint16_t)0x001F
- #define COLOR_FUCHSIA (uint16_t)0xF81F
- #define COLOR_GREEN (uint16_t)0x0400
- #define COLOR_GREY (uint16_t)0x8410
- #define COLOR_LIME (uint16_t)0x07E0
- #define COLOR_MAROON (uint16_t)0x8000
- #define COLOR_NAVY (uint16_t)0x0010
- #define COLOR_OLIVE (uint16_t)0x8400
- #define COLOR_PURPLE (uint16_t)0xC00F
- #define COLOR_RED (uint16_t)0x9800
- #define COLOR_SILVER (uint16_t)0xC618
- #define COLOR_TEAL (uint16_t)0x0410
- #define COLOR_YELLOW (uint16_t)0xFF40
- #define COLOR_WHITE (uint16_t)0xFFFF
- //-------------------------------------------------
- #define JSON_BUFF_DIMENSION 500
- //---------------------------------------------------
- #define POLAND "poland"
- #define ITALY "italy"
- #define GERMANY "germany"
- #define USA "usa"
- //---------------------------------------------------
- typedef struct CountryData{
- String country;
- int cases;
- int todayCases;
- int deaths;
- int todayDeaths;
- int recovered;
- int active;
- int critical;
- int casesPerOneMillion;
- }CountryDataTypeDef;
- CountryDataTypeDef CountryData[5]; //[0] Polska
- //[1] Włochy
- //[2] Niemcy
- //[3] USA
- //[4] Świat
- //---------------------------------------------------
- const char* ssid = "SSID";
- const char* password = "PASSWORD";
- //---------------------------------------------------
- const String COUNTRIES_STRING = "https://corona.lmao.ninja/v2/countries/";
- const String GLOBAL_DATA_STRING = "https://corona.lmao.ninja/v2/all";
- //---------------------------------------------------
- String jsonStringText;
- String countryArray[4] = {POLAND, ITALY, GERMANY, USA};
- //---------------------------------------------------
- int period = 0;
- unsigned long time_now = 0;
- //---------------------------------------------------
- String command;
- //---------------------------------------------------
- int touchCounter = 0;
- int displayCountry = 0;
- int errorCounter = 0;
- //---------------------------------------------------
- void setup() {
- Serial.begin(115200);
- Serial2.begin(115200, SERIAL_8N1, 16, 17);
- /* Czas potrzebny do uruchomienia wyświetlacza po starcie zasilania */
- delay(3000);
- WiFi.begin(ssid, password);
- while (WiFi.status() != WL_CONNECTED) {
- delay(1000);
- Serial.print("Connection with WIFI Network....");
- }
- Serial.println("Connected!");
- jsonStringText.reserve(JSON_BUFF_DIMENSION);
- LCD_ClearScreen(COLOR_NAVY);
- LCD_PrintStringWithBg("Pobieranie danych...", 17, FontSize_32, 10, 5, COLOR_WHITE, COLOR_NAVY);
- }
- //---------------------------------------------------
- void loop(){
- if(Serial2.available()){
- command = Serial2.readStringUntil('\n');
- if(command.indexOf("XY") > 0) {
- touchCounter++;
- }
- if(touchCounter == 5) {
- touchCounter = 0;
- displayCountry++;
- if(displayCountry == 5)
- {
- displayCountry = 0;
- }
- LCD_ClearScreen(COLOR_NAVY);
- LoadSettingsIntoScreen(displayCountry);
- LCD_LoadPicture("jpg/cvlog.jpg", 44, 175);
- }
- }
- if ((WiFi.status() == WL_CONNECTED) && (millis() - time_now > period))
- {
- HTTPClient http;
- errorCounter = 0;
- for(uint8_t i=0;i<4;i++)
- {
- http.begin(COUNTRIES_STRING + countryArray[i]); //Specify the URL
- int httpResponseCode = http.GET(); //Make the request
- if (httpResponseCode > 0)
- {
- errorCounter=0;
- jsonStringText = http.getString();
- Serial.println(httpResponseCode);
- Serial.println(jsonStringText);
- parseCountryJsonData(jsonStringText.c_str(), i);
- }
- else
- {
- errorCounter++;
- if(errorCounter == 2)
- {
- errorCounter=0;
- }
- else
- {
- i--;
- }
- Serial.println("Http Request Error");
- }
- }
- http.begin(GLOBAL_DATA_STRING); //Specify the URL
- int httpResponseCode = http.GET(); //Make the request
- if (httpResponseCode > 0)
- {
- jsonStringText = http.getString();
- Serial.println(httpResponseCode);
- Serial.println(jsonStringText);
- parseGlobalJsonData(jsonStringText.c_str());
- }
- else
- {
- Serial.println("Http Request Error");
- }
- http.end();
- LCD_ClearScreen(COLOR_NAVY);
- LoadSettingsIntoScreen(0);
- LCD_LoadPicture("jpg/cvlog.jpg", 44, 175);
- time_now = millis();
- period = 200000;
- }
- }
- void parseGlobalJsonData(const char * jsonString)
- {
- DynamicJsonDocument jsonBuffer(1000);
- auto error = deserializeJson(jsonBuffer, jsonString);
- if (error) {
- Serial.println("Deserialize error");
- Serial.println(error.c_str());
- return;
- }
- else
- {
- Serial.println("Deserialize OK!");
- }
- //---------------------------------------------------
- size_t len = measureJson(jsonBuffer);
- Serial.println("Msg Len: " + String(len));
- Serial.println("********************************************************");
- Serial.println("Global data:");
- CountryData[4].country = "World";
- CountryData[4].todayCases = 0;
- CountryData[4].todayDeaths = 0;
- CountryData[4].critical = 0;
- CountryData[4].casesPerOneMillion = 0;
- CountryData[4].cases = jsonBuffer["cases"];;
- Serial.println("1 - Cases: " + String(CountryData[4].cases));
- CountryData[4].deaths = jsonBuffer["deaths"];
- Serial.println("2 - Deaths: " + String(CountryData[4].deaths));
- CountryData[4].recovered = jsonBuffer["recovered"];
- Serial.println("3 - Recovered: " + String(CountryData[4].recovered ));
- CountryData[4].active = jsonBuffer["active"];
- Serial.println("4 - Active: " + String(CountryData[4].active));
- Serial.println("********************************************************");
- }
- void parseCountryJsonData(const char * jsonString, int structPosition)
- {
- //----------------------------------------------------
- DynamicJsonDocument jsonBuffer(1500);
- auto error = deserializeJson(jsonBuffer, jsonString);
- //----------------------------------------------------
- if (error) {
- Serial.println("Deserialize error");
- Serial.println(error.c_str());
- return;
- }
- else
- {
- Serial.println("Deserialize OK!");
- }
- //---------------------------------------------------
- size_t len = measureJson(jsonBuffer);
- Serial.println("Msg Len: " + String(len));
- //---------------------------------------------------
- Serial.println("********************************************************");
- String country = (jsonBuffer["country"]);
- CountryData[structPosition].country = country;
- Serial.println("1 - Country: " + CountryData[structPosition].country );
- CountryData[structPosition].cases = jsonBuffer["cases"];
- Serial.println("2 - Cases: " + String(CountryData[structPosition].cases));
- CountryData[structPosition].todayCases = jsonBuffer["todayCases"];
- Serial.println("3 - Today cases: " + String(CountryData[structPosition].todayCases));
- CountryData[structPosition].deaths = jsonBuffer["deaths"];
- Serial.println("4 - Deaths: " + String(CountryData[structPosition].deaths));
- CountryData[structPosition].todayDeaths = jsonBuffer["todayDeaths"];
- Serial.println("5 - Today deaths: " + String(CountryData[structPosition].todayDeaths));
- CountryData[structPosition].recovered = jsonBuffer["recovered"];
- Serial.println("6 - Recovered: " + String(CountryData[structPosition].recovered));
- CountryData[structPosition].active = jsonBuffer["active"];
- Serial.println("7 - Active: " + String(CountryData[structPosition].active));
- CountryData[structPosition].critical = jsonBuffer["critical"];
- Serial.println("8 - Critical: " + String(CountryData[structPosition].critical));
- CountryData[structPosition].casesPerOneMillion = jsonBuffer["casesPerOneMillion"];
- Serial.println("8 - Case Per One Million: " + String(CountryData[structPosition].casesPerOneMillion));
- Serial.println("********************************************************");
- }
- void LoadSettingsIntoScreen(int structPosCountryNumber)
- {
- char dataToDisplay[50] = {0x00};
- int bufferSize = sprintf(dataToDisplay, "Country: %s", &CountryData[structPosCountryNumber].country[0]);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_32, 10, 5, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Cases: %d", CountryData[structPosCountryNumber].cases);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 10, 35, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Today cases: %d", CountryData[structPosCountryNumber].todayCases);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 210, 35, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Deaths: %d", CountryData[structPosCountryNumber].deaths);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 10, 65, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Today deaths: %d", CountryData[structPosCountryNumber].todayDeaths);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 210, 65, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Recover: %d", CountryData[structPosCountryNumber].recovered);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 10, 95, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Active: %d", CountryData[structPosCountryNumber].active);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 210, 95, COLOR_WHITE, COLOR_NAVY);
- bufferSize = sprintf(dataToDisplay, "Critical: %d", CountryData[structPosCountryNumber].critical);
- LCD_PrintStringWithBg(dataToDisplay, bufferSize - 1, FontSize_24, 10, 130, COLOR_WHITE, COLOR_NAVY);
- }
- //----------------------------------------------------------------------------
- /* Display Functions */
- void LCD_PrintStringWithBg(const char * str, const uint16_t len, const enum enum_FontSize fontSize,
- const uint16_t posX, const uint16_t posY, const uint16_t textColor, const uint16_t bgColor) {
- uint8_t text[len + 1];
- memset(text, 0, sizeof text);
- memcpy(text, str, len);
- char bufferOut[64];
- int bufSize = sprintf(bufferOut, "HZB%d %d %d %d %d %s\n\r", fontSize, posX, posY, textColor, bgColor, str);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- Serial.write((uint8_t *)bufferOut, bufSize);
- }
- void LCD_LoadPicture(const char * path, const uint16_t posX, const uint16_t posY) {
- char bufferOut[64];
- memset(bufferOut, 0, sizeof bufferOut);
- int bufSize = sprintf(bufferOut, "LOAD %d %d %s\n\r", posX, posY, path);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- }
- int LCD_ClearScreen(uint16_t bgColor) {
- if(bgColor > 65535) { return 0; }
- char bufferOut[16];
- int bufSize = sprintf(bufferOut, "CLS %d\n\r", bgColor);
- Serial2.write((uint8_t *)bufferOut, bufSize);
- return bufSize;
- }
Poniżej zdjęcie ekranu głównego po załadowaniu danych:
Po podłączeniu do sieci WIFI urządzenie czeka na pobranie wszystkich informacji. Domyślnie pierwszym wyświetlanym krajem jest Polska.
Gdy nastąpi przytrzymanie palca na ekranie to po chwili zostaną załadowane dane z wartościami z następnego kraju. Po zdefiniowanym interwale czasowym następuje ponowne pobranie danych. Po aktualizacji ekran główny wyświetli informację z Polski.