Network Time from NTP Server
อุปกรณ์ไฟฟ้าทั่วๆไป ถ้าขาดไฟฟ้า เช่นปิดอยู่จะไม่สามารถนับเวลาที่เดินไปเรื่อยๆได้ เปิดมาก็ต้องตั้งค่าเวลาใหม่ ถ้าต้องการค่าเวลาต้องต่อกับ Real Time Clock (RTC) ที่มีไฟเลี้ยง เพื่อให้นาฟิกาเดินไปเรื่อยๆ ซึ่งต้องมีค่าใช้จ่ายเพิ่ม และต้องตั้งเวลาใหม่เมื่อแบตเตอรี่หมด ถ้าอุปกรณ์สามารถต่อกับเน็ตเวิร์กได้ ก็จะดึงค่าเวลาจากเน็ตเวิร์กเพื่อตั้งเวลาและนับเวลาต่อไปเรื่อยๆได้ ในอินเตอร์เน็ตจะมีเซิร์ฟเวอร์ NTP ( Network Time Protocol) ใช้บอกเวลาให้เรา เป็นเวลามาตรฐาน Coordinated Universal Time (UTC) ซึ่งเป็นค่าเดียวกันทั่วโลก ในแต่ละท้องถิ่นจำเป็นต้องปรับจากค่านี้ให้ตรงกับเขตเวลาในแต่ละท้องถิ่น ประเทศไทยจะใช้ UTC+7 ก็คือเพิ่มจากเวลามาตรฐาน 7ช.ม. ค่าของโซนเวลาที่เราจะใช้ปรับกับเวลามาตรฐาน (Time Offset) ต้องเป็นหน่วยมิลลิวินาที โดยแปลงจากหน่วยชั่วโมง ยกตัวอย่างUTC -5 จะมีค่า -5 * 60 * 60 = -18000
UTC +7 จะมีค่า 7 * 60 * 60 = 25200
บางประเทศจะมีช่วงเวลากลางวันกลางคืนที่แตกต่างกันมากในแต่ละฤดูจำเป็นต้องปรับเวลาท้องถิ่นให้ตรงกับฤดูต่างๆ (Daylight saving time) แต่ประเทศไทยไม่จำเป็นต้องปรับ เพราะกลางวันกลางคืนแตกต่างกันไม่มากจึงใช้ค่านี้เป็น Daylight Offset เป็น 0 การใช้ดูโค้ดตัวอย่าง
Examples/ESP32/Time/SimpleTime
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #include <WiFi.h> #include "time.h" const char* ssid = "SSID"; const char* password = "PASSWORD"; const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 25200; //UTC+7 const int daylightOffset_sec = 0;//ไทยไม่ต้องปรับ void setup() { Serial.begin(9600); //connect to WiFi Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" CONNECTED"); //ดึงเวลาจากเซิร์ฟเวอร์ NTP แล้วเก็บในระบบ configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(); //พิมออกมา //ไม่จำเป็นต้องใช้ Wifi อีกต่อไป WiFi.disconnect(true); WiFi.mode(WIFI_OFF); } void loop() { delay(1000); printLocalTime(); } void printLocalTime() { struct tm timeinfo; //ที่เก็บข้อมูลเวลา if(!getLocalTime(&timeinfo)){ Serial.println("Failed to obtain time"); return; }//แสดงค่าด้วยวิธีต่างๆ Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); Serial.print(asctime(&timeinfo)); String date_time = String(timeinfo.tm_year+1900)+"/"+String(timeinfo.tm_mon+1)+"/"+String(timeinfo.tm_mday); date_time += " "+String(timeinfo.tm_hour)+":"+String(timeinfo.tm_min)+":"+String(timeinfo.tm_sec); Serial.println(date_time); Serial.println(""); } |
ผลของโปรแกรมผ่าน Serial Monitor
Connecting to oom .... CONNECTED
Tuesday, December 03 2019 06:35:10
Tue Dec 3 06:35:10 2019
2019/12/3 6:35:10
Tuesday, December 03 2019 06:35:11
Tue Dec 3 06:35:11 2019
2019/12/3 6:35:11
หลังจากเรียกฟังก์ชั่น configTime() ค่าของเวลาจะเก็บไว้ในระบบเลย แล้วเราใช้ getLocalTime() เพื่อเรียกใช้
เพิ่มเติม
Getting Date & Time From NTP Server With ESP32
Time structure
ไม่มีความคิดเห็น:
แสดงความคิดเห็น