/*
NTP_SERVER
NTP Server Thai สำหรับเทียบฐานเวลาในประเทศไทย
NTP Server สำหรับเทียบเวลามาตรฐานนั้นคืออะไร? เคยเขียนไว้ในบทความก่อนหน้านี้
ดูได้จาก NTP Server คือ อะไร ต่างกับ PTP Server อย่างไร แต่วันนี้ เราจะแนะนำตัว
NTP Server ที่ให้บริการปรับเทียบเวลาสำหรับ NTP Client ฟรี โดยไม่ต้องติดตั้ง
NTP Server เองในองค์กร
การซิงค์เวลากับผู้ให้บริการ Time Server (NTP Server) แบบไม่คิดค่าใช้จ่าย
ในประเทศไทยนั้น สามารถตั้งค่าที่ NTP Client หรืออุปกรณ์ที่ต้องการอ้างอิงเวลากับ
Time Server ได้ เช่น เครื่องสแกนบัตรเข้าออก หรือเครื่องสแกนลายนิ้วมือ ระบบกล้องวงจรปิด
คอมพิวเตอร์ โน็ตบุ็ค และเครื่องเซิร์ฟเวอร์ต่างๆ เช่น ระบบจัดเก็บล็อกไฟล์ตาม พรบ. คอมพิวเตอร์
ซึ่งสามารถตั้งค่า Time Server ได้ที่ NTP Server Thai รายชื่อต่อไปนี้
1.th.pool.ntp.org
asia.pool.ntp.org
1.asia.pool.ntp.org
time.navy.mi.th (เวลามาตรฐานประเทศไทย โดย กรมอุทกศาสตร์ กองทัพเรือ)
time2.navy.mi.th (เวลามาตรฐานประเทศไทย โดย กรมอุทกศาสตร์ กองทัพเรือ)
ข้อดีของการใช้ NTP Server ภายนอก
1.ประหยัดค่าใช้จ่ายในการลงทุนติดตั้งเครื่องเซิร์ฟเวอร์
2.ประหยัดค่าใช้จ่ายและ เวลาในการบำรุงรักษาเครื่อง
3.NTP Client ได้รับการอ้างอิงปรับเทียบฐานเวลาในระดับ Stratum 1
ข้อเสียของการใช้ NTP Server ภายนอก
1.สิ้นเปลือง Internet Bandwidth เนื่องจากแทนที่จะซิงค์เวลากับ Time Server (NTP Server)
ในองค์กร เครื่อง NTP Client ทุกตัวต้องออกอินเตอร์เน็ต เพื่อไปอ้างอิงเวลากับ Time Server ภายนอก
2.Server Availability มีค่าไม่แน่นอน ขึ้นอยู่กับปริมาณเซสชั่น (Session) ของ NTP Server
เนื่องจาก NTP Server ที่ให้บริการปรับเทียบเวลาฟรีนั้น อาจจะมีบางช่วงเวลา ไม่สามารถให้บริการปรับเทียบเวลาได้
เป็นผลทำให้เวลาที่ตัว NTP Client หรืออุปกรณ์ที่ต้องการ Sync Time มีค่าเวลาที่คลาดเคลื่อนไปได้
===================================================================================================
UTC_OFFSET
utc_offset คือค่าชดเชยเวลาจากเวลาสากลเชิงพิกัด (UTC) และแสดงถึงความแตกต่างระหว่างเวลา UTC
และเวลาท้องถิ่นในสถานที่ใดสถานที่หนึ่ง ค่านี้จะบอกว่าเวลาท้องถิ่นเร็วกว่า (นำหน้าด้วยเครื่องหมาย \(+\) )
หรือช้ากว่า (นำหน้าด้วยเครื่องหมาย \(-\) ) เวลา UTC กี่ชั่วโมงและนาที เช่น ประเทศไทยมีค่า utc_offset
เป็น UTC+7 ซึ่งหมายความว่าเวลาในประเทศไทยจะเร็วกว่าเวลา UTC อยู่ 7 ชั่วโมง
- การแสดงผล: ค่า utc_offset จะแสดงในรูปแบบที่แตกต่างกันได้ เช่น +07:00, +0700 หรือ +07
- การใช้งาน: เป็นข้อมูลสำคัญในการคำนวณและกำหนดเวลาที่ถูกต้องในระบบคอมพิวเตอร์, การเขียนโปรแกรม,
หรือในอุตสาหกรรมการบินเพื่อระบุเวลาการเดินทาง
- ความแตกต่างจากเวลามาตรฐาน: ถึงแม้ว่าจะใกล้เคียงกัน
แต่ utc_offset ไม่ได้เท่ากับเวลามาตรฐานเสมอไป เพราะบางพื้นที่อาจมีเวลาออมแสง (Daylight Saving Time)
ซึ่งจะทำให้ค่า utc_offset เปลี่ยนแปลงในช่วงเวลาหนึ่งของปี
===================================================================================================
UTC_OFFSET_DST
utc_offset_dst คือค่าชดเชยเวลาที่กำหนดสำหรับเขตเวลาเฉพาะในช่วงที่ใช้เวลาออมแสง (DST)
ซึ่งเป็นการปรับเวลาให้เร็วขึ้นหนึ่งชั่วโมงในช่วงฤดูร้อน เพื่อใช้ประโยชน์จากแสงสว่างตามธรรมชาติให้มากขึ้น
ค่านี้จะแสดงผลเป็น "utc_offset_DST" ตามหลังเขตเวลามาตรฐาน
- utc_offset: ค่ามาตรฐานของการชดเชยเวลาสำหรับเขตเวลาหนึ่งๆ จากเวลาสากลเชิงพิกัด (UTC)
- dst: ย่อมาจาก Daylight Saving Time (เวลาออมแสง) ซึ่งเป็นการปรับเวลาตามฤดูกาล
- utc_offset_dst: ค่าชดเชยเวลาที่ใช้เฉพาะในช่วงเวลาออมแสง โดยปกติจะมีค่าสูงกว่า utc_offset ปกติหนึ่งชั่วโมง
ตัวอย่าง:
San Pedro de Zamudia: มีเขตเวลามาตรฐานคือ UTC+1 แต่เมื่อเข้าสู่ช่วงเวลาออมแสง (CEST) ค่า utc_offset_DST จะเปลี่ยนเป็น +2
Freirina: มีเขตเวลามาตรฐานคือ UTC-4 แต่เมื่อเข้าสู่ช่วงเวลาออมแสง (CLST) ค่า utc_offset_DST จะเปลี่ยนเป็น -3
*/
//===================================================================================================
#include <WiFi.h>
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 25200 // UTC+7 for Thailand
#define UTC_OFFSET_DST 0
void printLocalTime() {
struct tm timeinfo;
getLocalTime(&timeinfo);
Serial.println(&timeinfo, "%H:%M:%S");
Serial.println(&timeinfo, "%d/%m/%Y %Z");
}
void setup() {
Serial.begin(115200);
WiFi.begin("happy_2.4G", "0816599222", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
}
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
Serial.println("OK");
}
void loop() {
printLocalTime();
delay(1000);
}
/*
#include <WiFi.h>
#include "time.h"
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
void setup(){
Serial.begin(115200);
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
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("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
}
*/