PowerTGS440

ESP32_mesh_bridge

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