PowerTGS440

simpleESP8266ClockLQ v1.0

May 30th, 2021 (edited)
403
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 48.35 KB | None | 0 0
  1. // ------------------------------------------------------------------------------------------------------------------- //
  2. // Simple ESP8266 CLOCK by TOMASZ MAJCHER (TRANSLINE GROUP POLSKA)                                                     //
  3. // e-mail  : [email protected]                                                                                     //
  4. // licence : DonationWare --> paypal.me/TomaszMajcher                                                                  //
  5. // blog    : https://esp32dev.blogspot.com/                                                                            //
  6. // ------------------------------------------------------------------------------------------------------------------- //
  7. //
  8. // v1.0 (30.05.2021) - update : FINAL FREE VERSION
  9. // v0.9 (30.05.2021) - update : dodano formatowanie LongDate do długości 20 znaków
  10. // v0.8 (30.05.2021) - update : switch ShortData / LongData
  11. // v0.7 (30.05.2021) - update : formatowanie dat LONG / SHORT
  12. // v0.6 (29.05.2021) - update : DNI TYGODNIA / NAZWY MIESIĘCY
  13. // v0.5 (28.05.2021) - update : aktualizacja daty (Task0) co 1 godzinę
  14. // v0.4 (28.05.2021) - update : aktualizacja czasu (Task1) co 1 minutę
  15. // v0.3 (27.05.2021) - FULL BETA :-)
  16. // v0.2 (26.05.2021) - budowa klasy LCD
  17. // v0.1 (26.05.2021) - budowa projektu
  18. //
  19. // ------------------------------------------------------------------------------------------------------------------- //
  20. //
  21. // GND   <---> GND
  22. // VCC   <---> Vin
  23. // SDA   <---> D2 (NodeMCU) GPIO 4
  24. // SCL   <---> D1 (NodeMCU) GPIO 5
  25. //
  26. // ------------------------------------------------------------------------------------------------------------------- //
  27.  
  28. extern "C" char* sbrk(int incr);
  29.  
  30. #include "LiquidCrystal_I2C.h"         // https://circuits4you.com/wp-content/uploads/2019/03/I2C-LCD-ESP8266-Library.zip
  31.  
  32. #include <ESP8266WiFi.h>                                         // biblioteka Wi-Fi
  33. #include <NTPClient.h>                                           // NTP klient (czas)
  34. #include <WiFiUdp.h>                                             // UDP dla NTP (czas)
  35. #include <TaskScheduler.h>                                       // scheluder
  36. #include <TimeLib.h>    
  37. #include <Arduino.h>
  38.  
  39. LiquidCrystal_I2C lcd(0x27,20,4);  
  40.  
  41. const char *ssid     = "xxxxxxxxxxx";                                  // network wifi ssid  
  42. const char *password = "xxxxxxxxxxx";                                  // network wifi password
  43.  
  44. #define SERIAL true
  45. #define SerialSpeed 57600
  46.  
  47. #define   ARRAY_SIZE(a)   (sizeof(a) / sizeof((a)[0]))
  48.  
  49. // ------------------------------------------------------------------------------------------------------------------- //
  50. // --- P R O T O T Y P Y --------------------------------------------------------------------------------------------- //
  51. // ------------------------------------------------------------------------------------------------------------------- //
  52.  
  53. void Task0Callback();                                                     // funkcja dla task_0    
  54. void Task1Callback();                                                     // funkcja dla task_1    
  55. void Task2Callback();                                                     // funkcja dla task_2    
  56.  
  57. // ------------------------------------------------------------------------------------------------------------------- //
  58. // --- Z A D A N I A   S C H E L U D E R ' A ------------------------------------------------------------------------- //
  59. // ------------------------------------------------------------------------------------------------------------------- //
  60.                                                                                                    
  61. Task task_0( 3600000, TASK_FOREVER, &Task0Callback);                      // task_0 - co 1 godzinę  
  62. Task task_1(  60000,  TASK_FOREVER, &Task1Callback);                      // task_2 - co 1 minutę  
  63. Task task_2(   1000,  TASK_FOREVER, &Task2Callback);                      // task_3 - co 1 sekundę  
  64.                                                                                                    
  65. Scheduler runner;                                                                                  
  66.  
  67. // ------------------------------------------------------------------------------------------------------------------- //
  68. //                                              *** STRUKTURA CZAS ***                                                 //
  69. // ------------------------------------------------------------------------------------------------------------------- //
  70.  
  71. struct ZEGAR
  72. {
  73.     int Godzina = 0;
  74.     int Minuta  = 0;
  75.     int Sekunda = 0;
  76.     String SformatowanaData  = "NULL";
  77.     String ShortData = "NULL";
  78.     String LongData = "NULL";
  79.     int DzienTygodnia = 0;
  80.     int DzienMiesiaca = 0;
  81.     int Miesiac = 0;
  82.     int Rok = 0;
  83. }
  84. czas;
  85.  
  86. // ------------------------------------------------------------------------------------------------------------------- //
  87. //                                              *** STRUKTURA DZIEN ***                                                //
  88. // ------------------------------------------------------------------------------------------------------------------- //
  89.  
  90. const char Dzien_0 [] = "Niedziela";
  91. const char Dzien_1 [] = "Poniedzialek";
  92. const char Dzien_2 [] = "Wtorek";
  93. const char Dzien_3 [] = "Sroda";
  94. const char Dzien_4 [] = "Czwartek";
  95. const char Dzien_5 [] = "Piatek";
  96. const char Dzien_6 [] = "Sobota";
  97.  
  98. const char * const DZIEN[] = { Dzien_0, Dzien_1, Dzien_2, Dzien_3, Dzien_4, Dzien_5, Dzien_6 }; // dni tygodnia [0..6]
  99.  
  100. // ------------------------------------------------------------------------------------------------------------------- //
  101. //                                              *** STRUKTURA MIESIAC ***                                              //
  102. // ------------------------------------------------------------------------------------------------------------------- //
  103.  
  104. const char Miesiac_0  [] = "NULL";
  105. const char Miesiac_1  [] = "Styczen";
  106. const char Miesiac_2  [] = "Luty";
  107. const char Miesiac_3  [] = "Marzec";
  108. const char Miesiac_4  [] = "Kwiecien";
  109. const char Miesiac_5  [] = "Maj";
  110. const char Miesiac_6  [] = "Czerwiec";
  111. const char Miesiac_7  [] = "Lipiec";
  112. const char Miesiac_8  [] = "Sierpien";
  113. const char Miesiac_9  [] = "Wrzesien";
  114. const char Miesiac_10 [] = "Pazdziernik";
  115. const char Miesiac_11 [] = "Listopad";
  116. const char Miesiac_12 [] = "Grudzien";
  117.  
  118. const char * const MIESIAC[] = { Miesiac_0, Miesiac_1, Miesiac_2, Miesiac_3, Miesiac_4, Miesiac_5, Miesiac_6,
  119.                                  Miesiac_7, Miesiac_8, Miesiac_9, Miesiac_10, Miesiac_11, Miesiac_12 };
  120.  
  121. // ------------------------------------------------------------------------------------------------------------------- //
  122. //                            *** KLASA LCD *** by Tomasz Majcher (TLG) v1.00 Lite ***                                 //
  123. // ------------------------------------------------------------------------------------------------------------------- //
  124.  
  125. class LCD
  126. {
  127.     private :
  128.  
  129.         // --- ZMIENNE PRYWATNE -------------------------------------------------------------------------------------- //
  130.  
  131.         byte LGc[8]  = { B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111 };         // lewy górny ----- //
  132.         byte LDc[8]  = { B11111, B11111, B11111, B11111, B11111, B11111, B01111, B00111 };         // lewy dolny ----- //
  133.         byte PGc[8]  = { B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111 };         // prawy górny ---- //
  134.         byte PDc[8]  = { B11111, B11111, B11111, B11111, B11111, B11111, B11110, B11100 };         // prawy dolny ---- //
  135.         byte UDb[8]  = { B11111, B11111, B11111, B11111, B11111, B00000, B00000, B00000 };         // górny 1/2 ------ //
  136.         byte DDb[8]  = { B00000, B00000, B00000, B11111, B11111, B11111, B11111, B11111 };         // dolny 1/2 ------ //
  137.         byte blk[8]  = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111 };         // blok pełny ----- //
  138.         byte emp[8]  = { B00000, B00000, B00000, B00000, B00000, B00000, B00000, B00000 };         // blok pusty ----- //
  139.  
  140.         // --- ZMIENNE PRYWATNE -------------------------------------------------------------------------------------- //
  141.  
  142.         LiquidCrystal_I2C & wyswietlacz;
  143.  
  144.         void Kropka(int x, int y);
  145.         void Dwukropek(int x, int y);
  146.         void Liczba0(int x, int y);
  147.         void Liczba1(int x, int y);
  148.         void Liczba2(int x, int y);
  149.         void Liczba3(int x, int y);
  150.         void Liczba4(int x, int y);
  151.         void Liczba5(int x, int y);
  152.         void Liczba6(int x, int y);
  153.         void Liczba7(int x, int y);
  154.         void Liczba8(int x, int y);
  155.         void Liczba9(int x, int y);
  156.         void WyswietlCyfre(int x, int y, int numer);
  157.         void WyczyscLinie(int y);        
  158.  
  159.         // ---------------------------------------------------------------------------------------- //  
  160.         // --- METODY PRYWATNE -------------------------------------------------------------------- //
  161.         // ---------------------------------------------------------------------------------------- //
  162.  
  163.        
  164.         // ---------------------------------------------------------------------------------------- //
  165.        
  166.     public  :
  167.  
  168.         // ---------------------------------------------------------------------------------------- //
  169.         // --- KONSTRUKTOR KLACY LCD -------------------------------------------------------------- //
  170.         // ---------------------------------------------------------------------------------------- //
  171.        
  172.         LCD (LiquidCrystal_I2C &adres_lc) : wyswietlacz(adres_lc)
  173.         {
  174.             LcdRegister();  
  175.         }
  176.        
  177.         // ---------------------------------------------------------------------------------------- //
  178.         //  --- METODY PUBLICZNE KLASY LCD -------------------------------------------------------- //
  179.         // ---------------------------------------------------------------------------------------- //
  180.  
  181.         void WyswietlCzas();  // wyswietl zegar  
  182.         void WyswietlDate();  // wyswietl datę
  183.         void LcdRegister();   // zarejestruj nowy zestaw znaków specjalnych  
  184.        
  185. };
  186.  
  187. // ------------------------------------------------------------------------------------------------------------------- //
  188. //          *** METODY PRYWATNE *** WYCZYSC LINIE X***                                                                 //
  189. // ------------------------------------------------------------------------------------------------------------------- //
  190.  
  191. void LCD :: WyczyscLinie(int y)
  192. {
  193.     wyswietlacz.setCursor(0,y);
  194.     wyswietlacz.print(F("                    "));            
  195. }
  196.  
  197. // ------------------------------------------------------------------------------------------------------------------- //
  198. //          *** METODY PRYWATNE *** ZAREJESTRUJ NOWY ZESTAW ZNAKÓW SPECJALNYCH DLA WYŚWIETLACZA 20x4 ***               //
  199. // ------------------------------------------------------------------------------------------------------------------- //
  200.  
  201. void LCD :: LcdRegister()                                                                                        
  202. {                                                                                                                
  203.           wyswietlacz.createChar(0,LGc);                                   // 0 -> lewy górny narożnik ------------ //
  204.           wyswietlacz.createChar(1,LDc);                                   // 1 -> lewy dolny narożnik ------------ //
  205.           wyswietlacz.createChar(2,PGc);                                   // 2 -> prawy górny narożnik ----------- //
  206.           wyswietlacz.createChar(3,PDc);                                   // 3 -> prawy dolny narożnik ----------- //
  207.           wyswietlacz.createChar(4,UDb);                                   // 4 -> górny pół-blok ----------------- //
  208.           wyswietlacz.createChar(5,DDb);                                   // 5 -> dolny pół-blok ----------------- //
  209.           wyswietlacz.createChar(6,blk);                                   // 6 -> pełny blok --------------------- //
  210. }
  211.  
  212. // ------------------------------------------------------------------------------------------------------------------- //
  213. // --- Duża liczba 0 ------------------------------------------------------------------------------------------------- //
  214. // ------------------------------------------------------------------------------------------------------------------- //
  215.  
  216. void LCD :: Liczba0(int x, int y)                                  
  217. {                                                                                                                  //          
  218.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ------------------------ //
  219.           wyswietlacz.write(0);                                           // lewy górny narożnk ------------------ //          
  220.           wyswietlacz.write(4);                                           // kropa górna ------------------------- //
  221.           wyswietlacz.write(2);                                           // prawy górny narożnik ---------------- //
  222.           wyswietlacz.setCursor(x,y+1);                                   // ustaw kursor ------------------------ //
  223.           wyswietlacz.write(6);                                           // pełny 5x8 --------------------------- //
  224.           wyswietlacz.print(F(" "));                                      // pusty blok -------------------------- //          
  225.           wyswietlacz.write(6);                                           // pełny 5x8 --------------------------- //
  226.           wyswietlacz.setCursor(x,y+2);                                   // ustaw kursor ------------------------ //
  227.           wyswietlacz.write(1);                                           // lewy dolny narożnik ----------------- //
  228.           wyswietlacz.write(5);                                           // kropa dolna ------------------------- //
  229.           wyswietlacz.write(3);                                           // prawy dolny narożnik ---------------- //
  230. }                                                                    
  231.  
  232. // ------------------------------------------------------------------------------------------------------------------- //
  233. // --- Duża liczba 1 ------------------------------------------------------------------------------------------------- //
  234. // ------------------------------------------------------------------------------------------------------------------- //
  235.  
  236. void LCD :: Liczba1(int x, int y)  
  237. {                                                                                                          
  238.           wyswietlacz.setCursor(x,y);                                      // ustaw kursor ----------------------- //
  239.           wyswietlacz.write(4);                                            // górna kropa ------------------------ //
  240.           wyswietlacz.write(2);                                            // prawy górny narożnik --------------- //          
  241.           wyswietlacz.print(F(" "));                                       // pusty blok ------------------------- //          
  242.           wyswietlacz.setCursor(x,y+1);                                    // ustaw kursor ----------------------- //
  243.           wyswietlacz.print(F(" "));                                       // pusty blok ------------------------- //                    
  244.           wyswietlacz.write(6);                                            // pełny 5x8 -------------------------- //          
  245.           wyswietlacz.print(F(" "));                                       // pusty blok ------------------------- //                    
  246.           wyswietlacz.setCursor(x,y+2);                                    // ustaw kursor ----------------------- //
  247.           wyswietlacz.write(5);                                            // kropa dolna ------------------------ //
  248.           wyswietlacz.write(6);                                            // pełny 5x8 -------------------------- //
  249.           wyswietlacz.write(5);                                            // kropa dolna ------------------------ //
  250. }    
  251.                                                                    
  252. // ------------------------------------------------------------------------------------------------------------------- //
  253. // --- Duża liczba 2 ------------------------------------------------------------------------------------------------- //
  254. // ------------------------------------------------------------------------------------------------------------------- //
  255.  
  256. void LCD :: Liczba2(int x, int y)                                                                    
  257. {                                                                                                                
  258.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  259.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  260.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  261.           wyswietlacz.write(2);                                           // prawy górny narożnik --------------- //          
  262.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  263.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  264.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  265.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //          
  266.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //
  267.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //  
  268.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  269.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  270. }                                                                      
  271.  
  272. // ------------------------------------------------------------------------------------------------------------------- //
  273. // --- Duża liczba 3 ------------------------------------------------------------------------------------------------- //
  274. // ------------------------------------------------------------------------------------------------------------------- //
  275.  
  276. void LCD :: Liczba3(int x, int y)                
  277. {                                                      
  278.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  279.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  280.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  281.           wyswietlacz.write(2);                                           // prawy górny narożnik --------------- //          
  282.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  283.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //          
  284.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  285.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //          
  286.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //          
  287.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  288.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  289.           wyswietlacz.write(3);                                           // prawy dolny narożnik --------------- //
  290. }                                              
  291.  
  292. // ------------------------------------------------------------------------------------------------------------------- //
  293. // --- Duża liczba 4 ------------------------------------------------------------------------------------------------- //
  294. // ------------------------------------------------------------------------------------------------------------------- //
  295.  
  296. void LCD :: Liczba4(int x, int y)    
  297. {                                                    
  298.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  299.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //          
  300.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //                    
  301.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //                    
  302.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  303.           wyswietlacz.write(1);                                           // lewy dolny narożnik ---------------- //          
  304.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  305.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //          
  306.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //          
  307.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //          
  308.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //          
  309.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //
  310. }                                                                                                              
  311.  
  312. // ------------------------------------------------------------------------------------------------------------------- //
  313. // --- Duża liczba 5 ------------------------------------------------------------------------------------------------- //
  314. // ------------------------------------------------------------------------------------------------------------------- //
  315.    
  316. void LCD :: Liczba5(int x, int y)                            
  317. {                                                                            
  318.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  319.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //  
  320.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  321.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //                    
  322.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  323.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //        
  324.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  325.           wyswietlacz.write(2);                                           // prawy górny narożnik --------------- //          
  326.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //          
  327.           wyswietlacz.write(1);                                           // lewy dolny narożnik ---------------- //
  328.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  329.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //
  330. }                                                                                                                
  331.  
  332. // ------------------------------------------------------------------------------------------------------------------- //
  333. // --- Duża liczba 6 ------------------------------------------------------------------------------------------------- //
  334. // ------------------------------------------------------------------------------------------------------------------- //
  335.    
  336. void LCD :: Liczba6(int x, int y)                                                                  
  337. {                                                                                                              
  338.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  339.           wyswietlacz.write(0);                                           // lewy górny narożnk ----------------- //          
  340.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  341.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //                    
  342.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  343.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //          
  344.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  345.           wyswietlacz.write(2);                                           // prawy górny narożnik --------------- //          
  346.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //          
  347.           wyswietlacz.write(1);                                           // lewy dolny narożnik ---------------- //
  348.           wyswietlacz.write(5);                                           // kropa dolna ------------------------ //
  349.           wyswietlacz.write(3);                                           // prawy dolny narożnik --------------- //
  350. }                                                                                                                  
  351.  
  352. // ------------------------------------------------------------------------------------------------------------------- //
  353. // --- Duża liczba 7 ------------------------------------------------------------------------------------------------- //
  354. // ------------------------------------------------------------------------------------------------------------------- //
  355.  
  356. void LCD :: Liczba7(int x, int y)      
  357. {                                                      
  358.           wyswietlacz.setCursor(x,y);                                     // ustaw kursor ----------------------- //
  359.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  360.           wyswietlacz.write(4);                                           // kropa górna ------------------------ //
  361.           wyswietlacz.write(2);                                           // prawy górny narożnik --------------- //                    
  362.           wyswietlacz.setCursor(x, y+1);                                  // ustaw kursor ----------------------- //
  363.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //                    
  364.           wyswietlacz.print(F(" "));                                      // pusty blok ------------------------- //          
  365.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //          
  366.           wyswietlacz.setCursor(x, y+2);                                  // ustaw kursor ----------------------- //          
  367.           wyswietlacz.print(F("  "));                                     // pusty blok ------------------------- //                    
  368.           wyswietlacz.write(6);                                           // pełny 5x8 -------------------------- //
  369. }                                                                                                      
  370.  
  371. // ------------------------------------------------------------------------------------------------------------------- //
  372. // --- Duża liczba 8 ------------------------------------------------------------------------------------------------- //
  373. // ------------------------------------------------------------------------------------------------------------------- //
  374.  
  375. void LCD :: Liczba8(int x, int y)  
  376. {                                                  
  377.           wyswietlacz.setCursor(x,y);                                      // ustaw kursor ----------------------- //
  378.           wyswietlacz.write(0);                                            // lewy górny narożnk ----------------- //          
  379.           wyswietlacz.write(4);                                            // kropa górna ------------------------ //
  380.           wyswietlacz.write(2);                                            // prawy górny narożnik --------------- //                    
  381.           wyswietlacz.setCursor(x, y+1);                                   // ustaw kursor ----------------------- //
  382.           wyswietlacz.write(6);                                            // pełny 5x8 -------------------------- //          
  383.           wyswietlacz.write(4);                                            // kropa górna ------------------------ //
  384.           wyswietlacz.write(6);                                            // pełny 5x8 -------------------------- //          
  385.           wyswietlacz.setCursor(x, y+2);                                   // ustaw kursor ----------------------- //          
  386.           wyswietlacz.write(1);                                            // lewy dolny narożnik ---------------- //
  387.           wyswietlacz.write(5);                                            // kropa dolna ------------------------ //
  388.           wyswietlacz.write(3);                                            // prawy dolny narożnik --------------- //
  389. }                                                                                                                
  390.  
  391. // ------------------------------------------------------------------------------------------------------------------- //
  392. // --- Duża liczba 9 ------------------------------------------------------------------------------------------------- //
  393. // ------------------------------------------------------------------------------------------------------------------- //
  394.  
  395. void LCD :: Liczba9(int x, int y)                                                        
  396. {                                                                                                        
  397.           wyswietlacz.setCursor(x,y);                                       // ustaw kursor ----------------------- //
  398.           wyswietlacz.write(0);                                             // lewy górny narożnk ----------------- //  
  399.           wyswietlacz.write(4);                                             // kropa górna ------------------------ //
  400.           wyswietlacz.write(2);                                             // prawy górny narożnik --------------- //                    
  401.           wyswietlacz.setCursor(x, y+1);                                    // ustaw kursor ----------------------- //
  402.           wyswietlacz.write(1);                                             // lewy dolny narożnik ---------------- //          
  403.           wyswietlacz.write(5);                                             // kropa dolna ------------------------ //
  404.           wyswietlacz.write(6);                                             // pełny 5x8 -------------------------- //          
  405.           wyswietlacz.setCursor(x, y+2);                                    // ustaw kursor ----------------------- //          
  406.           wyswietlacz.write(5);                                             // kropa dolna ------------------------ //
  407.           wyswietlacz.write(5);                                             // kropa dolna ------------------------ //
  408.           wyswietlacz.write(3);                                             // prawy dolny narożnik --------------- //
  409. }  
  410.                                                                                                                
  411. // ------------------------------------------------------------------------------------------------------------------- //
  412. // --- Duża liczba 9 ------------------------------------------------------------------------------------------------- //
  413. // ------------------------------------------------------------------------------------------------------------------- //
  414.  
  415. void LCD :: Dwukropek(int x, int y)          
  416. {                                                            
  417.           wyswietlacz.setCursor(x,y);                                       // ustaw kursor ----------------------- //
  418.           wyswietlacz.print(F(" "));                                        // pusty blok ------------------------- //          
  419.           wyswietlacz.setCursor(x,y+1);                                     // ustaw kursor ----------------------- //
  420.           wyswietlacz.write(4);                                             // kropa górna ------------------------ //
  421.           wyswietlacz.setCursor(x,y+2);                                     // ustaw kursor ----------------------- //
  422.           wyswietlacz.write(5);                                             // kropa dolna ------------------------ //
  423. }
  424.  
  425. // ------------------------------------------------------------------------------------------------------------------- //
  426. // --- KROPA --------------------------------------------------------------------------------------------------------- //
  427. // ------------------------------------------------------------------------------------------------------------------- //
  428.  
  429. void LCD :: Kropka(int x, int y)
  430. {                                              
  431.           wyswietlacz.setCursor(x,y);                                        // ustaw kursor ----------------------- //
  432.           wyswietlacz.print(F(" "));                                         // pusty blok ------------------------- //          
  433.           wyswietlacz.setCursor(x,y+1);                                      // ustaw kursor ----------------------- //
  434.           wyswietlacz.print(F(" "));                                         // pusty blok ------------------------- //          
  435.           wyswietlacz.setCursor(x,y+2);                                      // ustaw kursor ----------------------- //
  436.           wyswietlacz.print(F(" "));                                         // pusty blok ------------------------- //          
  437. }          
  438.  
  439. // ------------------------------------------------------------------------------------------------------------------- //
  440. // --- WYSWIETL CYFRE ------------------------------------------------------------------------------------------------ //
  441. // ------------------------------------------------------------------------------------------------------------------- //
  442.  
  443. void LCD :: WyswietlCyfre(int x, int y, int numer)
  444. {                                      
  445.     // --------------------------------------------------------------------------------------------------------- //
  446.                                                      // K O N T R O L A   B Ł Ę D U                              //
  447.     if(x > 17) x = 17;                               // jesli pozycja x większa niż 17, ustaw maksymalną ------- //
  448.     if(y >  1) y =  1;                               // jesli pozycja y wieksza niz 1 , ustaw maksymalna ------- //
  449.                                                                                                                  //
  450.     // --------------------------------------------------------------------------------------------------------- //
  451.              
  452.     switch (numer)                                                                                              
  453.     {                                                                                                          
  454.         case  0:  Liczba0(x,y); break;                                                                          
  455.         case  1:  Liczba1(x,y); break;                                                                          
  456.         case  2:  Liczba2(x,y); break;                                                                          
  457.         case  3:  Liczba3(x,y); break;                                                                          
  458.         case  4:  Liczba4(x,y); break;                                                                          
  459.         case  5:  Liczba5(x,y); break;                                                                          
  460.         case  6:  Liczba6(x,y); break;                                                                          
  461.         case  7:  Liczba7(x,y); break;                                                                          
  462.         case  8:  Liczba8(x,y); break;                                                                          
  463.         case  9:  Liczba9(x,y); break;                                                                          
  464.     }                                                                                                          
  465. }        
  466.  
  467. // ------------------------------------------------------------------------------------------------------------------- //
  468. //          *** METODY PUBLICZNE *** WYSWIETL CZAS ***                                                                 //
  469. // ------------------------------------------------------------------------------------------------------------------- //
  470.  
  471. void LCD :: WyswietlCzas()
  472. {
  473.     static bool F_sec = false;
  474.     static int  O_min = 0;              // optymalizacja (no flickering)
  475.     static int  O_hrs = 0;              // optymalizacja (no flickering)
  476.  
  477.     if (O_min != czas.Minuta)  
  478.     {
  479.         WyswietlCyfre(0,  0, czas.Godzina / 10);
  480.         WyswietlCyfre(4,  0, czas.Godzina % 10);
  481.         WyswietlCyfre(10, 0, czas.Minuta / 10);
  482.         WyswietlCyfre(14, 0, czas.Minuta % 10);
  483.         O_min = czas.Minuta;
  484.     }
  485.  
  486.     switch (F_sec)                
  487.     {                            
  488.         case 0 :  Dwukropek(8,0); F_sec = true;  break;
  489.         case 1 :  Kropka   (8,0); F_sec = false; break;
  490.         default: break;          
  491.     }  
  492.  
  493.     wyswietlacz.setCursor(18,2);                      // ustaw pozycję SEKUNDNIKA
  494.     wyswietlacz.print(czas.Sekunda / 10);             // wyswietl dziesiątki sekundnika
  495.     wyswietlacz.print(czas.Sekunda % 10);             // wyswietl jednosci sekundnika
  496.  
  497.    
  498.     if (O_hrs != czas.Godzina)
  499.     {
  500.         wyswietlacz.setCursor(18,0);                  // ustaw pozycję AM/PM
  501.        
  502.         if (czas.Godzina < 12) wyswietlacz.print(F("AM"));
  503.         else                   wyswietlacz.print(F("PM"));
  504.  
  505.         wyswietlacz.setCursor(3,3);    
  506.         wyswietlacz.print(F("code by : TLG"));
  507.        
  508.         O_hrs = czas.Godzina;  
  509.     }
  510. }
  511. // ------------------------------------------------------------------------------------------------------------------- //
  512. //          *** METODY PUBLICZNE *** WYSWIETL DATE ***                                                                 //
  513. // ------------------------------------------------------------------------------------------------------------------- //
  514.  
  515. void LCD :: WyswietlDate()
  516. {
  517.     static bool przelacznik = true;
  518.     WyczyscLinie(3);
  519.     wyswietlacz.setCursor(0,3);
  520.  
  521.     if ( przelacznik )
  522.     {
  523.         wyswietlacz.print(czas.ShortData);
  524.         przelacznik = false;
  525.     }
  526.     else
  527.     if ( !przelacznik )
  528.     {
  529.         wyswietlacz.print(czas.LongData);
  530.         przelacznik = true;
  531.     }
  532. }
  533.  
  534. // ------------------------------------------------------------------------------------------------------------------- //
  535. //                            *** KLASA LCD *** by Tomasz Majcher (TLG) v1.00 Lite ***                                 //
  536. // ------------------------------------------------------------------------------------------------------------------- //
  537. //                                    * * * K O N I E C   K L A S Y   L C D ***                                        //
  538. // ------------------------------------------------------------------------------------------------------------------- //
  539.  
  540.  
  541. // ------------------------------------------------------------------------------------------------------------------- //
  542. // --- O B I E K T Y  ------------------------------------------------------------------------------------------------ //
  543. // ------------------------------------------------------------------------------------------------------------------- //
  544.  
  545. LCD myLCD(lcd);
  546.  
  547. WiFiUDP ntpUDP;                                                
  548. NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600);  
  549.  
  550. // ------------------------------------------------------------------------------------------------------------------- //
  551. // --- Task0Callback() ----------------------------------------------------------------------------------------------- //
  552. // ------------------------------------------------------------------------------------------------------------------- //
  553.  
  554. void Task0Callback()
  555. {
  556.     timeClient.update();                                                                              
  557.    
  558.     unsigned long epochTime = timeClient.getEpochTime();                                              
  559.     struct tm *ptm = gmtime ( (time_t *) &epochTime );                                          
  560.                                                                                                
  561.     czas.DzienTygodnia     =   timeClient.getDay();                                          
  562.     czas.DzienMiesiaca     =   ptm->tm_mday;                                                
  563.     czas.Miesiac           =   ptm->tm_mon+1;                                                
  564.     czas.Rok               =   ptm->tm_year+1900;
  565.  
  566.     czas.SformatowanaData  
  567.                    =   String(DZIEN[czas.DzienTygodnia])
  568.                    +   ", "
  569.                    +   String(czas.DzienMiesiaca)
  570.                    +   " "
  571.                    +   String(MIESIAC[czas.Miesiac])
  572.                    +   " "
  573.                    +   String(czas.Rok);    
  574.  
  575.     czas.ShortData = String(czas.DzienMiesiaca)
  576.                    +   " "
  577.                    +   String(MIESIAC[czas.Miesiac])
  578.                    +   " "
  579.                    +   String(czas.Rok);  
  580.  
  581.     czas.LongData  =   String(DZIEN[czas.DzienTygodnia])
  582.                    +   " "
  583.                    +   String(czas.DzienMiesiaca)
  584.                    +   "/"
  585.                    +   String(czas.Miesiac);
  586.  
  587.     // --- formatowanie długości wyświetlanej daty ---
  588.  
  589.     if ( strlen(czas.LongData.c_str()) < 15 ) // jesli uda sie dokleci /RRRR
  590.     {
  591.         czas.LongData += "/" +   String(czas.Rok);
  592.     }
  593.     else
  594.     if ( strlen(czas.LongData.c_str()) < 18 ) // jesli nie uda się dokleić /RRRR doklej /RR
  595.     {
  596.       czas.LongData += "/" +   String(czas.Rok % 100);
  597.     }
  598.     else
  599.     if ( strlen(czas.LongData.c_str()) < 17 ) // jesli nie uda sie dokleic /RR
  600.     {
  601.       // nie rób nic :-)
  602.     }
  603.  
  604.     // -----------------------------------------------                  
  605.  
  606.     #if SERIAL                                                                                  
  607.         Serial.printf("\n\n[ESP] [TASK0] Data NTP  \t: %s ", czas.SformatowanaData.c_str());        
  608.     #endif          
  609. }
  610.  
  611. // ------------------------------------------------------------------------------------------------------------------- //
  612. // --- Task1Callback() ----------------------------------------------------------------------------------------------- //
  613. // ------------------------------------------------------------------------------------------------------------------- //
  614.  
  615. void Task1Callback()
  616. {
  617.     #if SERIAL
  618.         String bufor;
  619.        
  620.         if (czas.Godzina < 10)
  621.         {
  622.             bufor =  "0";
  623.             bufor += String(czas.Godzina);
  624.         }
  625.         else
  626.         {
  627.             bufor = String(czas.Godzina);
  628.         }
  629.  
  630.         bufor += ":";
  631.  
  632.         if (czas.Minuta < 10)
  633.         {
  634.             bufor +=  "0";
  635.             bufor += String(czas.Minuta);
  636.         }
  637.         else
  638.         {
  639.             bufor += String(czas.Minuta);
  640.         }
  641.  
  642.         if (czas.Godzina < 12) bufor += " AM";
  643.         else                   bufor += " PM";
  644.        
  645.         Serial.printf("\n\n[ESP] [TASK1] [Czas NTP] \t: %s", bufor.c_str());
  646.         Serial.printf("\n[ESP] [TASK1] [Memory Free]     : %u [kB]", ESP.getFreeHeap());      
  647.         Serial.printf("\n[ESP] [TASK1] [CPU frequency]   : %u [MHz]",ESP.getCpuFreqMHz());  
  648.         Serial.printf("\n[ESP] [TASK1] [WiFi IP]         : "); Serial.print(WiFi.localIP() );
  649.         Serial.printf("\n[ESP] [TASK1] [LongData]  \t: %s ", czas.LongData.c_str());
  650.         Serial.printf("\n[ESP] [TASK1] [ShortData] \t: %s ", czas.ShortData.c_str());
  651.        
  652.     #endif  
  653.  
  654.     myLCD.WyswietlDate();
  655. }
  656.  
  657. // ------------------------------------------------------------------------------------------------------------------- //
  658. // --- Task2Callback() ----------------------------------------------------------------------------------------------- //
  659. // ------------------------------------------------------------------------------------------------------------------- //
  660.  
  661. void Task2Callback()
  662. {
  663.     timeClient.update();                                                            
  664.                                                                                    
  665.     czas.Godzina  =  timeClient.getHours()+1;             // zapisz godzinę z serwera
  666.     czas.Minuta   =  timeClient.getMinutes();             // zapisz minutę z serwera
  667.     czas.Sekunda  =  timeClient.getSeconds();             // zapisz sekundę z serwera
  668.  
  669.     myLCD.WyswietlCzas();
  670.  
  671.    
  672. }
  673.  
  674. // ------------------------------------------------------------------------------------------------------------------- //
  675. // --- S E T U P ----------------------------------------------------------------------------------------------------- //
  676. // ------------------------------------------------------------------------------------------------------------------- //
  677.  
  678. void setup()
  679. {
  680.     #if SERIAL
  681.         Serial.begin(SerialSpeed);
  682.     #endif
  683.  
  684.     lcd.init();                      
  685.     lcd.backlight();    
  686.     myLCD.LcdRegister();
  687.  
  688.     WiFi.begin(ssid, password);
  689.  
  690.     while ( WiFi.status() != WL_CONNECTED )                              // czekaj na połączenie
  691.     {                                                                    // wait for connect    
  692.         #if SERIAL
  693.             delay ( 200 );                                              
  694.             Serial.print ( "." );                                      
  695.         #endif
  696.     }    
  697.  
  698.    runner.init();                                       // inicjalizuj scheluder
  699.                                                                                  
  700.    runner.addTask(task_0);                              // dodaj zadanie do scheluder
  701.    task_0.enable();                                     // włącz zadanie do scheluder
  702.    runner.addTask(task_1);                              // dodaj zadanie do scheluder
  703.    task_1.enable();                                     // włącz zadanie do scheluder
  704.    runner.addTask(task_2);                              // dodaj zadanie do scheluder
  705.    task_2.enable();                                     // włącz zadanie do scheluder
  706.  
  707.    // --- WYWOŁAJ TERAZ --------------------- //
  708.  
  709.    Task0Callback();
  710.    Task1Callback();
  711.    Task2Callback();
  712.  
  713.    // --------------------------------------- //
  714. }
  715.  
  716. // ------------------------------------------------------------------------------------------------------------------- //
  717. // --- L O O P ------------------------------------------------------------------------------------------------------- //
  718. // ------------------------------------------------------------------------------------------------------------------- //
  719.  
  720. void loop()
  721. {
  722.     runner.execute();    
  723. }
Advertisement
Add Comment
Please, Sign In to add comment