2022年3月6日星期日

ESP32 NTP Timer with WS2812B

        之前都是透過RTC 時鐘去設定時間後,再從RTC時鐘模組去取得時間,這次為了減少模組的使用,我們透過連線有線網路後去取得NTP時鐘,理由嗎,減少時間誤差,有些時候運作久了時間就會跑掉,話不多說Let's start!

前置作業

一、準備材料

開發板:ESP32 NodeMCU 

模 組:WS2812B 時鐘模組(文章連結)


 

開發環境 

Arduino IDE

Library  WS2812FX.h 連結https://github.com/kitesurfer1404/WS2812FX 

二、電路接線


步驟說明

步驟一、電路接線

請依照電路接線完成

步驟二、安裝WS2812FX Library

參考這篇 連結 https://850121.blogspot.com/2022/03/arduino-ws2812b.html

步驟三、複製程式

Git 連結 https://github.com/windyman24/ESP32-NTP-Timer-with-WS2812B

步驟四、編譯並上傳


  1. #include "WS2812FX.h"
  2. #include "WiFi.h"
  3. #include "time.h"
  4. const char* ssid = "Your Wifi SSID";
  5. const char* password = "Your Wifi PASSWORD";
  6. //NTP Time
  7. int timezone = 8 * 3600;//Set Time zone ,In Taiwan is +8, so Time zone is 8 * 3600
  8. int dst = 0;
  9. time_t now = time(nullptr);
  10. struct tm* p_tm = localtime(&now);
  11. //WS2812B define
  12. #define LED_COUNT 30
  13. #define LED_PIN 4
  14. #define OFF 0x000000
  15. #define TIMER_MS 5000
  16.  
  17. WS2812FX ws2812fx = WS2812FX(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);
  18.  
  19. unsigned long LightColor = 0x006633;
  20. int Def_min = 0;
  21. int Def_Second = 0;
  22. int Second = 0;
  23. int minu = 0;
  24. int hour = 0;
  25.  
  26. //Set blink time without delay
  27. unsigned long previousMillis = 0;
  28. const long interval = 1000;
  29. int DotState = false;// Dot State
  30.  
  31. bool GotTime = false;//Got NTP TIME Flag
  32. /*
  33. * Control Dot ON or OFF
  34. */
  35. void ShowDots(int EN)
  36. {
  37. if (EN == true)
  38. {
  39. ws2812fx.setPixelColor(14, LightColor);
  40. ws2812fx.setPixelColor(15, LightColor);
  41. }
  42. else
  43. {
  44. ws2812fx.setPixelColor(14, OFF);
  45. ws2812fx.setPixelColor(15, OFF);
  46. }
  47. }
  48. /*
  49. * Set Number,Input which Seg and its number
  50. */
  51. void ShowNumber(int SegNum, int num)
  52. {
  53. int ShowSegNum = SegNum * 7;
  54. if (SegNum > 1)ShowSegNum += 2;
  55. switch (num)
  56. {
  57. case 0:
  58. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  59. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  60. ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
  61. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  62. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  63. ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
  64. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  65. break;
  66. case 1:
  67. ws2812fx.setPixelColor(0 + ShowSegNum, OFF);
  68. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  69. ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
  70. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  71. ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
  72. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  73. ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
  74. break;
  75. case 2:
  76. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  77. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  78. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  79. ws2812fx.setPixelColor(3 + ShowSegNum, OFF);
  80. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  81. ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
  82. ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
  83. break;
  84. case 3:
  85. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  86. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  87. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  88. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  89. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  90. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  91. ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
  92. break;
  93. case 4:
  94. ws2812fx.setPixelColor(0 + ShowSegNum, OFF);
  95. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  96. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  97. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  98. ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
  99. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  100. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  101. break;
  102. case 5:
  103. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  104. ws2812fx.setPixelColor(1 + ShowSegNum, OFF);
  105. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  106. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  107. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  108. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  109. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  110. break;
  111. case 6:
  112. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  113. ws2812fx.setPixelColor(1 + ShowSegNum, OFF);
  114. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  115. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  116. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  117. ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
  118. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  119. break;
  120. case 7:
  121. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  122. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  123. ws2812fx.setPixelColor(2 + ShowSegNum, OFF);
  124. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  125. ws2812fx.setPixelColor(4 + ShowSegNum, OFF);
  126. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  127. ws2812fx.setPixelColor(6 + ShowSegNum, OFF);
  128. break;
  129. case 8:
  130. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  131. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  132. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  133. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  134. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  135. ws2812fx.setPixelColor(5 + ShowSegNum, LightColor);
  136. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  137. break;
  138. case 9:
  139. ws2812fx.setPixelColor(0 + ShowSegNum, LightColor);
  140. ws2812fx.setPixelColor(1 + ShowSegNum, LightColor);
  141. ws2812fx.setPixelColor(2 + ShowSegNum, LightColor);
  142. ws2812fx.setPixelColor(3 + ShowSegNum, LightColor);
  143. ws2812fx.setPixelColor(4 + ShowSegNum, LightColor);
  144. ws2812fx.setPixelColor(5 + ShowSegNum, OFF);
  145. ws2812fx.setPixelColor(6 + ShowSegNum, LightColor);
  146. break;
  147. }
  148. }
  149. /*
  150. * Set hour and minute ,and set to Seg
  151. */
  152. int TimeConvert(int hour, int minu)
  153. {
  154. int hour_H = hour / 10;
  155. int hour_L = hour % 10;
  156. int min_H = minu / 10;
  157. int min_L = minu % 10;
  158.  
  159. ShowNumber(3, hour_H);
  160. ShowNumber(2, hour_L);
  161. ShowNumber(1, min_H);
  162. ShowNumber(0, min_L);
  163.  
  164. ws2812fx.show();
  165. }
  166. void setup() {
  167.  
  168. Serial.begin(115200);
  169. //Wifi setting and connect
  170. WiFi.mode(WIFI_STA);
  171. WiFi.begin(ssid, password);
  172. while ( WiFi.status() != WL_CONNECTED ) {
  173. delay(500);
  174. Serial.print(".");
  175. }
  176. Serial.println("Wifi Connected Success!");
  177. Serial.print("NodeMCU IP Address : ");
  178. Serial.println(WiFi.localIP() );
  179. ws2812fx.init();
  180. ws2812fx.setBrightness(1000);
  181. ws2812fx.setSpeed(SPEED_MIN);
  182. ws2812fx.setColor(LightColor);
  183. ws2812fx.setMode(FX_MODE_BREATH);
  184. ws2812fx.start();
  185.  
  186. //Get the NTP time
  187. configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  188. Serial.println("\nWaiting for Internet time");
  189.  
  190. Def_Second = p_tm->tm_sec;
  191. Def_min = p_tm->tm_min;
  192. Serial.print("Def_Second:");
  193. Serial.println(Def_Second);
  194. Serial.print("Def_min:");
  195. Serial.println(p_tm->tm_min);
  196.  
  197. while (!GotTime) {
  198. configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  199. now = time(nullptr);
  200. p_tm = localtime(&now);
  201. Second = p_tm->tm_sec;
  202. minu = p_tm->tm_min;
  203. Serial.print("Second:");
  204. Serial.println(Second);
  205. Serial.print("min:");
  206. Serial.println(p_tm->tm_min);
  207. if (Def_min != minu) GotTime = true;
  208. else Serial.print("*");
  209. demo();
  210. }
  211. Serial.println("\nTime response....OK");
  212.  
  213. minu = p_tm->tm_min;
  214. hour = p_tm->tm_hour;
  215. Serial.print(hour);
  216. Serial.print(":");
  217. Serial.println(minu);
  218. TimeConvert(hour, minu);
  219. }
  220. /*
  221. * Use to reconnet the NTP time
  222. */
  223. void CheckTime()
  224. {
  225. configTime(timezone, dst, "pool.ntp.org", "time.nist.gov");
  226. now = time(nullptr);
  227. p_tm = localtime(&now);
  228. Second = p_tm->tm_sec;
  229. minu = p_tm->tm_min;
  230. }
  231. /*
  232. * Use to demo show 0~9
  233. */
  234. void demo()
  235. {
  236. for (int i = 0; i < 10; i++)
  237. {
  238. ShowNumber(0, i);
  239. ShowNumber(1, i);
  240. ShowNumber(2, i);
  241. ShowNumber(3, i);
  242. ws2812fx.show();
  243. delay(300);
  244. }
  245. }
  246.  
  247. void loop() {
  248. unsigned long currentMillis = millis();
  249. if (currentMillis - previousMillis >= interval) {
  250. previousMillis = currentMillis;
  251. Second++;
  252. if (Second > 59)
  253. {
  254. minu++;
  255. Second = 0;
  256. }
  257. if (minu > 59)
  258. {
  259. hour++;
  260. minu = 0;
  261. CheckTime();//every hour regulate the time
  262. }
  263. if (hour > 23)
  264. {
  265. hour = 0;
  266. minu = 0;
  267. }
  268. TimeConvert(hour, minu);
  269. ShowDots(DotState = !DotState);
  270. ws2812fx.setColor(LightColor++);
  271. }
  272. yield();
  273. }
參考來源

https://randomnerdtutorials.com/esp32-date-time-ntp-client-server-arduino/

https://850121.blogspot.com/2022/03/arduino-ws2812b.html

https://github.com/windyman24/ESP32-NTP-Timer-with-WS2812B

沒有留言:

發佈留言

打賞按讚