PowerTGS440

StationROOT_v0.34

May 2nd, 2021
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 91.42 KB | None | 0 0
  1. // ------------------------------------------------------------------------------------------------------------ //
  2. // ---    StationROOT      Wi-FI      B Y   T O M A S Z   M A J C H E R                                     --- //
  3. // ------------------------------------------------------------------------------------------------------------ //
  4. //
  5. //  by Tomasz Majcher (TLG) Trans Line Group, Lubin POLSKA
  6. //  NIP:    692-201-09-78
  7. //  TEL:    667-08-21-21
  8. //  mail:   [email protected]
  9. //
  10. //  Trans Line Group Tomasz Majcher
  11. //  * usługi transportowe (wywrotki, silosy) -
  12. //  * sprzedaw kruszyw (piasek, żwir, pospółka, grysy, tłuczeń, mieszanki, żużel, kryszywa)
  13. //  * automatyka przemysłowa i domowa
  14. //
  15. // ------------------------------------------------------------------------------------------------------------ //
  16. // --- HISTORIA WERSJI ---------------------------------------------------------------------------------------- //
  17. // ------------------------------------------------------------------------------------------------------------ //
  18. //
  19. //  StationROOT v0.34   (02.05.2021)  - Stabilna. Free RAM ~171kBajtów, Free Flash ~2MegaBajtów (HUGE Memory Model)
  20. //
  21. //  StationROOT v0.33   (02.05.2021)  - rozbudowa MAX ---> dodano struktury miesiący
  22. //  StationROOT v0.32   (02.05.2021)  - rozbudowa MAX ---> Final Dni Tygodnia no WiKi_PAROLA LIB version
  23. //  StationROOT v0.31   (01.05.2021)  - rozbudowa MAX
  24. //  StationROOT v0.30   (01.05.2021)  - rozbudowa MAX, dodano prototypy funkcji do kodu
  25. //  StationROOT v0.29   (01.05.2021)  - rozbudowa MAX
  26. //  StationROOT v0.28   (01.05.2021)  - rozbudowa MAX
  27. //  StationROOT v0.27   (01.05.2021)  - rozbudowa MAX
  28. //  StationROOT v0.26   (31.04.2021)  - rozbudowa MAX
  29. //  StationROOT v0.25   (30.04.2021)  - rozbudowa MAX
  30. //  StationROOT v0.24   (29.04.2021)  - rozbudowa MAX
  31. //  StationROOT v0.23   (28.04.2021)  - rozbudowa MAX
  32. //  StationROOT v0.22   (27.04.2021)  - rozbudowa MAX
  33. //  StationROOT v0.21   (26.04.2021)  - rozbudowa MAX
  34. //  StationROOT v0.20   (25.04.2021)  - przebudowa paneli myInlineKbd i myInlineKbd2 dla TELEGRAM (na moje potrzeby)
  35. //  StationROOT v0.19   (25.04.2021)  - usunięto tokena i miasto ze ścieżek WEATHER, konfiguracja w sekcji DEFINE
  36. //  StationROOT v0.18   (25.04.2021)  - dodano teksty dla dni tygodnia i godziny dla MAX
  37. //  StationROOT v0.17   (25.04.2021)  - dodano wyświetlanie długej daty (dzien tygodnia, dzien, miesiac, rok)
  38. //  StationROOT v0.16   (25.04.2021)  - dodano obsługę JAKOŚCI POWIETRZA wg. standardu EPA
  39. //  StationROOT v0.15   (25.04.2021)  - test : OK
  40. //  StationROOT v0.14   (25.04.2021)  - modernizacja Translatarów dla MAX - usunięcie z CORE (przepełnienie stosu)
  41. //  StationROOT v0.13   (25.04.2021)  - modernizacja Translatorów dla SERIAL - usunięcie z CORE (przepełnienie stosu)
  42. //  StationROOT v0.12   (24.04.2021)  - przeniosiona Translator Opisu Pogody na TASK2 dla CORE0 CPU
  43. //  StationROOT v0.11   (24.04.2021)  - przeniosiona Translator Faz Księżyca na TASK3 dla CORE0 CPU
  44. //  StationROOT v0.10   (24.04.2021)  - dodano Translator Opisy Pogody (EN/PL)
  45. //  StationROOT v0.09   (24.04.2021)  - dodano Translator Faz Księżyca (EN/PL)
  46. //  StationROOT v0.08   (24.04.2021)  - dodano obsługę zdarzenia włączenia/wyłączenia przekaźnika na MAXLED
  47. //  StationROOT v0.07   (23.04.2021)  - dodano obsługę matrycy MAXLED
  48. //  StationROOT v0.06   (21.04.2021)  - zbudowane na bazie DarnNET MESH Server (v0.06)
  49. //
  50. // ------------------------------------------------------------------------------------------------------------ //
  51. // --- DOŁĄCZONE NAGŁÓWKI BIBLIOTEK --------------------------------------------------------------------------- //
  52. // ------------------------------------------------------------------------------------------------------------ //
  53.  
  54. #include <AsyncTelegram.h>
  55. #include <Arduino.h>
  56. #include <WiFiClient.h>
  57. #include <NTPClient.h>                                           // NTP klient (czas)
  58. #include <TimeLib.h>                                             // parser
  59. #include <WiFiUdp.h>                                             // UDP Wi-Fi
  60. #include <HTTPClient.h>                                                            
  61. #include <Arduino_JSON.h>
  62. #include <ESP32Time.h>                                           // zegar RTC ESP32Time
  63. #include <MD_Parola.h>                                           // MATRYCA
  64. #include <MD_MAX72xx.h>                                          // MATRYCA
  65. #include "SoftwareSerial.h"                                      // RX TX - jeszcze nie zaimplementowano
  66. #include "global.h"                                              // struktury ze zmiennymi
  67. #include "max.h"                                                 // wyświetlacz PAROLA
  68.  
  69. typedef byte BAJT;
  70.  
  71. // ------------------------------------------------------------------------------------------------------------ //
  72. // --- P R O T O T Y P Y    F U N K C J I --------------------------------------------------------------------- //
  73. // ------------------------------------------------------------------------------------------------------------ //
  74.  
  75. void PrintLine(byte lenght);
  76. void PrintMSG(const char * wiadomosc_1, const char * wiadomosc_2, const char * wiadomosc_3);
  77. void PrintEND();
  78.  
  79. // ------------------------------------------------------------------------------------------------------------ //
  80. // --- D E F I N I C J E -------------------------------------------------------------------------------------- //
  81. // ------------------------------------------------------------------------------------------------------------ //
  82.  
  83. #define   SSID        "DIABLO"                    // nazwa sieci Wi-Fi (router podłączony do sieci)
  84. #define   PASSWORD    "XXXXXXXXXXXXXXXXXXXXX"     // hasło sieci Wi-Fi (router podłączony do sieci)
  85.  
  86. String PogodaToken  = "XXXXXXXXXXXXXXXXXXXXX";    // token serwera pogodowego http://api.weatherapi.com
  87. String PogodaMiasto = "XXXXXXXXXXXXXXXXXXXXX";    // miasto dla ścieżki HTTP  http://api.weatherapi.com
  88.  
  89. #define   SERIAL              1                           // włącz terminal SERIAL.MONITOR
  90. #define   SPEED               115200                      // prędkość terminala SERIAL
  91. #define   THREAD_INFO         0
  92. #define   CORE0_TASK1         1
  93.  
  94. #define RxTxSpeed    19200          // prędkość transmisji RxTx
  95.  
  96. // USTAWIENIA DLA MAX_LED x8 ------------------------------------------------------------------ //
  97.  
  98. #define HARDWARE_TYPE MD_MAX72XX::FC16_HW          
  99. #define MAX_DEVICES 8        
  100.  
  101. // UWAGA !!! ESP32 ma Hardware SPI na następujących pinach ------------------------------------ //
  102.  
  103. #define CLK_PIN   13      // SPI ESP32 !!! VSPI SCK (P18 na płycie)
  104. #define DATA_PIN  11      // SPI ESP32 !!! VSPI MOSI (P23 na płycie)
  105. #define CS_PIN    15      // SPI ESP32 !!! VSPI CS (P15 na płycie)
  106.  
  107. #define RELAY1_CALLBACK  "Relay1"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  108. #define RELAY2_CALLBACK  "Relay2"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  109. #define RELAY3_CALLBACK  "Relay3"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  110. #define RELAY4_CALLBACK  "Relay4"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  111. #define RELAY5_CALLBACK  "Relay5"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  112. #define RELAY6_CALLBACK  "Relay6"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  113. #define RELAY7_CALLBACK  "Relay7"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  114. #define RELAY8_CALLBACK  "Relay8"  // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  115. #define EXIT1_CALLBACK   "EXIT1"   // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  116. #define EXIT2_CALLBACK   "EXIT2"   // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  117. #define PANEL1_CALLBACK  "PANEL11" // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  118. #define PANEL2_CALLBACK  "PANEL11" // dane wywołania zwrotnego wysyłane po naciśnięciu przycisku
  119.  
  120. // ------------------------------------------------------------------------------------------------------------ //
  121. // --- P R O T O T Y P Y    C P U ----------------------------------------------------------------------------- //
  122. // ------------------------------------------------------------------------------------------------------------ //
  123.  
  124. void Core0_Task1( void * pvParameters );                            // funkcja Task1 dla rdzenia nr. 0 CPU        
  125. void Core0_Task2( void * pvParameters );                            // funkcja Task2 dla rdzenia nr. 0 CPU        
  126.  
  127. void Core1_Task1( void * pvParameters );                            // funkcja Task1 dla rdzenia nr. 1 CPU        
  128. void Core1_Task2( void * pvParameters );                            // funkcja Tasl2 dla rdzenia nr. 1 CPU    
  129.                                    
  130.  
  131. // ------------------------------------------------------------------------------------------------------------ //
  132. // --- O B I E K T Y ------------------------------------------------------------------------------------------ //
  133. // ------------------------------------------------------------------------------------------------------------ //
  134.  
  135. WiFiUDP ntpUDP;                                                     // dla NTP (pobieranie czasu z internetu)
  136. NTPClient timeClient(ntpUDP, "pool.ntp.org", 7200);                 // dla NTP (pobieranie czasu z internetu)
  137.                                                              
  138. WiFiClient wifiClient;                                              // obiekt WiFi
  139. HTTPClient http;                                                    // obiekt HTTP
  140.  
  141. ESP32Time rtc;                                                      // zegar RTC
  142.  
  143. JSONVar JSON_Astronomy;                                             // obiekt Astronomia
  144. JSONVar JSON_Weather;                                               // obiekt Pogoda    
  145. JSONVar JSON_Forecast;                                              // obiekt Forecast
  146. JSONVar JSON_Air;                                                   // obiekt Powietrze
  147. JSONVar JSON_Mesh;                                                  // obiekt Mesh Incoming
  148.  
  149. TaskHandle_t CPU_Core_0;                                            // rdzeń nr. 0 CPU - ESP32
  150. TaskHandle_t CPU_Core_1;                                            // rdzeń nr. 1 CPU - ESP32
  151.  
  152. AsyncTelegram myBot;                                                // obiekt Telegram
  153. ReplyKeyboard myReplyKbd;                                           // obiekt klawiatury Reply
  154. ReplyKeyboard myReplyKbd2;                                          // obiekt klawiatury Reply
  155. InlineKeyboard myInlineKbd;                                         // obiekt klawiatury Inline
  156. InlineKeyboard myInlineKbd2;                                        // obiekt klawiatury Inline
  157.  
  158.  
  159. MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);        // obiekt MD_Parola
  160. MAX       M(P);                                                     // pseudo-obiekt MD_Parola
  161.  
  162. SoftwareSerial wireS(10,11);                                        // komunikacja Serial
  163.  
  164. // ------------------------------------------------------------------------------------------------------------ //
  165. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  166. // ------------------------------------------------------------------------------------------------------------ //
  167. // --- F L A G I ---------------------------------------------------------------------------------------------- //
  168. // ------------------------------------------------------------------------------------------------------------ //
  169.  
  170. bool F_Astronomia         = false;          // flaga  : czy aktualizacja astronomii
  171. bool F_Pogoda             = false;          // flaga  : czy aktualizacja pogody
  172. bool F_Prognoza           = false;          // flaga  : czy aktualizacja prognozy
  173. bool F_Powietrze          = false;          // flaga  : czy aktualizacja powietrza
  174. bool F_Zegar              = false;          // flaga  : Czy aktualizacja zegara
  175. bool F_BigClock           = true;           // flaga  : WYŚWIETL ZEGAR MAXLED (true = pokaz, false = nie pokazuj)
  176. bool F_MaxDemo            = false;          // flaga  : wysietlacz DEMO
  177. bool F_Przekaznik         = false;          // flaga  : włączono/wyłączono przekaźnik
  178. bool F_DataUpdate         = false;          // flaga  : aktualizacja daty
  179. bool isKeyboardActive;                      // zapisz, jeśli wyświetlana jest klawiatura odpowiedzi
  180.  
  181.  
  182.  
  183. // ------------------------------------------------------------------------------------------------------------ //
  184. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  185. // ------------------------------------------------------------------------------------------------------------ //
  186. // --- M I L L I S -------------------------------------------------------------------------------------------- //
  187. // ------------------------------------------------------------------------------------------------------------ //
  188.  
  189. unsigned long timeZERO = 0;  
  190. unsigned long task01m = 0;
  191. unsigned long task01s = 0;
  192. unsigned long task05m = 0;
  193. unsigned long task10m = 0;
  194. unsigned long task15m = 0;
  195. unsigned long task01h = 0;
  196. unsigned long timeout_task01m = 0;
  197. unsigned long timeout_task01s = 0;
  198. unsigned long timeout_task05m = 0;
  199. unsigned long timeout_task10m = 0;
  200. unsigned long timeout_task15m = 0;
  201. unsigned long timeout_task01h = 0;
  202.  
  203. // ------------------------------------------------------------------------------------------------------------ //
  204. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  205. // ------------------------------------------------------------------------------------------------------------ //
  206. // --- T E L E G R A M ---------------------------------------------------------------------------------------- //
  207. // ------------------------------------------------------------------------------------------------------------ //
  208.  
  209. const char *token = "XXXXXXXXXXXXXXXXXXXXX";       // token BOT
  210. const char *chatid = "XXXXXXXXXXXXXXXXXXXXX";      // chat ID BOT (nie korzystam)
  211.  
  212. //
  213. // ------------------------------------------------------------------------------------------------------------ //
  214. // ---                              M U L T I - C O R E   T A S K                                           --- //
  215. // ------------------------------------------------------------------------------------------------------------ //
  216. //
  217. //    void Core0_Task1( void * pvParameters )       --->  aktualizacja czasu i daty  
  218. //    void Core0_Task2( void * pvParameters )       --->  
  219. //    void Core1_Task1( void * pvParameters )       --->  data updata (buduje bufory dla MAX)
  220. //    void Core1_Task2( void * pvParameters )       --->  
  221. //
  222. // ------------------------------------------------------------------------------------------------------------ //
  223. // ---        CORE0 TASK1     POBIERANIE CZASU i DATY Z SERWERA NTP i AKTUALIZACJA ZEGARA ESP32 RTC         --- //
  224. // ------------------------------------------------------------------------------------------------------------ //
  225. //
  226. void Core0_Task1( void * pvParameters )                          
  227. {                                                                
  228.     for(;;)                                                        
  229.     {                                                            
  230.         #if THREAD_INFO
  231.             PrintLine(80);
  232.             PrintMSG("ESP32","CORE", "Wykonuje watek TASK1 na CORE0");
  233.         #endif      
  234.  
  235.         timeClient.update();
  236.        
  237.         unsigned long epochTime = timeClient.getEpochTime();                                              
  238.         struct tm *ptm = gmtime ((time_t *)&epochTime);      
  239.                                                                                    
  240.         zegar.Godzina           =   timeClient.getHours();                  
  241.         zegar.Minuta            =   timeClient.getMinutes();                
  242.         zegar.Sekunda           =   timeClient.getSeconds();                
  243.         zegar.SformatowanyCzas  =   timeClient.getFormattedTime();                                
  244.         zegar.DzienTygodnia     =   timeClient.getDay();                                          
  245.         zegar.DzienMiesiaca     =   ptm->tm_mday;                                                
  246.         zegar.Miesiac           =   ptm->tm_mon+1;                                                
  247.         zegar.Rok               =   ptm->tm_year+1900;
  248.  
  249.         if (zegar.Godzina < 10)
  250.         {
  251.             zegar.SformatowanyCzasHM = "0" + String (zegar.Godzina) + ":";            
  252.         }
  253.         else zegar.SformatowanyCzasHM = String(zegar.Godzina) + ":";            
  254.  
  255.         if (zegar.Minuta < 10)
  256.         {
  257.             zegar.SformatowanyCzasHM += "0" + String (zegar.Minuta) + ":";            
  258.         }
  259.         else zegar.SformatowanyCzasHM += String(zegar.Minuta);            
  260.        
  261.  
  262.         if (zegar.Rok !=1970)
  263.         {
  264.             if(zegar.DzienMiesiaca < 10)
  265.             {
  266.                 zegar.SformatowanaData   = "0" + String(zegar.DzienMiesiaca) + ".";
  267.                 zegar.SformatowanaDataPL = "0" + String(zegar.DzienMiesiaca) + " ";
  268.             }
  269.             else  
  270.             {
  271.                 zegar.SformatowanaData   = String(zegar.DzienMiesiaca) + ".";
  272.                 zegar.SformatowanaDataPL = String(zegar.DzienMiesiaca) + " ";
  273.             }
  274.  
  275.             if(zegar.Miesiac < 10)
  276.             {
  277.                 zegar.SformatowanaData += "0" + String(zegar.Miesiac) + ".";
  278.                 zegar.SformatowanaDataPL += String(MONTH[zegar.Miesiac]) + " ";
  279.             }
  280.             else  
  281.             {
  282.                 zegar.SformatowanaData += String(zegar.Miesiac) + ".";
  283.                 zegar.SformatowanaDataPL += String(MONTH[zegar.Miesiac]) + " ";
  284.             }
  285.  
  286.             zegar.SformatowanaData  += String(zegar.Rok);
  287.             zegar.SformatowanaDataPL += String(zegar.Rok);
  288.  
  289.             // --- zapisz aktualny czas pobrany z serwera NTP do zegara RTC --------------------------------------- //
  290.            
  291.             rtc.setTime(zegar.Sekunda, zegar.Minuta, zegar.Godzina-1, zegar.DzienMiesiaca, zegar.Miesiac, zegar.Rok);
  292.  
  293.             if (!F_DataUpdate)
  294.             {
  295.                 Data2Bufor();         // aktualizuj jeśli flaga jest FALSE
  296.                 F_DataUpdate = true;  // Bufor Daty zbudowany, nie aktualizuj co minutę, rób to co godzinę
  297.             }
  298.  
  299.             // --- zbuduj obiekty typu (JSON STRING) do odesłania na żadanie do innego ESP w sieci MESH
  300.  
  301.                    
  302.             #if CORE0_TASK1            
  303.                 PrintLine(60);
  304.                 PrintMSG("CORE0_TASK1", "NTP Time", zegar.SformatowanyCzas.c_str());          
  305.                 PrintMSG("CORE0_TASK1", "NTP Date", zegar.SformatowanaData.c_str());
  306.                 Serial.printf("\n[CORE0_TASK1] [RTC Time] ");  
  307.                 Serial.print(rtc.getTime());
  308.                 Serial.printf("\n[CORE0_TASK1] [RTC Date] ");  
  309.                 Serial.print(rtc.getDate());
  310.                 Serial.printf("\n[CORE0_TASK1] [FREE RAM] ");
  311.                 Serial.print(ESP.getFreeHeap());
  312.                 PrintLine(60);
  313.                 PrintEND();      
  314.             #endif
  315.                
  316.             F_Zegar = true;   // dane OK, flaga na true
  317.         }
  318.         else F_Zegar = false; // dane złe, flaga na false
  319.        
  320.         vTaskDelay(60000 / portTICK_PERIOD_MS);                 // wykonuj 1 minutę
  321.     }                                                            
  322. }      
  323. //
  324. // ------------------------------------------------------------------------------------------------------------ //
  325. // ---        CORE0 TASK2                                                                                   --- //
  326. // ------------------------------------------------------------------------------------------------------------ //
  327. //
  328. void Core0_Task2( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  329. {                                                                 // początek                          
  330.     for(;;)                                                       // nieskończona pętla                
  331.     {                                                             // początek FOR              
  332.         delay(3600000);                                           // wykonuj co 1 godzinę
  333.     }                                                            
  334. }  
  335. //
  336. // ------------------------------------------------------------------------------------------------------------ //
  337. // ---        CORE1 TASK1    
  338. // ------------------------------------------------------------------------------------------------------------ //
  339.  
  340. void Core1_Task1( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  341. {                                                                 // początek                          
  342.     for(;;)                                                       // nieskończona pętla                
  343.     {                                                             // początek FOR                                    
  344.         delay(95000);                                           // wykonuj co 1 minutę i 35 sekund
  345.     }                                                            
  346. }      
  347.  
  348. // ------------------------------------------------------------------------------------------------------------ //
  349. // ---        CORE1 TASK2    
  350. // ------------------------------------------------------------------------------------------------------------ //
  351.  
  352. void Core1_Task2( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  353. {                                                                 // początek                          
  354.     for(;;)                                                       // nieskończona pętla                
  355.     {                                                             // początek FOR                              
  356.        
  357.         delay(3600000);                                           // wykonuj co 1 godzinę
  358.     }                                                            
  359. }      
  360.  
  361. // ------------------------------------------------------------------------------------------------------------ //
  362. // --- Aktualizacja Pogody z Serwera  ------------------------------------------------------------------------- //
  363. // ------------------------------------------------------------------------------------------------------------ //
  364. //
  365. String httpGETRequest(const char* serverName)                                                        
  366. {                                                                                                    
  367.     HTTPClient http;                                                                                  
  368.     http.begin(serverName);                                                                          
  369.     int httpResponseCode = http.GET();                                                                
  370.     String bufor = "{}";                                                                              
  371.                                                                                                      
  372.     if ( httpResponseCode > 0 )                                                                      
  373.     {                                                                                                
  374.         #if SERIAL
  375.             //Serial.print("\nHTTP Response code: ");                                                  
  376.             //Serial.print(httpResponseCode);                                                      
  377.         #endif          
  378.                                                                                      
  379.         bufor = http.getString();                                                                    
  380.     }                                                                                                
  381.     else                                                                                              
  382.     {                                                                                                
  383.         #if SERIAL                                                                                  
  384.             //Serial.print("Error code: ");                                                          
  385.             //Serial.println(httpResponseCode);                                                      
  386.         #endif                                                                                        
  387.     }                                                                                                
  388.     http.end();                                                                            
  389.     return bufor;                                                                                    
  390. }
  391.  
  392. // ------------------------------------------------------------------------------------------------------------ //
  393. // --- Tłumasz opis pogody  ----------------------------------------------------------------------------------- //
  394. // ------------------------------------------------------------------------------------------------------------ //
  395.  
  396. void Pogoda2PL()
  397. {
  398.     if      ( pogoda.kondycja == "Sunny" )                                    pogoda.kondycja_pl = "Słonecznie";
  399.     else if ( pogoda.kondycja == "Partly cloudy" )                            pogoda.kondycja_pl = "Częściowe zachmurzenie";
  400.     else if ( pogoda.kondycja == "Cloudy" )                                   pogoda.kondycja_pl = "Pochmurnie";
  401.     else if ( pogoda.kondycja == "Overcast" )                                 pogoda.kondycja_pl = "Posępnie";
  402.     else if ( pogoda.kondycja == "Mist" )                                     pogoda.kondycja_pl = "Zamglenie";
  403.     else if ( pogoda.kondycja == "Patchy rain possible" )                     pogoda.kondycja_pl = "Możliwy przelotny deszcz";
  404.     else if ( pogoda.kondycja == "Patchy snow possible" )                     pogoda.kondycja_pl = "Możliwe nieregularne opady śniegu";
  405.     else if ( pogoda.kondycja == "Patchy sleet possible" )                    pogoda.kondycja_pl = "Możliwe niejednolite opady śniegu";
  406.     else if ( pogoda.kondycja == "Patchy freezing drizzle possible" )         pogoda.kondycja_pl = "Możliwa nieregularna marznąca mżawka";
  407.     else if ( pogoda.kondycja == "Thundery outbreaks possible" )              pogoda.kondycja_pl = "Możliwe wybuchy piorunów";
  408.     else if ( pogoda.kondycja == "Blowing snow" )                             pogoda.kondycja_pl = "Śnieżyca";
  409.     else if ( pogoda.kondycja == "Blizzard" )                                 pogoda.kondycja_pl = "Burza śnieżna";
  410.     else if ( pogoda.kondycja == "Fog" )                                      pogoda.kondycja_pl = "Mgła";
  411.     else if ( pogoda.kondycja == "Freezing fog" )                             pogoda.kondycja_pl = "Marznąca mgła";
  412.     else if ( pogoda.kondycja == "Patchy light drizzle" )                     pogoda.kondycja_pl = "Nieregularna lekka mżawka";
  413.     else if ( pogoda.kondycja == "Light drizzle" )                            pogoda.kondycja_pl = "Lekka mżawka";
  414.     else if ( pogoda.kondycja == "Freezing drizzle" )                         pogoda.kondycja_pl = "Marznąca mżawka";
  415.     else if ( pogoda.kondycja == "Heavy freezing drizzle" )                   pogoda.kondycja_pl = "Silna marznąca mżawka";
  416.     else if ( pogoda.kondycja == "Patchy light rain" )                        pogoda.kondycja_pl = "Niejednolity, lekki deszcz";
  417.     else if ( pogoda.kondycja == "Light rain" )                               pogoda.kondycja_pl = "Lekki deszcz";
  418.     else if ( pogoda.kondycja == "Moderate rain at times" )                   pogoda.kondycja_pl = "Czasami umiarkowany deszcz";
  419.     else if ( pogoda.kondycja == "Moderate rain" )                            pogoda.kondycja_pl = "Umiarkowany deszcz";
  420.     else if ( pogoda.kondycja == "Heavy rain at times" )                      pogoda.kondycja_pl = "Czasami ulewny deszcz";
  421.     else if ( pogoda.kondycja == "Heavy rain" )                               pogoda.kondycja_pl = "Ulewa";
  422.     else if ( pogoda.kondycja == "Light freezing rain" )                      pogoda.kondycja_pl = "Lekki marznący deszcz";
  423.     else if ( pogoda.kondycja == "Moderate or heavy freezing rain" )          pogoda.kondycja_pl = "Umiarkowany lub silny marznący deszcz";
  424.     else if ( pogoda.kondycja == "Light sleet" )                              pogoda.kondycja_pl = "Lekki deszcz ze śniegiem";
  425.     else if ( pogoda.kondycja == "Moderate or heavy sleet" )                  pogoda.kondycja_pl = "Umiarkowany lub obfity deszcz ze śniegiem";
  426.     else if ( pogoda.kondycja == "Patchy light snow" )                        pogoda.kondycja_pl = "Niejednolity, lekki śnieg";
  427.     else if ( pogoda.kondycja == "Light snow" )                               pogoda.kondycja_pl = "Lekkie opady śniegu";
  428.     else if ( pogoda.kondycja == "Patchy moderate snow" )                     pogoda.kondycja_pl = "Puszysty, umiarkowany śnieg";
  429.     else if ( pogoda.kondycja == "Moderate snow" )                            pogoda.kondycja_pl = "Średnie opady śniegu";
  430.     else if ( pogoda.kondycja == "Patchy heavy snow" )                        pogoda.kondycja_pl = "Niejednolity, ciężki śnieg";
  431.     else if ( pogoda.kondycja == "Heavy snow" )                               pogoda.kondycja_pl = "Duże opady śniegu";
  432.     else if ( pogoda.kondycja == "Ice pellets" )                              pogoda.kondycja_pl = "Granulki lodu";
  433.     else if ( pogoda.kondycja == "Light rain shower" )                        pogoda.kondycja_pl = "Lekki deszczyk";
  434.     else if ( pogoda.kondycja == "Moderate or heavy rain shower" )            pogoda.kondycja_pl = "Umiarkowany lub ulewny deszcz";
  435.     else if ( pogoda.kondycja == "Torrential rain shower" )                   pogoda.kondycja_pl = "Ulewny deszcz";
  436.     else if ( pogoda.kondycja == "Light sleet showers" )                      pogoda.kondycja_pl = "Lekkie opady deszczu ze śniegiem";
  437.     else if ( pogoda.kondycja == "Moderate or heavy sleet showers" )          pogoda.kondycja_pl = "Umiarkowane lub obfite opady deszczu ze śniegiem";
  438.     else if ( pogoda.kondycja == "Light snow showers" )                       pogoda.kondycja_pl = "Lekkie opady śniegu";
  439.     else if ( pogoda.kondycja == "Moderate or heavy snow showers" )           pogoda.kondycja_pl = "Umiarkowane lub obfite przelotne opady śniegu";
  440.     else if ( pogoda.kondycja == "Light showers of ice pellets" )             pogoda.kondycja_pl = "Lekkie opady granulatu lodu";
  441.     else if ( pogoda.kondycja == "Moderate or heavy showers of ice pellets" ) pogoda.kondycja_pl = "Umiarkowane lub obfite opady granulatu lodu";
  442.     else if ( pogoda.kondycja == "Patchy light rain with thunder" )           pogoda.kondycja_pl = "Nieregularny, lekki deszcz z grzmotami";
  443.     else if ( pogoda.kondycja == "Moderate or heavy rain with thunder" )      pogoda.kondycja_pl = "Umiarkowany lub ulewny deszcz z grzmotami";
  444.     else if ( pogoda.kondycja == "Moderate or heavy snow with thunder" )      pogoda.kondycja_pl = "Umiarkowany lub ciężki śnieg z grzmotami";
  445.          
  446.     else pogoda.kondycja_pl = pogoda.kondycja;   // nie zdefiniowane skopiuj  
  447. }
  448.  
  449. //
  450. // ------------------------------------------------------------------------------------------------------------ //
  451. // ---        A K T U A L I Z A C J A   P O G O D Y                                                         --- //    
  452. // ------------------------------------------------------------------------------------------------------------ //
  453. //
  454. void PogodaAktualizuj()
  455. {
  456.     PrintLine(60);
  457.     PrintMSG("ESP32","MyTask", "Aktualizję pogodę z serwera : api.weatherapi.com");
  458.    
  459.     String path = "http://api.weatherapi.com/v1/current.json?key=" + PogodaToken + "&q=" + PogodaMiasto + "&lang=en";
  460.     String jsonBuffer = httpGETRequest(path.c_str());    
  461.        
  462.     JSON_Weather = JSON.parse(jsonBuffer);                    
  463.  
  464.     if (JSON.typeof(JSON_Weather) == "undefined")                                                
  465.     {                                                                                        
  466.         PrintLine(60);
  467.         PrintMSG("DarkNet", "POGODA PARSER", "BŁĄD, BRAK DANYCH" );                                                                  
  468.     }      
  469.  
  470.     pogoda.miejscowosc                =   JSON_Weather["location"]["name"];
  471.     pogoda.kraj                       =   JSON_Weather["location"]["country"];
  472.     pogoda.szerokosc_geograficzna     =   JSON_Weather["location"]["lat"];
  473.     pogoda.dlugosc_geograficzna       =   JSON_Weather["location"]["lon"];
  474.     pogoda.id                         =   JSON_Weather["location"]["tz_id"];
  475.     pogoda.czas_epoch                 =   JSON_Weather["location"]["localtime_epoch"];
  476.     pogoda.czas_lokalny               =   JSON_Weather["location"]["localtime"];
  477.     pogoda.ostatnia_aktualizacja      =   JSON_Weather["current"]["last_updated"];
  478.     pogoda.temperatura_C              =   JSON_Weather["current"]["temp_c"];
  479.     pogoda.temperatura_C_odczuwalna   =   JSON_Weather["current"]["feelslike_c"];
  480.     pogoda.kondycja                   =   JSON_Weather["current"]["condition"]["text"];
  481.     pogoda.predkosc_wiatru_kph        =   JSON_Weather["current"]["wind_kph"];
  482.     pogoda.kierunek_wiatru_stopnie    =   JSON_Weather["current"]["wind_degree"];
  483.     pogoda.kierunek_wiatru_kompas     =   JSON_Weather["current"]["wind_dir"];
  484.     pogoda.podmuchy_wiatru            =   JSON_Weather["current"]["gust_kph"];
  485.     pogoda.cisnienie                  =   JSON_Weather["current"]["pressure_mb"];
  486.     pogoda.opady                      =   JSON_Weather["current"]["precip_mm"];
  487.     pogoda.wilgotnosc                 =   JSON_Weather["current"]["humidity"];
  488.     pogoda.zachmurzenie               =   JSON_Weather["current"]["cloud"];
  489.     pogoda.widzialnosc                =   JSON_Weather["current"]["vis_km"];
  490.     pogoda.index_uv                   =   JSON_Weather["current"]["uv"];
  491.  
  492.     if(pogoda.miejscowosc == PogodaMiasto)
  493.     {
  494.         Pogoda2PL();
  495.         OpisPogody2Bufor();
  496.         Pogoda2Bufor();
  497.         PrintLine(60);
  498.         Serial.printf("\n[DarkNet] [Pogoda] Miejscowość \t\t: ");
  499.         Serial.print(pogoda.miejscowosc);
  500.         Serial.printf("\n[DarkNet] [Pogoda] Kraj \t\t: ");
  501.         Serial.print(pogoda.kraj);
  502.         Serial.printf("\n[DarkNet] [Pogoda] Szer.Geograficzna \t: %2.2f",pogoda.szerokosc_geograficzna);
  503.         Serial.printf("\n[DarkNet] [Pogoda] Dług.Geograficzna \t: %2.2f",pogoda.dlugosc_geograficzna);            
  504.         Serial.printf("\n[DarkNet] [Pogoda] Czas Epoch \t\t: %u",pogoda.czas_epoch );            
  505.         Serial.printf("\n[DarkNet] [Pogoda] Serwer ID \t\t: ");
  506.         Serial.print( pogoda.id );    
  507.         Serial.printf("\n[DarkNet] [Pogoda] Czas Epoch \t\t: %u",pogoda.czas_epoch );            
  508.         Serial.printf("\n[DarkNet] [Pogoda] Czas Lokalny \t: ");      
  509.         Serial.print( pogoda.czas_lokalny );        
  510.         Serial.printf("\n[DarkNet] [Pogoda] Aktualizacja \t: ");      
  511.         Serial.print( pogoda.ostatnia_aktualizacja );      
  512.         Serial.printf("\n[DarkNet] [Pogoda] Temperatura \t\t: %2.2f",pogoda.temperatura_C);
  513.         Serial.printf("\n[DarkNet] [Pogoda] Temp.Odczuwalna \t: %2.2f",pogoda.temperatura_C_odczuwalna);  
  514.         Serial.printf("\n[DarkNet] [Pogoda] Opis pogody PL\t: ");
  515.         Serial.print(pogoda.kondycja_pl);  
  516.         Serial.printf("\n[DarkNet] [Pogoda] Opis pogody EN\t: ");
  517.         Serial.print(pogoda.kondycja);  
  518.         Serial.printf("\n[DarkNet] [Pogoda] Predkosc wiatru \t: %2.2f",pogoda.predkosc_wiatru_kph);
  519.         Serial.printf("\n[DarkNet] [Pogoda] Podmuchy wiatru \t: %2.2f",pogoda.podmuchy_wiatru);  
  520.         Serial.printf("\n[DarkNet] [Pogoda] Kierunek wiatru \t: %2.2f",pogoda.kierunek_wiatru_stopnie);  
  521.         Serial.printf("\n[DarkNet] [Pogoda] Kierunek wiatru \t: ");
  522.         Serial.print(pogoda.kierunek_wiatru_kompas);  
  523.         Serial.printf("\n[DarkNet] [Pogoda] Cisnienie \t\t: %d",pogoda.cisnienie);  
  524.         Serial.printf("\n[DarkNet] [Pogoda] Opady deszczu \t: %2.2f",pogoda.opady);  
  525.         Serial.printf("\n[DarkNet] [Pogoda] Wilgotnosc \t\t: %d",pogoda.wilgotnosc);  
  526.         Serial.printf("\n[DarkNet] [Pogoda] Zachmurzenie \t: %d",pogoda.zachmurzenie);  
  527.         Serial.printf("\n[DarkNet] [Pogoda] Widzialnosc \t\t: %d",pogoda.widzialnosc);  
  528.         Serial.printf("\n[DarkNet] [Pogoda] Index UV \t\t: %d",pogoda.index_uv);  
  529.              
  530.         PrintLine(60);
  531.         PrintEND();
  532.         F_Pogoda = true;      // dane OK, ustaw flagę na true
  533.     }
  534.     else  F_Pogoda = false;   // dane ZŁE, ustaw flagę na false
  535.  
  536. }
  537.  
  538. //
  539. // ------------------------------------------------------------------------------------------------------------ //
  540. // ---        A S T R O N O M I A   Z   A N G I E L S K I   D O   P O L S K I                               --- //    
  541. // ------------------------------------------------------------------------------------------------------------ //
  542. //
  543.  
  544. void Astronomia2PL()
  545. {
  546.     if (astronomia.faza_ksiezyca == "Waxing Crescent")
  547.     {
  548.         astronomia.faza_ksiezyca_pl = "Sierp przybywający";    
  549.     }
  550.     else
  551.     if (astronomia.faza_ksiezyca == "New Moon")
  552.     {
  553.         astronomia.faza_ksiezyca_pl = "Nów";
  554.     }
  555.     else
  556.     if (astronomia.faza_ksiezyca == "First Quarter")
  557.     {
  558.         astronomia.faza_ksiezyca_pl = "Pierwszy kwartał";
  559.     }
  560.     else
  561.     if (astronomia.faza_ksiezyca == "Waxing Gibbous")
  562.     {
  563.         astronomia.faza_ksiezyca_pl = "Przybywający Księżyc";
  564.     }
  565.     else
  566.     if (astronomia.faza_ksiezyca == "Full Moon")
  567.     {
  568.         astronomia.faza_ksiezyca_pl = "Pełnia Księżyca";
  569.     }
  570.     else
  571.     if (astronomia.faza_ksiezyca == "Waning Gibbous")
  572.     {
  573.         astronomia.faza_ksiezyca_pl = "Ubywający Księżyc";
  574.     }
  575.     else    
  576.     if (astronomia.faza_ksiezyca == "Last Quarter")
  577.     {
  578.         astronomia.faza_ksiezyca_pl = "Ostatni kwartał";
  579.     }
  580.     else    
  581.     if (astronomia.faza_ksiezyca == "Waning Crescent")
  582.     {
  583.         astronomia.faza_ksiezyca_pl= "Powiększający się Księżyc";
  584.     }
  585. }
  586.  
  587. //
  588. // ------------------------------------------------------------------------------------------------------------ //
  589. // ---        A K T U A L I Z A C J A   A S T R O N O M I I                                                 --- //    
  590. // ------------------------------------------------------------------------------------------------------------ //
  591. //
  592.  
  593. void AstronomiaAktualizuj()
  594. {
  595.     PrintLine(60);
  596.     PrintMSG("ESP32","MyTask", "Aktualizję astronomię z serwera : api.weatherapi.com");    
  597.  
  598.     // pobierz dane astronomiczne z serwera dla miasta LUBIN
  599.        
  600.     String path = "http://api.weatherapi.com/v1/astronomy.json?key=" + PogodaToken + "&lang=pl&q=" + PogodaMiasto;
  601.     String jsonBuffer = httpGETRequest(path.c_str());    
  602.        
  603.     JSON_Astronomy = JSON.parse(jsonBuffer);                
  604.  
  605.     if (JSON.typeof(JSON_Astronomy) == "undefined")                                                
  606.     {                                                                                        
  607.         PrintLine(60);
  608.         PrintMSG("DarkNet", "ASTRONOMIA PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  609.     }      
  610.      
  611.     astronomia.miejscowosc              =   JSON_Astronomy["location"]["name"];
  612.     astronomia.kraj                     =   JSON_Astronomy["location"]["country"];
  613.     astronomia.szerokosc_geograficzna   =   JSON_Astronomy["location"]["lat"];
  614.     astronomia.dlugosc_geograficzna     =   JSON_Astronomy["location"]["lon"];        
  615.     astronomia.czas_epoch               =   JSON_Astronomy["location"]["localtime_epoch"];        
  616.     astronomia.czas_lokalny             =   JSON_Astronomy["location"]["localtime"];
  617.     astronomia.wschod_slonca            =   JSON_Astronomy["astronomy"]["astro"]["sunrise"];
  618.     astronomia.zachod_slonca            =   JSON_Astronomy["astronomy"]["astro"]["sunset"];
  619.     astronomia.wschod_ksiezyca          =   JSON_Astronomy["astronomy"]["astro"]["moonrise"];            
  620.     astronomia.zachod_ksiezyca          =   JSON_Astronomy["astronomy"]["astro"]["moonset"];
  621.     astronomia.faza_ksiezyca            =   JSON_Astronomy["astronomy"]["astro"]["moon_phase"];
  622.     astronomia.oswietlenie_ksiezyca     =   JSON_Astronomy["astronomy"]["astro"]["moon_illumination"];    
  623.  
  624.     if(astronomia.miejscowosc == PogodaMiasto)
  625.     {
  626.        Astronomia2Bufor();
  627.        Astronomia2PL();
  628.        
  629.        PrintLine(60);
  630.        Serial.printf("\n[DarkNet] [Astronomia] Miejscowość \t\t: ");
  631.        Serial.print(astronomia.miejscowosc);
  632.        Serial.printf("\n[DarkNet] [Astronomia] Kraj \t\t\t: ");
  633.        Serial.print(astronomia.kraj);
  634.        Serial.printf("\n[DarkNet] [Astronomia] Szer.Geograficzna \t: %2.2f",astronomia.szerokosc_geograficzna);
  635.        Serial.printf("\n[DarkNet] [Astronomia] Dług.Geograficzna \t: %2.2f",astronomia.dlugosc_geograficzna);            
  636.        Serial.printf("\n[DarkNet] [Astronomia] Czas Epoch \t\t: %u",astronomia.czas_epoch );            
  637.        Serial.printf("\n[DarkNet] [Astronomia] Czas Lokalny \t\t: ");
  638.        Serial.print( astronomia.czas_lokalny );            
  639.        Serial.printf("\n[DarkNet] [Astronomia] Wschód Słońca \t\t: ");
  640.        Serial.print(astronomia.wschod_slonca );
  641.        Serial.printf("\n[DarkNet] [Astronomia] Zachód Słońca \t\t: ");
  642.        Serial.print(astronomia.zachod_slonca );
  643.        Serial.printf("\n[DarkNet] [Astronomia] Wschód Księżyca \t\t: ");
  644.        Serial.print(astronomia.wschod_ksiezyca );
  645.        Serial.printf("\n[DarkNet] [Astronomia] Zachód Księżyca \t\t: ");
  646.        Serial.print(astronomia.zachod_ksiezyca );
  647.        Serial.printf("\n[DarkNet] [Astronomia] Faza Księżyca \t\t: ");
  648.        Serial.print(astronomia.faza_ksiezyca_pl);
  649.        Serial.printf("\n[DarkNet] [Astronomia] Oświetlenie Księżyca \t: ");
  650.        Serial.print(astronomia.oswietlenie_ksiezyca );            
  651.        PrintLine(60);
  652.        PrintEND();
  653.  
  654.        F_Astronomia = true;       // dane w porządku, ustaw flagę na TRUE
  655.     }
  656.     else  F_Astronomia = false;   // dane ZŁE, ustaw flagę na false
  657. }
  658. //
  659. // ------------------------------------------------------------------------------------------------------------ //
  660. // ---        A K T U A L I Z A C J A   J A K O Ś C I   P O W I E T R Z A                                   --- //    
  661. // ------------------------------------------------------------------------------------------------------------ //
  662. //
  663. void PowietrzeAktualizuj()
  664. {
  665.     PrintLine(60);
  666.     PrintMSG("ESP32","MyTask", "Aktualizję jakość powietrza z serwera : api.weatherapi.com");    
  667.  
  668.     // pobierz dane jakości powietrza z serwera dla miasta LUBIN
  669.        
  670.     String path = "http://api.weatherapi.com/v1/current.json?key=" + PogodaToken + "&q=" + PogodaMiasto + "&aqi=yes";
  671.     String jsonBuffer = httpGETRequest(path.c_str());      
  672.        
  673.     JSON_Air = JSON.parse(jsonBuffer);                
  674.  
  675.     if (JSON.typeof(JSON_Air) == "undefined")                                                
  676.     {                                                                                        
  677.         PrintLine(60);
  678.         PrintMSG("DarkNet", "AIR PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  679.     }        
  680.  
  681.     powietrze.co     = JSON_Air["current"]["air_quality"]["co"];
  682.     powietrze.o3     = JSON_Air["current"]["air_quality"]["o3"];
  683.     powietrze.no2    = JSON_Air["current"]["air_quality"]["no2"];
  684.     powietrze.so2    = JSON_Air["current"]["air_quality"]["so2"];
  685.     powietrze.pm25   = JSON_Air["current"]["air_quality"]["pm2_5"];
  686.     powietrze.pm10   = JSON_Air["current"]["air_quality"]["pm10"];
  687.     powietrze.Defra  = JSON_Air["current"]["air_quality"]["gb-defra-index"];
  688.     powietrze.EPA    = JSON_Air["current"]["air_quality"]["us-epa-index"];
  689.  
  690.     switch (powietrze.EPA)
  691.     {
  692.         case  1:  powietrze.opis = "dobra"; break;
  693.         case  2:  powietrze.opis = "umiarkowana"; break;
  694.         case  3:  powietrze.opis = "niezdrowa dla alergików"; break;
  695.         case  4:  powietrze.opis = "niezdrowa"; break;
  696.         case  5:  powietrze.opis = "bardzo niezdrowa"; break;
  697.         case  6:  powietrze.opis = "niebezpieczna"; break;
  698.         default:  powietrze.opis = "Błąd odczytu"; break;
  699.     }
  700.  
  701.     if (powietrze.co != 0)
  702.     {
  703.         Powietrze2Bufor();
  704.         Day2Bufor();
  705.         PrintLine(60);
  706.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Tlenek węgla \t\t: %2.8f [μg/ m3]", powietrze.co);
  707.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Dwutlenek azotu \t\t: %2.8f [μg/ m3]", powietrze.no2);
  708.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Ozon \t\t\t: %2.8f [μg/m3]", powietrze.o3);
  709.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Pyły i aerozole PM2.5 \t: %2.8f [μm]", powietrze.pm25);
  710.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Pyły i aerozole PM10 \t: %2.8f [μm]", powietrze.pm10);
  711.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Index jakości \t\t: %d DEFRA", powietrze.Defra);
  712.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Index jakości \t\t: %d EPA", powietrze.EPA);
  713.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Jakość powietrza \t\t: %s ", powietrze.opis.c_str());
  714.        
  715.         PrintLine(60);
  716.         PrintEND();
  717.    
  718.         F_Powietrze  = true;          
  719.     }
  720.     else F_Powietrze  = false;
  721. }
  722. //
  723. // ------------------------------------------------------------------------------------------------------------ //
  724. // ---        A K T U A L I Z A C J A   P R O G N O Z Ę                                                     --- //    
  725. // ------------------------------------------------------------------------------------------------------------ //
  726. //
  727. void PrognozaAktualizuj()
  728. {
  729.     PrintLine(60);
  730.     PrintMSG("ESP32","MyTask", "Aktualizję prognozę z serwera : api.weatherapi.com");    
  731.  
  732.     // pobierz dane astronomiczne z serwera dla miasta LUBIN
  733.        
  734.     String path = "http://api.weatherapi.com/v1/forecast.json?key=" + PogodaToken + "&q=" + PogodaMiasto + "&days=1&aqi=no&alerts=no";
  735.     String jsonBuffer = httpGETRequest(path.c_str());    
  736.        
  737.     JSON_Forecast = JSON.parse(jsonBuffer);                
  738.  
  739.     if (JSON.typeof(JSON_Forecast) == "undefined")                                                
  740.     {                                                                                        
  741.         PrintLine(60);
  742.         PrintMSG("DarkNet", "AIR PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  743.     }        
  744. }
  745. //
  746. // ------------------------------------------------------------------------------------------------------------ //
  747. // --- MyTask ------------------------------------------------------------------------------------------------- //
  748. // ------------------------------------------------------------------------------------------------------------ //
  749. //
  750. void MyTask()
  751. {
  752.     timeZERO = millis();                                    // zapisz czas 0
  753.     task01s = timeZERO - timeout_task01s;                   // wyznacz nowy
  754.     task01m = timeZERO - timeout_task01m;                   // wyznacz nowy
  755.     task05m = timeZERO - timeout_task05m;                   // wyznacz nowy
  756.     task10m = timeZERO - timeout_task10m;                   // wyznacz nowy
  757.     task15m = timeZERO - timeout_task15m;                   // wyznacz nowy
  758.     task01h = timeZERO - timeout_task01h;                   // wyznacz nowy    
  759.  
  760.     if (F_MaxDemo) M.ShowTest();
  761.  
  762.     // --- ZADANIE co 1 sekundę ------------------------------------------------------------------------------- //
  763.  
  764.     if(task01m >= 1000UL)                      // wykonuj co 1 sekundę
  765.     {  
  766.         if (F_BigClock)                        // jeśli flaga TRUE włącz duży zegar
  767.         {
  768.             M.ShowBigClock();                  // pokaż duży zegar                      
  769.         }
  770.        
  771.         timeout_task01s = timeZERO;  
  772.     }
  773.  
  774.     // --- ZADANIE co 1 minutę ------------------------------------------------------------------------------- //
  775.  
  776.     if(task01m >= 60000UL)                                  // wykonuj co 1 minutę
  777.     {
  778.         if (!F_Astronomia)  AstronomiaAktualizuj();         // jeśli BRAK DANYCH wykonuj co minutę
  779.         if (!F_Pogoda)      PogodaAktualizuj();             // jeśli BRAK DANYCH wykonuj co minutę
  780.         if (!F_Powietrze)   PowietrzeAktualizuj();          // jeśli BRAK DANYCH wykonuj co minutę
  781.         //if (!F_Prognoza)    PrognozaAktualizuj();           // jeśli BRAK DANYCH wykonuj co minutę
  782.  
  783.         // --- ustawianie czasowe flag ---------------------------------------
  784.         if (rtc.getMinute() % 5)        // jeśli minuta nie dzieli się przez 5
  785.         {
  786.            F_BigClock = false;          // wyłącz zegar na matrycy MAX
  787.            F_MaxDemo  = true;
  788.         }
  789.         else                            // jeśli minuta dzieli się przez 5
  790.         {            
  791.             F_BigClock =true;           // włącz zegar na matrycy MAX
  792.             F_MaxDemo = false;
  793.         }
  794.         // -------------------------------------------------------------------
  795.        
  796.         timeout_task01m = timeZERO;  
  797.     }
  798.  
  799.     // --- ZADANIE co 5 minut -------------------------------------------------------------------------------- //
  800.  
  801.     if(task05m >= 300000UL)                                 // wykonuj co 5 minut
  802.     {
  803.         timeout_task05m = timeZERO;  
  804.     }
  805.  
  806.     // --- ZADANIE co 10 minut ------------------------------------------------------------------------------- //
  807.  
  808.     if(task10m >= 600000UL)                                 // wykonuj co 10 minut
  809.     {
  810.         timeout_task10m = timeZERO;    
  811.     }
  812.  
  813.     // --- ZADANIE co 15 minut ------------------------------------------------------------------------------- //
  814.  
  815.     if(task15m >= 900000UL)                                 // wykonuj co 15 minut
  816.     {
  817.         if (F_Astronomia)  AstronomiaAktualizuj();          // jeśli DANE OK co 15 minut
  818.         if (F_Pogoda)      PogodaAktualizuj();              // jeśli DANE OK co 15 minut
  819.         if (F_Powietrze)   PowietrzeAktualizuj();           // jeśli DANE OK co 15 minut
  820.         if (F_DataUpdate) Data2Bufor();                     // aktualizuj i buduj bufor
  821.         //if (F_Prognoza)    PrognozaAktualizuj();            // jeśli BRAK DANYCH wykonuj co minutę
  822.        
  823.         timeout_task15m = timeZERO;                         // resetuj LICZNIK
  824.     }
  825.  
  826.     // --- ZADANIE co 1 godzinę ------------------------------------------------------------------------------- //
  827.  
  828.     if(task01h >= 3600000UL)                                  // wykonuj co 1 godzinę      
  829.     {
  830.         //TBMessage msg;                                        // wiadomosc typu TBMessage
  831.         //myBot.reset();                                        // resetuj BOT'a
  832.         //myBot.begin();
  833.         //myBot.sendMessage(msg, "Restart BOT'A" );             // wyślij info o restarcie
  834.  
  835.         //Data2Bufor();                                       // Data do Bufor'a (przeniesione do CORE0)
  836.  
  837.         #if SERIAL
  838.             Serial.printf("\n[TASK] [TELEGRAM] Restartuje BOT'A");
  839.         #endif
  840.        
  841.         timeout_task01h = timeZERO;                           // resetuj LICZNIK
  842.     }
  843.  
  844. }    
  845.  
  846. // ------------------------------------------------------------------------------------------------------------ //
  847. // --- TELEGRAM INIT ------------------------------------------------------------------------------------------ //
  848. // ------------------------------------------------------------------------------------------------------------ //
  849.  
  850. void TelegramInit()
  851. {
  852.     myBot.setInsecure(false);
  853.     myBot.setClock("CET-1CEST,M3.5.0,M10.5.0/3");   //Aby zapewnić walidację certyfikatu, WiFiClientSecure wymaga aktualizacji czasu
  854.     myBot.setUpdateTime(1000);                      // Ustaw właściwości bota Telegrama
  855.     myBot.setTelegramToken(token);
  856.    
  857.     Serial.printf("\nESP","Telegram Start","Czy wszystko w porzadku?");    
  858.     myBot.begin() ? Serial.println("OK") : Serial.println("NIE");           // daj odpowiedz na Serial
  859.  
  860.     isKeyboardActive = false;                                               // ustaw klawiature
  861.  
  862.     // --- klawiatura REPLY 1 -----------------------------------------------------------------
  863.  
  864.     myReplyKbd.addButton("Pogoda");                                         // dodaj przycisk
  865.     myReplyKbd.addButton("Astro");                                          // Astronomia
  866.     myReplyKbd.addButton("Time");                                           // dodaj przycisk
  867.     myReplyKbd.addButton("Air");                                            // dodaj przycisk    
  868.  
  869.     myReplyKbd.addRow();                                                    // nowy wiersz
  870.  
  871.     myReplyKbd.addButton("System");                                         // nowy przycisk
  872.     myReplyKbd.addButton("Help");                                           // nowy przycisk
  873.     myReplyKbd.addButton("Exit");                                           // nowy przycisk    
  874.  
  875.     myReplyKbd.addRow();                                                    // nowy wiersz
  876.  
  877.     myReplyKbd.addButton("R Status");                                       // nowy przycisk
  878.     myReplyKbd.addButton("R All ON");                                       // wyświetl dostępne opcje
  879.     myReplyKbd.addButton("R All OFF");                                      // zamknik Panel Dolny wyświetl MENU
  880.     myReplyKbd.enableResize();  
  881.    
  882.  
  883.     // --- klawiatura REPLY 2 -----------------------------------------------------------------
  884.  
  885.     myReplyKbd2.addButton("Relay 1");                                        // przekaznik 1
  886.     myReplyKbd2.addButton("Relay 2");                                        // przekaznik 2
  887.     myReplyKbd2.addButton("Relay 3");                                        // przekaznik 3
  888.     myReplyKbd2.addButton("Relay 4");                                        // przekaznik 4
  889.  
  890.     myReplyKbd2.addRow();                                                    // dodaj kolejny wiersz                                          
  891.  
  892.     myReplyKbd2.addButton("Relay 5");                                        // przekaznik 5
  893.     myReplyKbd2.addButton("Relay 6");                                        // przekaznik 6
  894.     myReplyKbd2.addButton("Relay 7");                                        // przekaznik 7
  895.     myReplyKbd2.addButton("Relay 8");                                        // przekaznik 8
  896.  
  897.     myReplyKbd2.addRow();                                                    // dodaj kolejny wiersz                                          
  898.  
  899.     myReplyKbd2.addButton("R Status");                                       // POMOC
  900.     myReplyKbd2.addButton("Help");                                           // EXIT
  901.  
  902.     myReplyKbd2.enableResize();                                              // wlacz auto-rozmiar
  903.  
  904.     // --- klawiatura INLINE -----------------------------------------------------------------
  905.  
  906.     myInlineKbd.addButton("R1", RELAY1_CALLBACK, KeyboardButtonQuery);    // przycisk -> przekaźnik nr. 1
  907.     myInlineKbd.addButton("R2", RELAY2_CALLBACK, KeyboardButtonQuery);    // przycisk -> przekaźnik nr. 2
  908.     myInlineKbd.addRow();    
  909.     myInlineKbd.addButton("R3", RELAY3_CALLBACK, KeyboardButtonQuery);    // przycisk -> przekaźnik nr. 3    
  910.     myInlineKbd.addButton("R4", RELAY4_CALLBACK, KeyboardButtonQuery);    // przycisk -> przekaźnik nr. 4
  911.    
  912.     // --- klawiatura INLINE -----------------------------------------------------------------
  913.  
  914.     myInlineKbd2.addButton("R5", RELAY5_CALLBACK, KeyboardButtonQuery);   // przycisk -> przekaźnik nr. 5
  915.     myInlineKbd2.addButton("R6", RELAY6_CALLBACK, KeyboardButtonQuery);   // przycisk -> przekaźnik nr. 6
  916.     myInlineKbd2.addRow();    
  917.     myInlineKbd2.addButton("R7", RELAY7_CALLBACK, KeyboardButtonQuery);   // przycisk -> przekaźnik nr. 7    
  918.     myInlineKbd2.addButton("R8", RELAY8_CALLBACK, KeyboardButtonQuery);   // przycisk -> przekaźnik nr. 8  
  919. }
  920.  
  921. //
  922. // ------------------------------------------------------------------------------------------------------------ //
  923. // --- W i F i   R E C O N E C T ------------------------------------------------------------------------------ //
  924. // ------------------------------------------------------------------------------------------------------------ //
  925. //
  926.  
  927. void WiFiEvent(WiFiEvent_t event)
  928. {
  929.     switch (event)
  930.     {
  931.         case SYSTEM_EVENT_STA_GOT_IP:         Serial.printf("\n[ESP] [WiFiEvent] [Polaczono z Wi-Fi]");  break;
  932.  
  933.         case SYSTEM_EVENT_STA_DISCONNECTED:   Serial.printf("\n[ESP] [WiFiEvent] [Utracono połączenia z Wi-Fi]");
  934.                                               WiFi.setAutoReconnect(true);
  935.                                               myBot.reset();
  936.                                               break;
  937.         default:                              break;
  938.   }
  939. }
  940.  
  941. //
  942. // ------------------------------------------------------------------------------------------------------------ //
  943. // --- Telegram --- Pogoda do String  ------------------------------------------------------------------------- //
  944. // ------------------------------------------------------------------------------------------------------------ //
  945. //
  946.  
  947. String TelegramPogoda()
  948. {
  949.     String bufor;                                   // bufor tekstowy dla danych pogodowych
  950.  
  951.         bufor   =   "Miejscowosc : "  + pogoda.miejscowosc + "\n";
  952.         bufor  +=   "aktualizacja : " + pogoda.ostatnia_aktualizacja + "\n";
  953.         bufor  +=   "Temperatura = " + String( pogoda.temperatura_C ) + " st.C\n";
  954.         bufor  +=   "Wilgotnosc = " + String( pogoda.wilgotnosc ) + " %\n";
  955.         bufor  +=   "Cisnienie =  " + String( pogoda.cisnienie ) + " mPa\n";
  956.         bufor  +=   "Opady deszczu = " + String( pogoda.opady ) + " mm\n";
  957.         bufor  +=   "Predkosc wiatru = " + String(pogoda.predkosc_wiatru_kph ) + " km/h\n";
  958.         bufor  +=   "Kierunek wiatru = " + pogoda.kierunek_wiatru_kompas + " \n";
  959.         bufor  +=   "Index UV = " + String( pogoda.index_uv ) + "\n";
  960.         bufor  +=   "Opis skrocony EN: " + pogoda.kondycja + "\n";        
  961.         bufor  +=   "Opis skrocony PL: " + pogoda.kondycja_pl + "\n";        
  962.  
  963.     return bufor;                                   // zwróć bufor i wyślij na smarphona
  964. }
  965.  
  966. //
  967. // ------------------------------------------------------------------------------------------------------------ //  
  968. // --- Telegram --- Data i Czas do String  -------------------------------------------------------------------- //
  969. // ------------------------------------------------------------------------------------------------------------ //
  970. //
  971.  
  972. String TelegramNTP()
  973. {
  974.     String  bufor;
  975.  
  976.       bufor  = "Data: " + zegar.SformatowanaData + "\n";
  977.       bufor += "Czas: " + zegar.SformatowanyCzas + "\n";          
  978.  
  979.     return bufor;
  980. }
  981.  
  982. //
  983. // ------------------------------------------------------------------------------------------------------------ //  
  984. // --- Telegram --- Astronomia do String  --------------------------------------------------------------------- //
  985. // ------------------------------------------------------------------------------------------------------------ //  
  986. //
  987.  
  988. String TelegramASTRO()
  989. {
  990.     String  bufor;
  991.  
  992.       bufor   =  "Miejscowosc : "   + astronomia.miejscowosc + "\n";
  993.       bufor  +=  "Wschod Slonca = " + astronomia.wschod_slonca + "\n";          
  994.       bufor  +=  "Zachod Slonca = " + astronomia.zachod_slonca + "\n";          
  995.       bufor  +=  "Wschod Ksiezyca = " + astronomia.wschod_ksiezyca + "\n";
  996.       bufor  +=  "Zachod Ksiezyca = " + astronomia.zachod_ksiezyca + "\n";
  997.       bufor  +=  "Faza Ksiezyca EN = " + astronomia.faza_ksiezyca + "\n";
  998.       bufor  +=  "Faza Ksiezyca PL = " + astronomia.faza_ksiezyca_pl + "\n";
  999.       bufor  +=  "Oświetlenie Ksiezyca = " + astronomia.oswietlenie_ksiezyca + "\n";
  1000.  
  1001.     return bufor;
  1002. }
  1003.  
  1004. //
  1005. // ------------------------------------------------------------------------------------------------------------ //  
  1006. // --- Telegram --- Powietrze do String  ---------------------------------------------------------------------- //
  1007. // ------------------------------------------------------------------------------------------------------------ //  
  1008. //
  1009.  
  1010. String TelegramAIR()
  1011. {
  1012.     String  bufor;
  1013.  
  1014.       bufor   =  "Miejscowosc : "   + astronomia.miejscowosc + "\n";
  1015.       bufor  +=  "Tlenek węgla = " + String(powietrze.co) + " μg/m3\n";          
  1016.       bufor  +=  "Ozon = " + String(powietrze.o3) + " μg/m3\n";          
  1017.       bufor  +=  "Dwutlenek azotu = " + String(powietrze.no2) + " μg/m3\n";
  1018.       bufor  +=  "Dwutlenek siarki = " + String(powietrze.so2) + " μg/m3\n";
  1019.       bufor  +=  "Aerozole PM2.5 = " + String(powietrze.pm25) + " μm\n";
  1020.       bufor  +=  "Aerozole PM10 = " + String(powietrze.pm10) + " μm\n";
  1021.       bufor  +=  "Index Jakości = " + String(powietrze.Defra) + " DEFRA\n";
  1022.       bufor  +=  "Jakość powietrza = " + powietrze.opis;
  1023.  
  1024.     return bufor;
  1025. }
  1026.  
  1027. //
  1028. // ------------------------------------------------------------------------------------------------------------ //  
  1029. // --- Telegram --- System do String  ------------------------------------------------------------------------- //
  1030. // ------------------------------------------------------------------------------------------------------------ //  
  1031. //
  1032.  
  1033. String TelegramSYSTEM()
  1034. {
  1035.     String  bufor;
  1036.  
  1037.       bufor   =    "CPU Freq : " + String(ESP.getCpuFreqMHz()) + " MHz\n";
  1038.       bufor   +=   "Free Heap Size : " + String(ESP.getFreeHeap()/1000) + " kB\n";      
  1039.       bufor   +=   "Min Free Heap : " + String(ESP.getMinFreeHeap()/1000) + " kB\n";      
  1040.       bufor   +=   "Max Alloc Heap : " + String(ESP.getMaxAllocHeap()/1000) + " kB\n";      
  1041.       bufor   +=   "Heap Size : " + String(ESP.getHeapSize()/1000) + " kB\n";  
  1042.  
  1043.     return bufor;
  1044. }
  1045.  
  1046. //
  1047. // ------------------------------------------------------------------------------------------------------------ //  
  1048. // --- Telegram --- Relay Switch do String  ------------------------------------------------------------------- //
  1049. // ------------------------------------------------------------------------------------------------------------ //  
  1050. //
  1051.  
  1052. String TelegramSwitchRelay(byte relayNR)
  1053. {
  1054.     String bufor;
  1055.  
  1056.         if (przekaznik[relayNR].relaySTATUS)                                // jeśli przekaźnik włączony to OFF
  1057.         {
  1058.             przekaznik[relayNR].relaySTATUS = false;
  1059.             przekaznik[relayNR].relayOPIS   = "OFF";
  1060.             bufor  = "Przekaznik [" + String(relayNR + 1) + "] został wyłączony !!!";  
  1061.             RelayInfo = "Przeka\251nik nr. " + String(relayNR+1) + " zosta\247 wy\247\252czony.";          
  1062.         }
  1063.         else                                                                // jeśli przekaźnik wyłączony to ON
  1064.         {
  1065.             przekaznik[relayNR].relaySTATUS = true;
  1066.             przekaznik[relayNR].relayOPIS   = "ON";  
  1067.             bufor  = "Przekaznik [" + String(relayNR + 1) + "] został wyłączony !!!";              
  1068.             RelayInfo = "Przeka\251nik nr. " + String(relayNR+1) + " zosta\247 w\247\252czony.";          
  1069.         }
  1070.  
  1071.         bufor += "\nPrzekaznik [" + String(relayNR +1) + "] : " + przekaznik[relayNR].relayOPIS + " \n";  
  1072.  
  1073.         F_Przekaznik = true;                                            // zarejestruj zdarzenie do flagi
  1074.         F_BigClock = false;                                             // wyłącz zegar
  1075.         F_MaxDemo  = true;                                              // włącz Demo
  1076.         Serial.printf("F Przekaznik = %d", F_Przekaznik);
  1077.        
  1078.        
  1079.  
  1080.     return bufor;
  1081. }
  1082.  
  1083. //
  1084. // ------------------------------------------------------------------------------------------------------------ //  
  1085. // --- Telegram --- Relay All ON do String  ------------------------------------------------------------------- //
  1086. // ------------------------------------------------------------------------------------------------------------ //  
  1087. //
  1088.  
  1089. String TelegramRELAY_ALL_ON()
  1090. {
  1091.     String bufor;
  1092.  
  1093.       for (byte r = 0; r < 8; r ++)                       // przejedź wszystkie przekaznini
  1094.       {
  1095.           przekaznik[r].relaySTATUS = true;               // status przekaźnika : true (włączony)
  1096.           przekaznik[r].relayOPIS   = "ON";               // opis przekaźnika   : ON (włączony)
  1097.       }
  1098.  
  1099.       bufor  =  "[TELEGRAM] Wszystkie przekaźniki zostały włączone\n";
  1100.       bufor  += TelegramRELAY();    
  1101.  
  1102.       RelayInfo = "Wszystkie przeka\251niki zosta\247y w\247\252czone.";          
  1103.  
  1104.       F_Przekaznik = true;                                            // zarejestruj zdarzenie do flagi
  1105.       F_BigClock = false;                                             // wyłącz zegar
  1106.       F_MaxDemo  = true;                                              // włącz Demo
  1107.      
  1108.  
  1109.     return bufor;
  1110. }
  1111.  
  1112. //
  1113. // ------------------------------------------------------------------------------------------------------------ //  
  1114. // --- Telegram --- Relay All OFF do String  ------------------------------------------------------------------ //
  1115. // ------------------------------------------------------------------------------------------------------------ //  
  1116. //
  1117.  
  1118. String TelegramRELAY_ALL_OFF()
  1119. {
  1120.     String bufor;
  1121.  
  1122.       for (byte r = 0; r < 8; r ++)                       // przejedź wszystkie przekaznini
  1123.       {
  1124.           przekaznik[r].relaySTATUS = false;              // status przekaźnika : true (włączony)
  1125.           przekaznik[r].relayOPIS   = "OFF";              // opis przekaźnika   : ON (włączony)
  1126.       }
  1127.  
  1128.       bufor  =  "[TELEGRAM] Wszystkie przekaźniki zostały wyłączone\n";
  1129.       bufor  += TelegramRELAY();  
  1130.      
  1131.       RelayInfo = "Wszystkie przeka\251niki zosta\247y wy\247\252czone.";          
  1132.  
  1133.       F_Przekaznik = true;                                            // zarejestruj zdarzenie do flagi
  1134.       F_BigClock = false;                                             // wyłącz zegar
  1135.       F_MaxDemo  = true;                                              // włącz Demo
  1136.      
  1137.     return bufor;
  1138. }
  1139.  
  1140. //
  1141. // ------------------------------------------------------------------------------------------------------------ //  
  1142. // --- Telegram --- RELAY STATUS do String  ------------------------------------------------------------------- //
  1143. // ------------------------------------------------------------------------------------------------------------ //  
  1144. //
  1145.  
  1146. String TelegramRELAY()
  1147. {
  1148.     String  bufor;    
  1149.  
  1150.       bufor   =    "Przekaznik [1] : " + przekaznik[0].relayOPIS + " \n";      
  1151.       bufor   +=   "Przekaznik [2] : " + przekaznik[1].relayOPIS + " \n";
  1152.       bufor   +=   "Przekaznik [3] : " + przekaznik[2].relayOPIS + " \n";
  1153.       bufor   +=   "Przekaznik [4] : " + przekaznik[3].relayOPIS + " \n";
  1154.       bufor   +=   "Przekaznik [5] : " + przekaznik[4].relayOPIS + " \n";
  1155.       bufor   +=   "Przekaznik [6] : " + przekaznik[5].relayOPIS + " \n";
  1156.       bufor   +=   "Przekaznik [7] : " + przekaznik[6].relayOPIS + " \n";
  1157.       bufor   +=   "Przekaznik [8] : " + przekaznik[7].relayOPIS + " \n";
  1158.  
  1159.     return bufor;
  1160. }
  1161.  
  1162. //
  1163. // ------------------------------------------------------------------------------------------------------------ //  
  1164. // --- Telegram --- Główna Funckja do obsługi Smartphona ------------------------------------------------------ //
  1165. // ------------------------------------------------------------------------------------------------------------ //  
  1166. //
  1167.  
  1168. void Telegram()
  1169. {
  1170.     TBMessage msg;
  1171.  
  1172.     if (myBot.getNewMessage(msg))  // jesli nadeszła wiadomość
  1173.     {
  1174.         String tgReply;
  1175.         MessageType msgType = msg.messageType;
  1176.        
  1177.       switch (msgType)
  1178.       {
  1179.           case MessageText :            // odebrano wiadomosc tekstową
  1180.        
  1181.                             tgReply = msg.text;
  1182.  
  1183.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1184.                            
  1185.                             if(tgReply.equalsIgnoreCase("Relay 1"))                              
  1186.                             {
  1187.                                 #if SERIAL
  1188.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 1");
  1189.                                 #endif
  1190.  
  1191.                                 myBot.sendMessage(msg, TelegramSwitchRelay(0).c_str());   // wyślij pogodę
  1192.                             }
  1193.  
  1194.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1195.                            
  1196.                             if(tgReply.equalsIgnoreCase("Relay 2"))                              
  1197.                             {
  1198.                                 #if SERIAL
  1199.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 2");
  1200.                                 #endif
  1201.  
  1202.                                 myBot.sendMessage(msg, TelegramSwitchRelay(1).c_str());   // wyślij pogodę
  1203.                             }
  1204.  
  1205.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1206.                            
  1207.                             if(tgReply.equalsIgnoreCase("Relay 3"))                              
  1208.                             {
  1209.                                 #if SERIAL
  1210.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 3");
  1211.                                 #endif
  1212.  
  1213.                                 myBot.sendMessage(msg, TelegramSwitchRelay(2).c_str());   // wyślij pogodę
  1214.                             }
  1215.  
  1216.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1217.                            
  1218.                             if(tgReply.equalsIgnoreCase("Relay 4"))                              
  1219.                             {
  1220.                                 #if SERIAL
  1221.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 4");
  1222.                                 #endif
  1223.  
  1224.                                 myBot.sendMessage(msg, TelegramSwitchRelay(3).c_str());   // wyślij pogodę
  1225.                             }
  1226.  
  1227.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1228.                            
  1229.                             if(tgReply.equalsIgnoreCase("Relay 5"))                              
  1230.                             {
  1231.                                 #if SERIAL
  1232.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 5");
  1233.                                 #endif
  1234.  
  1235.                                 myBot.sendMessage(msg, TelegramSwitchRelay(4).c_str());   // wyślij pogodę
  1236.                             }
  1237.  
  1238.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1239.                            
  1240.                             if(tgReply.equalsIgnoreCase("Relay 6"))                              
  1241.                             {
  1242.                                 #if SERIAL
  1243.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 6");
  1244.                                 #endif
  1245.  
  1246.                                 myBot.sendMessage(msg, TelegramSwitchRelay(5).c_str());   // wyślij pogodę
  1247.                             }
  1248.  
  1249.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1250.                            
  1251.                             if(tgReply.equalsIgnoreCase("Relay 7"))                              
  1252.                             {
  1253.                                 #if SERIAL
  1254.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 7");
  1255.                                 #endif
  1256.  
  1257.                                 myBot.sendMessage(msg, TelegramSwitchRelay(6).c_str());   // wyślij pogodę
  1258.                             }
  1259.  
  1260.                             // --- jeśli w apce Telegram wciśnięto przycisk "Przekaznik numer" -------------- //
  1261.                            
  1262.                             if(tgReply.equalsIgnoreCase("Relay 8"))                              
  1263.                             {
  1264.                                 #if SERIAL
  1265.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Przekaźnik nr. 8");
  1266.                                 #endif
  1267.  
  1268.                                 myBot.sendMessage(msg, TelegramSwitchRelay(7).c_str());   // wyślij pogodę
  1269.                             }
  1270.                            
  1271.                             // --- jeśli w apce Telegram wciśnięto przycisk "Pogoda" ----------------------- //
  1272.                            
  1273.                             if(tgReply.equalsIgnoreCase("Pogoda"))                              
  1274.                             {
  1275.                                 #if SERIAL
  1276.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij pogode");
  1277.                                 #endif
  1278.  
  1279.                                 myBot.sendMessage(msg, TelegramPogoda().c_str());   // wyślij pogodę
  1280.                             }
  1281.  
  1282.                             // --- jeśli w apce Telegram wcisnieto przycisk "Data i Czas" ------------------ //
  1283.  
  1284.                             else if(tgReply.equalsIgnoreCase("Time"))
  1285.                             {
  1286.                                 #if SERIAL
  1287.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij datę i czas");
  1288.                                 #endif
  1289.  
  1290.                                 myBot.sendMessage(msg, TelegramNTP().c_str());      // wyślij datę i czas
  1291.                             }
  1292.                        
  1293.                             // --- jeśli w apce Telegram wcisnieto przycisk "Wolny RAM --------------------- //
  1294.                            
  1295.                             else if(tgReply.equalsIgnoreCase("System"))
  1296.                             {
  1297.                                 #if SERIAL
  1298.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyślij dane o systemie");
  1299.                                 #endif
  1300.                                
  1301.                                 myBot.sendMessage(msg, TelegramSYSTEM().c_str());
  1302.                             }
  1303.                            
  1304.                             // --- jeśli w apce Telegram wcisnieto przycisk Astronomia --------------------- //
  1305.                            
  1306.                             else if(tgReply.equalsIgnoreCase("Astro"))              // wyślij astronomię
  1307.                             {
  1308.                                 #if SERIAL
  1309.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij astronomie");
  1310.                                 #endif
  1311.  
  1312.                                 myBot.sendMessage(msg, TelegramASTRO().c_str());
  1313.                             }
  1314.  
  1315.                             // --- jeśli w apce Telegram wcisnieto przycisk Air ---------------------------- //
  1316.                            
  1317.                             else if(tgReply.equalsIgnoreCase("Air"))                // wyślij powietrze
  1318.                             {
  1319.                                 #if SERIAL
  1320.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij powietrze");
  1321.                                 #endif
  1322.  
  1323.                                 myBot.sendMessage(msg, TelegramAIR().c_str());
  1324.                             }
  1325.  
  1326.                             // --- jeśli w apce Telegram wcisnieto przycisk Relay ---------------------------- //
  1327.                            
  1328.                             else if(tgReply.equalsIgnoreCase("R Status"))                // stan przekaźników
  1329.                             {
  1330.                                 #if SERIAL
  1331.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij stan przekaźników");
  1332.                                 #endif
  1333.  
  1334.                                 myBot.sendMessage(msg, TelegramRELAY().c_str());
  1335.                             }
  1336.  
  1337.                             // --- jeśli w apce Telegram wcisnieto przycisk Relay ---------------------------- //
  1338.                            
  1339.                             else if(tgReply.equalsIgnoreCase("R All ON"))                // wszystkie włącz
  1340.                             {
  1341.                                 #if SERIAL
  1342.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij stan przekaźników");
  1343.                                 #endif
  1344.  
  1345.                                 myBot.sendMessage(msg, TelegramRELAY_ALL_ON().c_str());
  1346.                             }
  1347.  
  1348.                             // --- jeśli w apce Telegram wcisnieto przycisk Relay ---------------------------- //                            
  1349.                            
  1350.                             else if(tgReply.equalsIgnoreCase("R All OFF"))                // wszystkie wyłącz
  1351.                             {
  1352.                                 #if SERIAL
  1353.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> wyslij stan przekaźników");
  1354.                                 #endif
  1355.  
  1356.                                 myBot.sendMessage(msg, TelegramRELAY_ALL_OFF().c_str());
  1357.                             }
  1358.  
  1359.                             // --- jeśli w apce Telegram wcisnieto przycisk EXIT ---------------------------- //
  1360.                            
  1361.                             else if(tgReply.equalsIgnoreCase("Exit"))                // wyślij powietrze
  1362.                             {
  1363.                                 #if SERIAL
  1364.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Zamknij Panel Dolny");
  1365.                                 #endif
  1366.                                
  1367.                                 isKeyboardActive = false;
  1368.                                 myBot.sendMessage(msg, "/przekazniki\n/system\n/relay1\n/relay2\n");
  1369.                                 myBot.removeReplyKeyboard(msg, "Ukryto klawiature");                                
  1370.                                
  1371.                             }
  1372.  
  1373.                             // --- jeśli w apce Telegram wcisnieto przycisk EXIT ---------------------------- //
  1374.                            
  1375.                             else if(tgReply.equalsIgnoreCase("Help"))                // wyślij powietrze
  1376.                             {
  1377.                                 #if SERIAL
  1378.                                     Serial.printf("\n[TELEGRAM] [Nadeszlo żądanie] -> Zamknij Panel Dolny");
  1379.                                 #endif
  1380.                                
  1381.                                 myBot.sendMessage(msg, "/przekazniki\n/system\n/relay1\n/relay2\n");                                
  1382.                             }
  1383.  
  1384.                             // ----------------------------------------------------------------------------- //
  1385.  
  1386.                             else if (tgReply.equalsIgnoreCase("/system"))       // pokaż panel systemowy (DOLNY)
  1387.                             {
  1388.                                 myBot.sendMessage(msg, "PANEL SYSTEMOWY", myReplyKbd);
  1389.                                 isKeyboardActive = true;
  1390.                             }
  1391.  
  1392.                             // ----------------------------------------------------------------------------- //
  1393.  
  1394.                             else if (tgReply.equalsIgnoreCase("/przekazniki"))  // pokaż panel przekaźników (DOLNY)
  1395.                             {
  1396.                                 myBot.sendMessage(msg, "PANEL PRZEKAZNIKOW", myReplyKbd2);
  1397.                                 isKeyboardActive = true;
  1398.                             }
  1399.  
  1400.                             // ----------------------------------------------------------------------------- //
  1401.  
  1402.                             else if (tgReply.equalsIgnoreCase("/relay1"))
  1403.                             {
  1404.                                 myBot.sendMessage(msg, "To jest PANEL REYAL 1", myInlineKbd);          
  1405.                             }
  1406.  
  1407.                             // ----------------------------------------------------------------------------- //
  1408.                            
  1409.                             else if (tgReply.equalsIgnoreCase("/relay2"))
  1410.                             {
  1411.                                 myBot.sendMessage(msg, "To jest PANEL REYAL 2", myInlineKbd2);          
  1412.                             }
  1413.  
  1414.                             // ----------------------------------------------------------------------------- //
  1415.  
  1416.                             if (isKeyboardActive)
  1417.                             {
  1418.                                 if (tgReply.equalsIgnoreCase("EXIT"))
  1419.                                 {
  1420.                                     myBot.removeReplyKeyboard(msg, "Ukryto klawiature");
  1421.                                     isKeyboardActive = false;
  1422.                                 }
  1423.                                 else
  1424.                                 {
  1425.                                     myBot.sendMessage(msg, msg.text);
  1426.                                 }
  1427.                             }
  1428.  
  1429.                             // ----------------------------------------------------------------------------- //
  1430.  
  1431.                             else if(tgReply.equalsIgnoreCase("/start"))
  1432.                             {          
  1433.                                 myBot.sendMessage(msg, "/przekazniki\n/system\n/relay1\n/relay2\n");
  1434.                             }
  1435.                             break;
  1436.  
  1437.                             // ----------------------------------------------------------------------------- //
  1438.  
  1439.           case MessageQuery:      // wiadomosc dla CallBacka
  1440.        
  1441.                             tgReply = msg.callbackQueryData;
  1442.                             Serial.print("\nCallback, odebrano wiadomosc: ");
  1443.                             Serial.println(tgReply);
  1444.        
  1445.                             if (tgReply.equalsIgnoreCase(RELAY1_CALLBACK))
  1446.                             {
  1447.                                 Serial.println("\nPrzekaznik 1");
  1448.                                 myBot.endQuery(msg, "Przekaznik 1", true);
  1449.                             }
  1450.                             else
  1451.                             if (tgReply.equalsIgnoreCase(RELAY2_CALLBACK))
  1452.                             {
  1453.                                 Serial.println("\nPrzekaznik 2");
  1454.                                 myBot.endQuery(msg, "Przekaznik 2", true);
  1455.                             }
  1456.                             else
  1457.                             if (tgReply.equalsIgnoreCase(RELAY3_CALLBACK))
  1458.                             {
  1459.                                 Serial.println("\nPrzekaznik 3");
  1460.                                 myBot.endQuery(msg, "Przekaznik 3", true);
  1461.                             }
  1462.                             else
  1463.                             if (tgReply.equalsIgnoreCase(RELAY4_CALLBACK))
  1464.                             {
  1465.                                 Serial.println("\nPrzekaznik 4");
  1466.                                 myBot.endQuery(msg, "Przekaznik 4", true);
  1467.                             }
  1468.                             else
  1469.                             if (tgReply.equalsIgnoreCase(RELAY5_CALLBACK))
  1470.                             {
  1471.                                 Serial.println("\nPrzekaznik 5");
  1472.                                 myBot.endQuery(msg, "Przekaznik 5", true);
  1473.                             }
  1474.                             else
  1475.                             if (tgReply.equalsIgnoreCase(RELAY6_CALLBACK))
  1476.                             {
  1477.                                 Serial.println("\nPrzekaznik 6");
  1478.                                 myBot.endQuery(msg, "Przekaznik 6", true);
  1479.                             }
  1480.                             else
  1481.                             if (tgReply.equalsIgnoreCase(RELAY7_CALLBACK))
  1482.                             {
  1483.                                 Serial.println("\nPrzekaznik 7");
  1484.                                 myBot.endQuery(msg, "Przekaznik 7", true);
  1485.                             }
  1486.                             else
  1487.                             if (tgReply.equalsIgnoreCase(RELAY8_CALLBACK))
  1488.                             {
  1489.                                 Serial.println("\nPrzekaznik 8");
  1490.                                 myBot.endQuery(msg, "Przekaznik 8", true);
  1491.                             }
  1492.                             break;
  1493.  
  1494.           case MessageLocation:  
  1495.                             char bufL[200];
  1496.                             snprintf(bufL, sizeof(bufL), "Dlugosc geograficzna: %f\nSzerokosc geograficzna: %f\n", msg.location.longitude, msg.location.latitude) ;
  1497.                             myBot.sendMessage(msg, bufL);
  1498.                             Serial.println(bufL);
  1499.                             break;
  1500.  
  1501.           case MessageContact:
  1502.                             char bufC[50];
  1503.                             snprintf(bufC, sizeof(bufC), "Otrzymano kontakt: %s - %s\n", msg.contact.firstName, msg.contact.phoneNumber ) ;                            
  1504.                             myBot.sendMessage(msg, bufC);
  1505.                             Serial.println(bufC);
  1506.                             break;
  1507.           default:          break;
  1508.     }
  1509.   }
  1510. }
  1511.  
  1512. //
  1513. // ------------------------------------------------------------------------------------------------------------ //
  1514. // --- S E T U P ---------------------------------------------------------------------------------------------- //
  1515. // ------------------------------------------------------------------------------------------------------------ //
  1516. //
  1517. void setup()
  1518. {
  1519.    #if SERIAL
  1520.         Serial.begin(SPEED);                // ustaw prędkość terminala SERIAL
  1521.     #endif
  1522.      
  1523.     WiFi.onEvent(WiFiEvent);                // funkcja zdarzenie Event
  1524.     WiFi.setAutoConnect(true);              // auto-reconnect
  1525.     WiFi.begin(SSID, PASSWORD);             // WiFi start
  1526.     WiFi.mode(WIFI_STA);                    // tryb pracy WiFi
  1527.    
  1528.     while ( WiFi.status() != WL_CONNECTED )                                                    
  1529.     {                                                                                          
  1530.         Serial.print(".");
  1531.         delay(50);                                                                    
  1532.     }            
  1533.    
  1534.     timeClient.begin();                           // włącz klienta NTP (pobieranie czasu z internetu)
  1535.  
  1536.     // --- CPU_Core_0 ----------------------------------------------------------------------------------
  1537.                                                                                                        
  1538.     xTaskCreatePinnedToCore(Core0_Task1, "CPU_Core_0", 5000, NULL, 1, &CPU_Core_0, 0);                
  1539.     vTaskDelay(500 / portTICK_PERIOD_MS);                                                              
  1540.                                                                                                        
  1541.     xTaskCreatePinnedToCore(Core0_Task2, "CPU_Core_0", 5000, NULL, 1, &CPU_Core_0, 0);                
  1542.     vTaskDelay(500 / portTICK_PERIOD_MS);  
  1543.        
  1544.    
  1545.     // --- CPU_Core_1 ----------------------------------------------------------------------------------
  1546.  
  1547.     xTaskCreatePinnedToCore(Core1_Task1, "CPU_Core_1", 5000, NULL, 1, &CPU_Core_1, 1);                
  1548.     vTaskDelay(500 / portTICK_PERIOD_MS);      
  1549.                                                                                                          
  1550.     xTaskCreatePinnedToCore(Core1_Task2, "CPU_Core_1", 5000, NULL, 1, &CPU_Core_1, 1);                
  1551.     vTaskDelay(500 / portTICK_PERIOD_MS);
  1552.  
  1553.     // --- MATRYCA -------------------------------------------------------------------------------------
  1554.  
  1555.     P.begin();                                // włącz matrycę
  1556.     P.setIntensity(1);                        // ustaw jasność wyświetlacza
  1557.     M.Setup();                                // skonfiguruj matrycę  
  1558.     TelegramInit();                           // start Telegram
  1559.  
  1560.     // resetuj przekaźniki (aczkowilek domyślnie do tego ESP nie będą podłączone)
  1561.     // dane będą zczytywany z innego ESP który będzie je obsługiwał
  1562.     // tu tylko sterowanie na tym ESP i wyświetlanie będzie
  1563.  
  1564.     for(byte i = 0; i < 8; i ++ )
  1565.     {
  1566.         przekaznik[i].relayID = i;
  1567.         przekaznik[i].relaySTATUS = false;
  1568.         przekaznik[i].relayOPIS = "OFF";
  1569.     }
  1570. }
  1571.  
  1572. //
  1573. // ------------------------------------------------------------------------------------------------------------ //
  1574. // --- L O O P ------------------------------------------------------------------------------------------------ //
  1575. // ------------------------------------------------------------------------------------------------------------ //
  1576. //
  1577.  
  1578. void loop()
  1579. {
  1580.     MyTask();  
  1581.     Telegram();
  1582. }
  1583.  
  1584. //
  1585. // ------------------------------------------------------------------------------------------------------------ //
  1586. // --- E N D  ------------------------------------------------------------------------------------------------- //
  1587. // ------------------------------------------------------------------------------------------------------------ //
  1588. //
  1589. //
  1590. //
  1591. //
  1592. //
  1593. //
  1594. //
  1595. // ----------------------------------------------------------------------------------------------------------- //
  1596. // --- T O O L S --------------------------------------------------------------------------------------------- //
  1597. // ----------------------------------------------------------------------------------------------------------- //
  1598. // --- drukuje poziomą linię o zadanej długości -------------------------------------------------------------- //
  1599. // ----------------------------------------------------------------------------------------------------------- //
  1600. //
  1601.  
  1602. void PrintLine(byte lenght)
  1603. {
  1604.     Serial.printf("\n");  
  1605.     for(byte start = 0; start < lenght; start ++ ) Serial.write("-");
  1606. }
  1607.  
  1608. //
  1609. // ----------------------------------------------------------------------------------------------------------- //
  1610. // --- pokazuje wiadomosc (na wejsciu 3 x char) -------------------------------------------------------------- //
  1611. // ----------------------------------------------------------------------------------------------------------- //
  1612. //
  1613.  
  1614. void PrintMSG(const char * wiadomosc_1, const char * wiadomosc_2, const char * wiadomosc_3)    
  1615. {                                                                                                              
  1616.     Serial.printf("\n[%s] [%s] %s", wiadomosc_1, wiadomosc_2, wiadomosc_3);                                    
  1617. }
  1618.  
  1619. //
  1620. // ----------------------------------------------------------------------------------------------------------- //
  1621. // --- drukuje znak końca linii  ----------------------------------------------------------------------------- //
  1622. // ----------------------------------------------------------------------------------------------------------- //
  1623. //
  1624.  
  1625. void PrintEND()    
  1626. {                                                                                                              
  1627.     Serial.printf("\n");
  1628. }
  1629.  
  1630. //
  1631. // ----------------------------------------------------------------------------------------------------------- //
  1632.  
Add Comment
Please, Sign In to add comment