PowerTGS440

DarkNet ESP32 Server v0.03 BETA

Apr 20th, 2021 (edited)
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 52.87 KB | None | 0 0
  1. // ------------------------------------------------------------------------------------------------------------ //
  2. // ---    D a r k N e t   S e r v e r   &   M e s h   &   B T     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. //  licencja: freeware
  11. //
  12. //  Trans Line Group Tomasz Majcher
  13. //  * usługi transportowe (wywrotki, silosy) - cały kraj
  14. //  * sprzedaż kruszyw (piasek, żwir, pospółka, grysy, tłuczeń, mieszanki, żużel, kryszywa: bazalt, granit)
  15. //  * automatyka przemysłowa i domowa
  16. //
  17. //  do prawidłowego działania należy założyć darmowe konto na stronie http://weatherapi.com
  18. //  oraz podać swój token i miasto w liniach kodu (zamiast TwójToken, TwojeMiasto):
  19. //
  20. //  String path = "http://api.weatherapi.com/v1/current.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  21. //  String path = "http://api.weatherapi.com/v1/astronomy.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  22. //  String path = "http://api.weatherapi.com/v1/current.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  23. //  String path = "http://api.weatherapi.com/v1/forecast.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  24. //
  25. //  oraz zdefiniować swojego routera (D E F I N I C J E)
  26. //  #define   STATION_SSID        "nazwa twojej sieci wi-fi"
  27. //  #define   STATION_PASSWORD    "hasło twojej sieci wi-fi"
  28. //
  29. //  definicje poniższe mogą zostać bez zmian (jeśli je zmienisz, należy to zrobić tez kodzie czujników ESP-01)
  30. //  #define   MESH_PREFIX         "ESP_Root"                  // nazwa sieci MESH
  31. //  #define   MESH_PASSWORD       "ESP_Root"                  // hasło sieci MESH
  32. //  #define   MESH_PORT           5555                        // port  sieci MESH
  33. //
  34. //
  35. // ------------------------------------------------------------------------------------------------------------ //
  36. // --- HISTORIA WERSJI ---------------------------------------------------------------------------------------- //
  37. // ------------------------------------------------------------------------------------------------------------ //
  38. //
  39. //  DarkNet Server v0.03 - obsługa czujników ESP-01
  40. //  DarkNet Server v0.02 - rozbudowa usług MESH
  41. //  DarkNet Server v0.01 - budowa pod serwer WEATHER
  42. //
  43. // ------------------------------------------------------------------------------------------------------------ //
  44. // --- DOŁĄCZONE NAGŁÓWKI BIBLIOTEK --------------------------------------------------------------------------- //
  45. // ------------------------------------------------------------------------------------------------------------ //
  46.  
  47. #include <Arduino.h>
  48. #include <painlessMesh.h>
  49. #include <PubSubClient.h>
  50. #include <WiFiClient.h>
  51. #include <NTPClient.h>                                           // NTP klient (czas)
  52. #include <TimeLib.h>                                             // parser
  53. #include <WiFiUdp.h>                                             // UDP Wi-Fi
  54. #include <HTTPClient.h>                                                            
  55. #include <WiFiClient.h>
  56. #include <Arduino_JSON.h>
  57. #include <ESP32Time.h>                                           // zegar RTC ESP32Time
  58. #include "tools.h"                                               // dołącz moje narzędzia
  59.  
  60.  
  61. // ------------------------------------------------------------------------------------------------------------ //
  62. // --- D E F I N I C J E -------------------------------------------------------------------------------------- //
  63. // ------------------------------------------------------------------------------------------------------------ //
  64.  
  65. #define   MESH_PREFIX         "ESP_Root"                  // nazwa sieci MESH
  66. #define   MESH_PASSWORD       "ESP_Root"                  // hasło sieci MESH
  67. #define   MESH_PORT           5555                        // port  sieci MESH
  68.  
  69. #define   STATION_SSID        "DIABLO"                    // nazwa sieci Wi-Fi (router podłączony do sieci)
  70. #define   STATION_PASSWORD    "xxxxxxxxxxx"               // hasło sieci Wi-Fi (router podłączony do sieci)
  71.  
  72. #define   HOSTNAME            "DarkNet"                   // nazwa hosta (bridge) most sieci MESH i INTERNET
  73.  
  74. #define   SERIAL              1                           // włącz terminal SERIAL.MONITOR
  75. #define   SPEED               115200                      // prędkość terminala SERIAL
  76. #define   THREAD_INFO         0
  77. #define   CORE0_TASK1         1
  78.  
  79.  
  80. // ------------------------------------------------------------------------------------------------------------ //
  81. // --- P R O T O T Y P Y -------------------------------------------------------------------------------------- //
  82. // ------------------------------------------------------------------------------------------------------------ //
  83.  
  84. void receivedCallback( const uint32_t &from, const String &msg );
  85. void mqttCallback(char* topic, byte* payload, unsigned int length);                                            
  86.  
  87. // ------------------------------------------------------------------------------------------------------------ //
  88. // --- O B I E K T Y ------------------------------------------------------------------------------------------ //
  89. // ------------------------------------------------------------------------------------------------------------ //
  90.  
  91. WiFiUDP ntpUDP;                                                     // dla NTP (pobieranie czasu z internetu)
  92. NTPClient timeClient(ntpUDP, "pool.ntp.org", 7200);                 // dla NTP (pobieranie czasu z internetu)
  93. IPAddress getlocalIP();                                             // pobierz adres lokalny IP
  94. IPAddress myIP(0,0,0,0);                                            // mój adres IP
  95. IPAddress mqttBroker(192, 168, 1, 1);                               // mój adres IP
  96. painlessMesh  mesh;                                                 // obiekt mesh                                                                
  97. WiFiClient wifiClient;                                              // obiekt WiFi
  98. HTTPClient http;                                                    // obiekt HTTP
  99. PubSubClient mqttClient(mqttBroker, 1883, mqttCallback, wifiClient);
  100. ESP32Time rtc;
  101.  
  102. JSONVar JSON_Astronomy;                                             // obiekt Astronomia
  103. JSONVar JSON_Weather;                                               // obiekt Pogoda    
  104. JSONVar JSON_Forecast;                                              // obiekt Forecast
  105. JSONVar JSON_Air;                                                   // obiekt Powietrze
  106. JSONVar JSON_Mesh;                                                  // obiekt Mesh Incoming
  107.  
  108. void Core0_Task1( void * pvParameters );                            // funkcja Task1 dla rdzenia nr. 0 CPU        
  109. void Core0_Task2( void * pvParameters );                            // funkcja Task2 dla rdzenia nr. 0 CPU        
  110.  
  111. void Core1_Task1( void * pvParameters );                            // funkcja Task1 dla rdzenia nr. 1 CPU        
  112. void Core1_Task2( void * pvParameters );                            // funkcja Tasl2 dla rdzenia nr. 1 CPU    
  113.  
  114. TaskHandle_t CPU_Core_0;                                            // rdzeń nr. 0 CPU - ESP32
  115. TaskHandle_t CPU_Core_1;                                            // rdzeń nr. 1 CPU - ESP32
  116.  
  117. // ------------------------------------------------------------------------------------------------------------ //
  118. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  119. // ------------------------------------------------------------------------------------------------------------ //
  120. // --- M I E S I Ą C E  P L  ---------------------------------------------------------------------------------- //
  121. // ------------------------------------------------------------------------------------------------------------ //
  122.  
  123. const char MONTH_00 [] = "Error";                                                                            
  124. const char MONTH_01 [] = "Styczeń";                                                                          
  125. const char MONTH_02 [] = "Luty";                                                                            
  126. const char MONTH_03 [] = "Marzec";                                                                          
  127. const char MONTH_04 [] = "Kwiecień";                                                                        
  128. const char MONTH_05 [] = "Maj";                                                                              
  129. const char MONTH_06 [] = "Czerwiec";                                                                        
  130. const char MONTH_07 [] = "Lipiec";                                                                          
  131. const char MONTH_08 [] = "Sierpień";                                                                        
  132. const char MONTH_09 [] = "Wrzesień";                                                                        
  133. const char MONTH_10 [] = "Pazdziernik";                                                                      
  134. const char MONTH_11 [] = "Listopad";
  135. const char MONTH_12 [] = "Grudzień";
  136.  
  137. const char* const MONTH []  = {                                                                        
  138.                                 MONTH_00,
  139.                                 MONTH_01, MONTH_02, MONTH_03, MONTH_04, MONTH_05, MONTH_06,
  140.                                 MONTH_07, MONTH_08, MONTH_09, MONTH_10, MONTH_11, MONTH_12
  141.                               };  
  142.  
  143. // ------------------------------------------------------------------------------------------------------------ //
  144. // --- Z E G A R   N T P  ------------------------------------------------------------------------------------- //
  145. // ------------------------------------------------------------------------------------------------------------ //
  146.  
  147. struct NTP_TIME
  148. {
  149.     String    SformatowanaData;
  150.     String    SformatowanaDataPL;
  151.     int       DzienTygodnia;
  152.     int       DzienMiesiaca;
  153.     int       Miesiac;
  154.     int       Rok;
  155.     String    SformatowanyCzas;    
  156.     String    SformatowanyCzasHM;    
  157.     int       Godzina;
  158.     int       Minuta;
  159.     int       Sekunda;
  160. }
  161. zegar;
  162.  
  163. // ------------------------------------------------------------------------------------------------------------ //
  164. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  165. // ------------------------------------------------------------------------------------------------------------ //
  166. // --- A S T R O N O M I A ------------------------------------------------------------------------------------ //
  167. // ------------------------------------------------------------------------------------------------------------ //
  168.  
  169. struct ASTRONOMY
  170. {
  171.     String    miejscowosc               = "";
  172.     String    kraj                      = "";
  173.     double    szerokosc_geograficzna    = 0;
  174.     double    dlugosc_geograficzna      = 0;    
  175.     long      czas_epoch                = 0;    
  176.     String    czas_lokalny              = "";
  177.     String    wschod_slonca             = "";
  178.     String    zachod_slonca             = "";
  179.     String    wschod_ksiezyca           = "";
  180.     String    zachod_ksiezyca           = "";
  181.     String    faza_ksiezyca             = "";
  182.     String    oswietlenie_ksiezyca      = "";      
  183. }
  184. astronomia;
  185.  
  186. // ------------------------------------------------------------------------------------------------------------ //
  187. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  188. // ------------------------------------------------------------------------------------------------------------ //
  189. // --- P O G O D A -------------------------------------------------------------------------------------------- //
  190. // ------------------------------------------------------------------------------------------------------------ //
  191.  
  192. struct Weather
  193. {
  194.     String    miejscowosc               = "";
  195.     String    kraj                      = "";
  196.     double    szerokosc_geograficzna    = 0;
  197.     double    dlugosc_geograficzna      = 0;    
  198.     String    id                        = "";
  199.     long      czas_epoch                = 0;    
  200.     String    czas_lokalny              = "";
  201.     String    ostatnia_aktualizacja     = "";
  202.     double    temperatura_C             = 0;
  203.     double    temperatura_C_odczuwalna  = 0;
  204.     String    kondycja                  = "";
  205.     double    predkosc_wiatru_kph       = 0;
  206.     double    podmuchy_wiatru           = 0;
  207.     int       kierunek_wiatru_stopnie   = 0;
  208.     String    kierunek_wiatru_kompas    = "";
  209.     int       cisnienie                 = 0;
  210.     double    opady                     = 0;
  211.     int       wilgotnosc                = 0;
  212.     int       zachmurzenie              = 0;
  213.     int       widzialnosc               = 0;
  214.     int       index_uv                  = 0;
  215. }
  216. pogoda;
  217.  
  218. // ------------------------------------------------------------------------------------------------------------ //
  219. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  220. // ------------------------------------------------------------------------------------------------------------ //
  221. // --- P O W I E T R Z E -------------------------------------------------------------------------------------- //
  222. // ------------------------------------------------------------------------------------------------------------ //
  223.  
  224. struct Air
  225. {
  226.     double  co    = 0;                     // Carbon Monoxide (μg/m3)    -   Tlenek węgla (μg / m3)
  227.     double  o3    = 0;                     // Ozone (μg/m3)              -   Ozon (μg / m3)
  228.     double  no2   = 0;                     // Nitrogen dioxide (μg/m3)   -   Dwutlenek azotu (μg / m3)
  229.     double  so2   = 0;                     // Sulphur dioxide (μg/m3)    -   Dwutlenek siarki (μg / m3)
  230.     double  pm25  = 0;                     // PM2.5 (μg/m3)              -   aerozole atmosferyczne o średnicy nie większej niż 2,5 μm
  231.     double  pm10  = 0;                     // PM10 (μg/m3)               -   mieszanina zawieszonych w powietrzu cząsteczek o średnicy nie większej niż 10 μm
  232.     int     Defra = 0;                     // Air Quality Index          -   index jakości powietrza    
  233. }
  234. powietrze;
  235.  
  236. // ------------------------------------------------------------------------------------------------------------ //
  237. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  238. // ------------------------------------------------------------------------------------------------------------ //
  239. // --- P A R S E R   M S G   S E N D  ------------------------------------------------------------------------- //
  240. // ------------------------------------------------------------------------------------------------------------ //
  241.  
  242. struct JSON_MSG
  243. {
  244.     String  czas;         // JSON czas HH:MM:SS
  245.     String  czasHM;       // JSON czas HH:MM
  246.     String  data;         // JSON data DD.MM.YYYY
  247.     String  dataPL;       // JSON data DD miesiac YYYY
  248. }
  249. jmsg;
  250.  
  251. // ------------------------------------------------------------------------------------------------------------ //
  252. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  253. // ------------------------------------------------------------------------------------------------------------ //
  254. // --- F L A G I ---------------------------------------------------------------------------------------------- //
  255. // ------------------------------------------------------------------------------------------------------------ //
  256.  
  257. bool F_Astronomia = false;
  258. bool F_Pogoda     = false;
  259. bool F_Prognoza   = false;
  260. bool F_Powietrze  = false;
  261. bool F_Zegar      = false;
  262.  
  263. // ------------------------------------------------------------------------------------------------------------ //
  264. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  265. // ------------------------------------------------------------------------------------------------------------ //
  266. // --- M I L L I S -------------------------------------------------------------------------------------------- //
  267. // ------------------------------------------------------------------------------------------------------------ //
  268.  
  269. unsigned long timeZERO = 0;  
  270. unsigned long task01m = 0;
  271. unsigned long task05m = 0;
  272. unsigned long task10m = 0;
  273. unsigned long task15m = 0;
  274. unsigned long timeout_task01m = 0;
  275. unsigned long timeout_task05m = 0;
  276. unsigned long timeout_task10m = 0;
  277. unsigned long timeout_task15m = 0;
  278.  
  279. String root = "{\"ID\":\"ROOT\",\"CODE\":0000,\"ROOT\":\"Ja tu rządze [DarkNet] mesh serwer\"}";
  280.  
  281. // ------------------------------------------------------------------------------------------------------------ //
  282. // --- Z M I E N N E   G L O B A L N E ------------------------------------------------------------------------ //
  283. // ------------------------------------------------------------------------------------------------------------ //
  284. // --- P A R S E R   M E S H ---------------------------------------------------------------------------------- //
  285. // ------------------------------------------------------------------------------------------------------------ //
  286.  
  287. struct MeshParser
  288. {
  289.     long    Id;
  290.     int     Code;
  291. }
  292. meshParser;
  293.  
  294. // ------------------------------------------------------------------------------------------------------------ //
  295. // --- p a r s e r   m s g ------------------------------------------------------------------------------------ //
  296. // ------------------------------------------------------------------------------------------------------------ //
  297.  
  298. void parserMsg(const String &msg)
  299. {    
  300.    JSON_Mesh = JSON.parse(msg);        
  301.    
  302.    meshParser.Id    =  JSON_Mesh["ID"];        // ID urządzenia ESP w sieci MESH
  303.    meshParser.Code  =  JSON_Mesh["CODE"];      // KOD rządania z ESP w sieci MESH
  304. }
  305.  
  306. // ------------------------------------------------------------------------------------------------------------ //
  307. // --- o d b i o r n i k   b r o a d c a s t ------------------------------------------------------------------ //
  308. // ------------------------------------------------------------------------------------------------------------ //
  309.  
  310. void receivedCallback( const uint32_t &from, const String &msg )
  311. {
  312.     Serial.printf("\n[ESP Bridge] [otrzymałem od] %u [wiadomosc JSON] %s", from, msg.c_str());  
  313.    
  314.     parserMsg(msg);
  315.  
  316.     switch(meshParser.Code)
  317.     {
  318.         case 0000   :    mesh.sendSingle ( from, root.c_str());
  319.                          break;
  320.        
  321.         case 1001   :    mesh.sendSingle ( from, jmsg.czas.c_str() );   // jeśli nadawca wysłał kod 1001 wyślij mu aktualny czas
  322.                           Serial.printf("\n[ESP Bridge] [wysyłam do] %u [wiadomosc JSON] %s", from, jmsg.czas.c_str());
  323.                          break;  
  324.  
  325.         case 1002   :    mesh.sendSingle ( from, jmsg.czasHM.c_str() );   // jeśli nadawca wysłał kod 1002 wyślij mu aktualny czas
  326.                          Serial.printf("\n[ESP Bridge] [wysyłam do] %u [wiadomosc JSON] %s", from, jmsg.czasHM.c_str());
  327.                          break;  
  328.                        
  329.         case 1011   :    mesh.sendSingle ( from, jmsg.data.c_str() );   // jeśli nadawca wysłał kod 1011 wyślij mu aktualną datę - format: DD.MM.RRRR
  330.                          Serial.printf("\n[ESP Bridge] [wysyłam do] %u [wiadomosc JSON] %s", from, jmsg.data.c_str());
  331.                          break;  
  332.  
  333.         case 1012   :    mesh.sendSingle ( from, jmsg.dataPL.c_str() ); // jeśli nadawca wysłał kod 1012 wyślij mu aktualną datę - format: DD miesiac RRRR
  334.                          Serial.printf("\n[ESP Bridge] [wysyłam do] %u [wiadomosc JSON] %s", from, jmsg.dataPL.c_str());
  335.                          break;  
  336.  
  337.         case 1110   :   // czujnik zewnętrzny ESP-01S DHT11
  338.                         break;
  339.  
  340.         case 1120   :   // czujnik wewnęrzny ESP-01S DHT11
  341.                         break;
  342.                        
  343.         default     :   mesh.sendSingle ( from, "nieznany kod mesh" ); break;              
  344.     }
  345.  
  346. }
  347.  
  348. // ------------------------------------------------------------------------------------------------------------ //
  349. // --- m q t t   C a l l b a c k  ----------------------------------------------------------------------------- //
  350. // ------------------------------------------------------------------------------------------------------------ //
  351.  
  352. void mqttCallback(char* topic, uint8_t* payload, unsigned int length)
  353. {
  354.     char* cleanPayload = (char*)malloc(length+1);
  355.     memcpy(cleanPayload, payload, length);
  356.     cleanPayload[length] = '\0';
  357.     String msg = String(cleanPayload);
  358.     free(cleanPayload);
  359.  
  360.     String targetStr = String(topic).substring(16);
  361.  
  362.     if(targetStr == "gateway")
  363.     {
  364.         if(msg == "getNodes")
  365.         {
  366.             auto nodes = mesh.getNodeList(true);
  367.             String str;
  368.             for (auto &&id : nodes)
  369.                 str += String(id) + String(" ");
  370.                 mqttClient.publish("painlessMesh/from/gateway", str.c_str());
  371.         }
  372.     }
  373.     else
  374.     if(targetStr == "broadcast")
  375.     {
  376.         mesh.sendBroadcast(msg);
  377.     }
  378.     else
  379.     {
  380.         uint32_t target = strtoul(targetStr.c_str(), NULL, 10);
  381.         if(mesh.isConnected(target))
  382.         {
  383.           mesh.sendSingle(target, msg);
  384.         }
  385.         else
  386.         {
  387.           mqttClient.publish("painlessMesh/from/gateway", "Klient nie podłaczony!");
  388.         }
  389.     }
  390. }
  391. //
  392. // ------------------------------------------------------------------------------------------------------------ //
  393. // ---                              M U L T I - C O R E   T A S K                                           --- //
  394. // ------------------------------------------------------------------------------------------------------------ //
  395. //
  396. //
  397. //
  398. //
  399. // ------------------------------------------------------------------------------------------------------------ //
  400. // ---        CORE0 TASK1     POBIERANIE CZASU i DATY Z SERWERA NTP i AKTUALIZACJA ZEGARA ESP32 RTC         --- //
  401. // ------------------------------------------------------------------------------------------------------------ //
  402. //
  403. void Core0_Task1( void * pvParameters )                          
  404. {                                                                
  405.     for(;;)                                                        
  406.     {                                                            
  407.         #if THREAD_INFO
  408.             PrintLine(60);
  409.             PrintMSG("ESP32","CORE", "Wykonuje watek TASK1 na CORE0");
  410.         #endif      
  411.  
  412.         timeClient.update();
  413.        
  414.         unsigned long epochTime = timeClient.getEpochTime();                                              
  415.         struct tm *ptm = gmtime ((time_t *)&epochTime);      
  416.                                                                                    
  417.         zegar.Godzina           =   timeClient.getHours();                  
  418.         zegar.Minuta            =   timeClient.getMinutes();                
  419.         zegar.Sekunda           =   timeClient.getSeconds();                
  420.         zegar.SformatowanyCzas  =   timeClient.getFormattedTime();                                
  421.         zegar.DzienTygodnia     =   timeClient.getDay();                                          
  422.         zegar.DzienMiesiaca     =   ptm->tm_mday;                                                
  423.         zegar.Miesiac           =   ptm->tm_mon+1;                                                
  424.         zegar.Rok               =   ptm->tm_year+1900;
  425.  
  426.         if (zegar.Godzina < 10)
  427.         {
  428.             zegar.SformatowanyCzasHM = "0" + String (zegar.Godzina) + ":";            
  429.         }
  430.         else zegar.SformatowanyCzasHM = String(zegar.Godzina) + ":";            
  431.  
  432.         if (zegar.Minuta < 10)
  433.         {
  434.             zegar.SformatowanyCzasHM += "0" + String (zegar.Minuta) + ":";            
  435.         }
  436.         else zegar.SformatowanyCzasHM += String(zegar.Minuta);            
  437.        
  438.  
  439.         if (zegar.Rok !=1970)
  440.         {
  441.             if(zegar.DzienMiesiaca < 10)
  442.             {
  443.                 zegar.SformatowanaData   = "0" + String(zegar.DzienMiesiaca) + ".";
  444.                 zegar.SformatowanaDataPL = "0" + String(zegar.DzienMiesiaca) + " ";
  445.             }
  446.             else  
  447.             {
  448.                 zegar.SformatowanaData   = String(zegar.DzienMiesiaca) + ".";
  449.                 zegar.SformatowanaDataPL = String(zegar.DzienMiesiaca) + " ";
  450.             }
  451.  
  452.             if(zegar.Miesiac < 10)
  453.             {
  454.                 zegar.SformatowanaData += "0" + String(zegar.Miesiac) + ".";
  455.                 zegar.SformatowanaDataPL += String(MONTH[zegar.Miesiac]) + " ";
  456.             }
  457.             else  
  458.             {
  459.                 zegar.SformatowanaData += String(zegar.Miesiac) + ".";
  460.                 zegar.SformatowanaDataPL += String(MONTH[zegar.Miesiac]) + " ";
  461.             }
  462.  
  463.             zegar.SformatowanaData  += String(zegar.Rok);
  464.             zegar.SformatowanaDataPL += String(zegar.Rok);
  465.  
  466.             // --- zapisz aktualny czas pobrany z serwera NTP do zegara RTC --------------------------------------- //
  467.            
  468.             rtc.setTime(zegar.Sekunda, zegar.Minuta, zegar.Godzina, zegar.DzienMiesiaca, zegar.Miesiac, zegar.Rok);
  469.  
  470.             // --- zbuduj obiekty typu (JSON STRING) do odesłania na żadanie do innego ESP w sieci MESH
  471.  
  472.             jmsg.czas   = "{\"ID\":\"ROOT\",\"CODE\":1001,\"CZAS\":\"" + zegar.SformatowanyCzas + "\"}";
  473.             jmsg.czasHM = "{\"ID\":\"ROOT\",\"CODE\":1002,\"CZAS\":\"" + zegar.SformatowanyCzasHM + "\"}";
  474.             jmsg.data   = "{\"ID\":\"ROOT\",\"CODE\":1011,\"DATA\":\"" + zegar.SformatowanaData + "\"}";
  475.             jmsg.dataPL = "{\"ID\":\"ROOT\",\"CODE\":1012,\"DATA\":\"" + zegar.SformatowanaDataPL + "\"}";
  476.        
  477.             #if CORE0_TASK1            
  478.                 PrintLine(60);
  479.                 PrintMSG("CORE0_TASK1", "NTP Time", zegar.SformatowanyCzas.c_str());          
  480.                 PrintMSG("CORE0_TASK1", "NTP Date", zegar.SformatowanaData.c_str());
  481.                 Serial.printf("\n[CORE0_TASK1] [RTC Time] ");  
  482.                 Serial.print(rtc.getTime());
  483.                 Serial.printf("\n[CORE0_TASK1] [RTC Date] ");  
  484.                 Serial.print(rtc.getDate());
  485.                 Serial.printf("\n[CORE0_TASK1] [FREE RAM] ");
  486.                 Serial.print(ESP.getFreeHeap());
  487.                 PrintLine(60);
  488.                 PrintEND();      
  489.             #endif
  490.                
  491.             F_Zegar = true;   // dane OK, flaga na true
  492.         }
  493.         else F_Zegar = false; // dane złe, flaga na false
  494.        
  495.         vTaskDelay(60000 / portTICK_PERIOD_MS);                 // wykonuj 1 minutę
  496.     }                                                            
  497. }      
  498. //
  499. // ------------------------------------------------------------------------------------------------------------ //
  500. // ---        CORE0 TASK2     POBIERANIE ASTRONOMII                                                         --- //
  501. // ------------------------------------------------------------------------------------------------------------ //
  502. //
  503. void Core0_Task2( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  504. {                                                                 // początek                          
  505.     for(;;)                                                       // nieskończona pętla                
  506.     {                                                             // początek FOR                      
  507.         delay(3600000);                                           // sprawdzaj co 1 godzinę
  508.     }                                                            
  509. }  
  510. //
  511. // ------------------------------------------------------------------------------------------------------------ //
  512. // ---        CORE1 TASK1    
  513. // ------------------------------------------------------------------------------------------------------------ //
  514.  
  515. void Core1_Task1( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  516. {                                                                 // początek                          
  517.     for(;;)                                                       // nieskończona pętla                
  518.     {                                                             // początek FOR                      
  519.         #if SERIAL
  520.             PrintLine(60);
  521.             PrintMSG("ESP32","CORE", "Wykonuje watek Task1 na CORE-1");
  522.         #endif      
  523.        
  524.         delay(1800000);                                           // wykonuj co 30 minut                
  525.     }                                                            
  526. }      
  527.  
  528. // ------------------------------------------------------------------------------------------------------------ //
  529. // ---        CORE1 TASK2    
  530. // ------------------------------------------------------------------------------------------------------------ //
  531.  
  532. void Core1_Task2( void * pvParameters )                           // Rdzeń 0 Zadanie 1                  
  533. {                                                                 // początek                          
  534.     for(;;)                                                       // nieskończona pętla                
  535.     {                                                             // początek FOR                      
  536.         #if SERIAL
  537.             PrintLine(60);
  538.             PrintMSG("ESP32","CORE", "Wykonuje watek Task2 na CORE-1");
  539.         #endif      
  540.  
  541.         mesh.sendBroadcast( root.c_str() );                      // roześlij Broadcast co wszystkich w sieci MESH        
  542.         delay(900000);                                           // wykonuj co 15 minut
  543.     }                                                            
  544. }      
  545.      
  546. // ------------------------------------------------------------------------------------------------------------ //
  547. // --- p o b i e r z   a d r e s   I P  ----------------------------------------------------------------------- //
  548. // ------------------------------------------------------------------------------------------------------------ //
  549.  
  550. IPAddress getlocalIP()
  551. {
  552.     return IPAddress(mesh.getStationIP());
  553. }
  554.  
  555. // ------------------------------------------------------------------------------------------------------------ //
  556. // --- Aktualizacja Pogody z Serwera  ------------------------------------------------------------------------- //
  557. // ------------------------------------------------------------------------------------------------------------ //
  558. //
  559. String httpGETRequest(const char* serverName)                                                        
  560. {                                                                                                    
  561.     HTTPClient http;                                                                                  
  562.     http.begin(serverName);                                                                          
  563.     int httpResponseCode = http.GET();                                                                
  564.     String bufor = "{}";                                                                              
  565.                                                                                                      
  566.     if ( httpResponseCode > 0 )                                                                      
  567.     {                                                                                                
  568.         #if SERIAL
  569.             //Serial.print("\nHTTP Response code: ");                                                  
  570.             //Serial.print(httpResponseCode);                                                      
  571.         #endif          
  572.                                                                                      
  573.         bufor = http.getString();                                                                    
  574.     }                                                                                                
  575.     else                                                                                              
  576.     {                                                                                                
  577.         #if SERIAL                                                                                  
  578.             //Serial.print("Error code: ");                                                          
  579.             //Serial.println(httpResponseCode);                                                      
  580.         #endif                                                                                        
  581.     }                                                                                                
  582.     http.end();                                                                            
  583.     return bufor;                                                                                    
  584. }
  585. //
  586. // ------------------------------------------------------------------------------------------------------------ //
  587. // ---        A K T U A L I Z A C J A   P O G O D Y                                                         --- //    
  588. // ------------------------------------------------------------------------------------------------------------ //
  589. //
  590. void PogodaAktualizuj()
  591. {
  592.     PrintLine(60);
  593.     PrintMSG("ESP32","MyTask", "Aktualizję pogodę z serwera : api.weatherapi.com");
  594.    
  595.     String path = "http://api.weatherapi.com/v1/current.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  596.     String jsonBuffer = httpGETRequest(path.c_str());    
  597.        
  598.     JSON_Weather = JSON.parse(jsonBuffer);                    
  599.  
  600.     if (JSON.typeof(JSON_Weather) == "undefined")                                                
  601.     {                                                                                        
  602.         PrintLine(60);
  603.         PrintMSG("DarkNet", "POGODA PARSER", "BŁĄD, BRAK DANYCH" );                                                                  
  604.     }      
  605.  
  606.     pogoda.miejscowosc                =   JSON_Weather["location"]["name"];
  607.     pogoda.kraj                       =   JSON_Weather["location"]["country"];
  608.     pogoda.szerokosc_geograficzna     =   JSON_Weather["location"]["lat"];
  609.     pogoda.dlugosc_geograficzna       =   JSON_Weather["location"]["lon"];
  610.     pogoda.id                         =   JSON_Weather["location"]["tz_id"];
  611.     pogoda.czas_epoch                 =   JSON_Weather["location"]["localtime_epoch"];
  612.     pogoda.czas_lokalny               =   JSON_Weather["location"]["localtime"];
  613.     pogoda.ostatnia_aktualizacja      =   JSON_Weather["current"]["last_updated"];
  614.     pogoda.temperatura_C              =   JSON_Weather["current"]["temp_c"];
  615.     pogoda.temperatura_C_odczuwalna   =   JSON_Weather["current"]["feelslike_c"];
  616.     pogoda.kondycja                   =   JSON_Weather["current"]["condition"]["text"];
  617.     pogoda.predkosc_wiatru_kph        =   JSON_Weather["current"]["wind_kph"];
  618.     pogoda.kierunek_wiatru_stopnie    =   JSON_Weather["current"]["wind_degree"];
  619.     pogoda.kierunek_wiatru_kompas     =   JSON_Weather["current"]["wind_dir"];
  620.     pogoda.podmuchy_wiatru            =   JSON_Weather["current"]["gust_kph"];
  621.     pogoda.cisnienie                  =   JSON_Weather["current"]["pressure_mb"];
  622.     pogoda.opady                      =   JSON_Weather["current"]["precip_mm"];
  623.     pogoda.wilgotnosc                 =   JSON_Weather["current"]["humidity"];
  624.     pogoda.zachmurzenie               =   JSON_Weather["current"]["cloud"];
  625.     pogoda.widzialnosc                =   JSON_Weather["current"]["vis_km"];
  626.     pogoda.index_uv                   =   JSON_Weather["current"]["uv"];
  627.  
  628.     if(pogoda.miejscowosc == "Lubin")
  629.     {
  630.         PrintLine(60);
  631.         Serial.printf("\n[DarkNet] [Pogoda] Miejscowość \t\t: ");
  632.         Serial.print(pogoda.miejscowosc);
  633.         Serial.printf("\n[DarkNet] [Pogoda] Kraj \t\t: ");
  634.         Serial.print(pogoda.kraj);
  635.         Serial.printf("\n[DarkNet] [Pogoda] Szer.Geograficzna \t: %2.2f",pogoda.szerokosc_geograficzna);
  636.         Serial.printf("\n[DarkNet] [Pogoda] Dług.Geograficzna \t: %2.2f",pogoda.dlugosc_geograficzna);            
  637.         Serial.printf("\n[DarkNet] [Pogoda] Czas Epoch \t\t: %u",pogoda.czas_epoch );            
  638.         Serial.printf("\n[DarkNet] [Pogoda] Serwer ID \t\t: ");
  639.         Serial.print( pogoda.id );    
  640.         Serial.printf("\n[DarkNet] [Pogoda] Czas Epoch \t\t: %u",pogoda.czas_epoch );            
  641.         Serial.printf("\n[DarkNet] [Pogoda] Czas Lokalny \t: ");      
  642.         Serial.print( pogoda.czas_lokalny );        
  643.         Serial.printf("\n[DarkNet] [Pogoda] Aktualizacja \t: ");      
  644.         Serial.print( pogoda.ostatnia_aktualizacja );      
  645.         Serial.printf("\n[DarkNet] [Pogoda] Temperatura \t\t: %2.2f",pogoda.temperatura_C);
  646.         Serial.printf("\n[DarkNet] [Pogoda] Temp.Odczuwalna \t: %2.2f",pogoda.temperatura_C_odczuwalna);  
  647.         Serial.printf("\n[DarkNet] [Pogoda] Opis pogody \t\t: ");
  648.         Serial.print(pogoda.kondycja);  
  649.         Serial.printf("\n[DarkNet] [Pogoda] Predkosc wiatru \t: %2.2f",pogoda.predkosc_wiatru_kph);
  650.         Serial.printf("\n[DarkNet] [Pogoda] Podmuchy wiatru \t: %2.2f",pogoda.podmuchy_wiatru);  
  651.         Serial.printf("\n[DarkNet] [Pogoda] Kierunek wiatru \t: %2.2f",pogoda.kierunek_wiatru_stopnie);  
  652.         Serial.printf("\n[DarkNet] [Pogoda] Kierunek wiatru \t: ");
  653.         Serial.print(pogoda.kierunek_wiatru_kompas);  
  654.         Serial.printf("\n[DarkNet] [Pogoda] Cisnienie \t\t: %d",pogoda.cisnienie);  
  655.         Serial.printf("\n[DarkNet] [Pogoda] Opady deszczu \t: %2.2f",pogoda.opady);  
  656.         Serial.printf("\n[DarkNet] [Pogoda] Wilgotnosc \t\t: %d",pogoda.wilgotnosc);  
  657.         Serial.printf("\n[DarkNet] [Pogoda] Zachmurzenie \t: %d",pogoda.zachmurzenie);  
  658.         Serial.printf("\n[DarkNet] [Pogoda] Widzialnosc \t\t: %d",pogoda.widzialnosc);  
  659.         Serial.printf("\n[DarkNet] [Pogoda] Index UV \t\t: %d",pogoda.index_uv);  
  660.              
  661.         PrintLine(60);
  662.         PrintEND();      
  663.        
  664.         F_Pogoda = true;      // dane OK, ustaw flagę na true
  665.     }
  666.     else  F_Pogoda = false;   // dane ZŁE, ustaw flagę na false
  667.  
  668. }
  669. //
  670. // ------------------------------------------------------------------------------------------------------------ //
  671. // ---        A K T U A L I Z A C J A   A S T R O N O M I I                                                 --- //    
  672. // ------------------------------------------------------------------------------------------------------------ //
  673. //
  674. void AstronomiaAktualizuj()
  675. {
  676.     PrintLine(60);
  677.     PrintMSG("ESP32","MyTask", "Aktualizję astronomię z serwera : api.weatherapi.com");    
  678.  
  679.     // pobierz dane astronomiczne z serwera dla miasta LUBIN
  680.        
  681.     String path = "http://api.weatherapi.com/v1/astronomy.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  682.     String jsonBuffer = httpGETRequest(path.c_str());    
  683.        
  684.     JSON_Astronomy = JSON.parse(jsonBuffer);                
  685.  
  686.     if (JSON.typeof(JSON_Astronomy) == "undefined")                                                
  687.     {                                                                                        
  688.         PrintLine(60);
  689.         PrintMSG("DarkNet", "ASTRONOMIA PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  690.     }      
  691.      
  692.     astronomia.miejscowosc              =   JSON_Astronomy["location"]["name"];
  693.     astronomia.kraj                     =   JSON_Astronomy["location"]["country"];
  694.     astronomia.szerokosc_geograficzna   =   JSON_Astronomy["location"]["lat"];
  695.     astronomia.dlugosc_geograficzna     =   JSON_Astronomy["location"]["lon"];        
  696.     astronomia.czas_epoch               =   JSON_Astronomy["location"]["localtime_epoch"];        
  697.     astronomia.czas_lokalny             =   JSON_Astronomy["location"]["localtime"];
  698.     astronomia.wschod_slonca            =   JSON_Astronomy["astronomy"]["astro"]["sunrise"];
  699.     astronomia.zachod_slonca            =   JSON_Astronomy["astronomy"]["astro"]["sunset"];
  700.     astronomia.wschod_ksiezyca          =   JSON_Astronomy["astronomy"]["astro"]["moonrise"];            
  701.     astronomia.zachod_ksiezyca          =   JSON_Astronomy["astronomy"]["astro"]["moonset"];
  702.     astronomia.faza_ksiezyca            =   JSON_Astronomy["astronomy"]["astro"]["moon_phase"];
  703.     astronomia.oswietlenie_ksiezyca     =   JSON_Astronomy["astronomy"]["astro"]["moon_illumination"];      
  704.  
  705.     if(astronomia.miejscowosc == "Lubin")
  706.     {
  707.        PrintLine(60);
  708.        Serial.printf("\n[DarkNet] [Astronomia] Miejscowość \t\t: ");
  709.        Serial.print(astronomia.miejscowosc);
  710.        Serial.printf("\n[DarkNet] [Astronomia] Kraj \t\t\t: ");
  711.        Serial.print(astronomia.kraj);
  712.        Serial.printf("\n[DarkNet] [Astronomia] Szer.Geograficzna \t: %2.2f",astronomia.szerokosc_geograficzna);
  713.        Serial.printf("\n[DarkNet] [Astronomia] Dług.Geograficzna \t: %2.2f",astronomia.dlugosc_geograficzna);            
  714.        Serial.printf("\n[DarkNet] [Astronomia] Czas Epoch \t\t: %u",astronomia.czas_epoch );            
  715.        Serial.printf("\n[DarkNet] [Astronomia] Czas Lokalny \t\t: ");
  716.        Serial.print( astronomia.czas_lokalny );            
  717.        Serial.printf("\n[DarkNet] [Astronomia] Wschód Słońca \t\t: ");
  718.        Serial.print(astronomia.wschod_slonca );
  719.        Serial.printf("\n[DarkNet] [Astronomia] Zachód Słońca \t\t: ");
  720.        Serial.print(astronomia.zachod_slonca );
  721.        Serial.printf("\n[DarkNet] [Astronomia] Wschód Księżyca \t\t: ");
  722.        Serial.print(astronomia.wschod_ksiezyca );
  723.        Serial.printf("\n[DarkNet] [Astronomia] Zachód Księżyca \t\t: ");
  724.        Serial.print(astronomia.zachod_ksiezyca );
  725.        Serial.printf("\n[DarkNet] [Astronomia] Faza Księżyca \t\t: ");
  726.        Serial.print(astronomia.faza_ksiezyca);
  727.        Serial.printf("\n[DarkNet] [Astronomia] Oświetlenie Księżyca \t: ");
  728.        Serial.print(astronomia.oswietlenie_ksiezyca );            
  729.        PrintLine(60);
  730.        PrintEND();
  731.        F_Astronomia = true;      // dane OK, ustaw flagę na true
  732.     }
  733.     else  F_Astronomia = false;   // dane ZŁE, ustaw flagę na false
  734. }
  735. //
  736. // ------------------------------------------------------------------------------------------------------------ //
  737. // ---        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                                   --- //    
  738. // ------------------------------------------------------------------------------------------------------------ //
  739. //
  740. void PowietrzeAktualizuj()
  741. {
  742.     PrintLine(60);
  743.     PrintMSG("ESP32","MyTask", "Aktualizję jakość powietrza z serwera : api.weatherapi.com");    
  744.  
  745.     // pobierz dane jakości powietrza z serwera dla miasta LUBIN
  746.        
  747.     String path = "http://api.weatherapi.com/v1/current.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  748.     String jsonBuffer = httpGETRequest(path.c_str());      
  749.        
  750.     JSON_Air = JSON.parse(jsonBuffer);                
  751.  
  752.     if (JSON.typeof(JSON_Air) == "undefined")                                                
  753.     {                                                                                        
  754.         PrintLine(60);
  755.         PrintMSG("DarkNet", "AIR PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  756.     }        
  757.  
  758.     powietrze.co     = JSON_Air["current"]["air_quality"]["co"];
  759.     powietrze.o3     = JSON_Air["current"]["air_quality"]["o3"];
  760.     powietrze.no2    = JSON_Air["current"]["air_quality"]["no2"];
  761.     powietrze.so2    = JSON_Air["current"]["air_quality"]["so2"];
  762.     powietrze.pm25   = JSON_Air["current"]["air_quality"]["pm2_5"];
  763.     powietrze.pm10   = JSON_Air["current"]["air_quality"]["pm10"];
  764.     powietrze.Defra  = JSON_Air["current"]["air_quality"]["gb-defra-index"];
  765.  
  766.     if (powietrze.co != 0)
  767.     {
  768.         PrintLine(60);
  769.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Tlenek węgla \t\t: %2.8f [μg/ m3]", powietrze.co);
  770.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Dwutlenek azotu \t\t: %2.8f [μg/ m3]", powietrze.no2);
  771.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Ozon \t\t\t: %2.8f [μg/m3]", powietrze.o3);
  772.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Pyły i aerozole PM2.5 \t: %2.8f [μm]", powietrze.pm25);
  773.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Pyły i aerozole PM10 \t: %2.8f [μm]", powietrze.pm10);
  774.         Serial.printf("\n[DarkNet] [Jakość Powietrza] Index jakości \t\t: %d IND", powietrze.Defra);
  775.         PrintLine(60);
  776.         PrintEND();
  777.    
  778.         F_Powietrze  = true;  
  779.     }
  780.     else F_Powietrze  = false;
  781. }
  782. //
  783. // ------------------------------------------------------------------------------------------------------------ //
  784. // ---        A K T U A L I Z A C J A   P R O G N O Z Ę                                                     --- //    
  785. // ------------------------------------------------------------------------------------------------------------ //
  786. //
  787. void PrognozaAktualizuj()
  788. {
  789.     PrintLine(60);
  790.     PrintMSG("ESP32","MyTask", "Aktualizję prognozę z serwera : api.weatherapi.com");    
  791.  
  792.     // pobierz dane astronomiczne z serwera dla miasta LUBIN
  793.        
  794.     String path = "http://api.weatherapi.com/v1/forecast.json?key=TwojToken&q=TwojeMiasto&lang=pl";
  795.     String jsonBuffer = httpGETRequest(path.c_str());    
  796.        
  797.     JSON_Forecast = JSON.parse(jsonBuffer);                
  798.  
  799.     if (JSON.typeof(JSON_Forecast) == "undefined")                                                
  800.     {                                                                                        
  801.         PrintLine(60);
  802.         PrintMSG("DarkNet", "AIR PARSER", "BŁĄD, BRAK DANYCH" );                                                                              
  803.     }        
  804. }
  805. //
  806. // ------------------------------------------------------------------------------------------------------------ //
  807. // --- MyTask ------------------------------------------------------------------------------------------------- //
  808. // ------------------------------------------------------------------------------------------------------------ //
  809. //
  810. void MyTask()
  811. {
  812.     timeZERO = millis();                                    // zapisz czas 0
  813.     task01m = timeZERO - timeout_task01m;                   // wyznacz nowy
  814.     task05m = timeZERO - timeout_task05m;                   // wyznacz nowy
  815.     task10m = timeZERO - timeout_task10m;                   // wyznacz nowy
  816.     task15m = timeZERO - timeout_task15m;                   // wyznacz nowy
  817.  
  818.     // --- ZADANIE co 1 minutę ------------------------------------------------------------------------------- //
  819.  
  820.     if(task01m >= 60000UL)                                  // wykonuj co 1 minutę
  821.     {
  822.         if (!F_Astronomia)  AstronomiaAktualizuj();         // jeśli BRAK DANYCH wykonuj co minutę
  823.         if (!F_Pogoda)      PogodaAktualizuj();             // jeśli BRAK DANYCH wykonuj co minutę
  824.         if (!F_Powietrze)   PowietrzeAktualizuj();          // jeśli BRAK DANYCH wykonuj co minutę
  825.         //if (!F_Prognoza)    PrognozaAktualizuj();           // jeśli BRAK DANYCH wykonuj co minutę
  826.        
  827.         timeout_task01m = timeZERO;  
  828.     }
  829.  
  830.     // --- ZADANIE co 5 minut -------------------------------------------------------------------------------- //
  831.  
  832.     if(task05m >= 300000UL)                                 // wykonuj co 5 minut
  833.     {
  834.         timeout_task05m = timeZERO;  
  835.     }
  836.  
  837.     // --- ZADANIE co 10 minut ------------------------------------------------------------------------------- //
  838.  
  839.     if(task10m >= 600000UL)                                 // wykonuj co 10 minut
  840.     {
  841.         timeout_task10m = timeZERO;    
  842.     }
  843.  
  844.     // --- ZADANIE co 15 minut ------------------------------------------------------------------------------- //
  845.  
  846.     if(task15m >= 900000UL)                                 // wykonuj co 15 minut
  847.     {
  848.         if (F_Astronomia)  AstronomiaAktualizuj();          // jeśli DANE OK co 15 minut
  849.         if (F_Pogoda)      PogodaAktualizuj();              // jeśli DANE OK co 15 minut
  850.         if (F_Powietrze)   PowietrzeAktualizuj();           // jeśli DANE OK co 15 minut
  851.         //if (F_Prognoza)    PrognozaAktualizuj();            // jeśli BRAK DANYCH wykonuj co minutę
  852.        
  853.         timeout_task15m = timeZERO;  
  854.     }
  855.  
  856. }                                                                              
  857. // ------------------------------------------------------------------------------------------------------------ //
  858. // --- S E T U P ---------------------------------------------------------------------------------------------- //
  859. // ------------------------------------------------------------------------------------------------------------ //
  860. //
  861. void setup()
  862. {
  863.    #if SERIAL
  864.         Serial.begin(SPEED);                // ustaw prędkość terminala SERIAL
  865.     #endif
  866.          
  867.     mesh.setDebugMsgTypes( ERROR | STARTUP | CONNECTION );  // ustaw przed init (), abyś mógł zobaczyć komunikaty startowe
  868.  
  869.     mesh.init( MESH_PREFIX, MESH_PASSWORD, MESH_PORT, WIFI_AP_STA, 6 );
  870.     mesh.onReceive(&receivedCallback);
  871.     mesh.stationManual(STATION_SSID, STATION_PASSWORD);
  872.     mesh.setHostname(HOSTNAME);
  873.  
  874.     mesh.setRoot(true);                           // sieć MESH na tym urządzeniu jako ROOT  
  875.     mesh.setContainsRoot(true);                   // sieć MESH na tym urządzeniu jako ROOT
  876.  
  877.     timeClient.begin();                           // włącz klienta NTP (pobieranie czasu z internetu)
  878.  
  879.     // --- CPU_Core_0 ----------------------------------------------------------------------------------
  880.                                                                                                        
  881.     xTaskCreatePinnedToCore(Core0_Task1, "CPU_Core_0", 5000, NULL, 1, &CPU_Core_0, 0);                
  882.     vTaskDelay(500 / portTICK_PERIOD_MS);                                                              
  883.                                                                                                        
  884.     xTaskCreatePinnedToCore(Core0_Task2, "CPU_Core_0", 5000, NULL, 1, &CPU_Core_0, 0);                
  885.     vTaskDelay(500 / portTICK_PERIOD_MS);  
  886.    
  887.     // --- CPU_Core_1 ----------------------------------------------------------------------------------
  888.                                                                                                          
  889.     xTaskCreatePinnedToCore(Core1_Task1, "CPU_Core_1", 5000, NULL, 1, &CPU_Core_1, 1);                
  890.     vTaskDelay(500 / portTICK_PERIOD_MS);                                                                
  891.                                                                                                          
  892.     xTaskCreatePinnedToCore(Core1_Task2, "CPU_Core_1", 5000, NULL, 1, &CPU_Core_1, 1);                
  893.     vTaskDelay(500 / portTICK_PERIOD_MS);
  894. }
  895.  
  896. // ------------------------------------------------------------------------------------------------------------ //
  897. // --- L O O P ------------------------------------------------------------------------------------------------ //
  898. // ------------------------------------------------------------------------------------------------------------ //
  899. //
  900. void loop()
  901. {
  902.     mesh.update();                                                                // aktulizuj MESH
  903.     mqttClient.loop();                                                            // pętla dla klienta mqtt
  904.  
  905.     if(myIP != getlocalIP())                                                      // jeśli moje IP różne od lokalnego IP
  906.     {                                                                          
  907.         myIP = getlocalIP();                                                      // zapisz lokalne IP
  908.  
  909.         #if SERIAL
  910.             Serial.println("Adres lokalny IP: " + myIP.toString());
  911.         #endif
  912.  
  913.         if (mqttClient.connect("painlessMeshClient"))                             // jeśli client
  914.         {
  915.             mqttClient.publish("painlessMesh/from/gateway","Gotowe!");
  916.             mqttClient.subscribe("painlessMesh/to/#");
  917.         }
  918.     }        
  919.  
  920.     MyTask();                                                                     // sprawdź moje zadania do wykonania                                                              
  921. }
  922. //
  923. // ------------------------------------------------------------------------------------------------------------ //
  924. // --- E N D  ------------------------------------------------------------------------------------------------- //
  925. // ------------------------------------------------------------------------------------------------------------ //
  926.  
Add Comment
Please, Sign In to add comment