เนื้อหาในบทความ
1. แนะนำ
การมีนาฬิกาที่แม่นยำเป็นสิ่งสำคัญในโปรเจกต์ IoT หลายๆ ประเภท ไม่ว่าจะเป็นระบบบันทึกข้อมูลตามเวลา, ระบบควบคุมอัตโนมัติตามกำหนดการ, หรือแม้แต่นาฬิกาดิจิทัลธรรมดา ในบทความนี้เราจะมาเรียนรู้วิธีการใช้งาน NTP (Network Time Protocol) กับ ESP32 เพื่อรับเวลาที่แม่นยำจากอินเทอร์เน็ต
💡 ทำไมต้อง NTP?
- แม่นยำกว่า RTC บนบอร์ดทั่วไป
- อัปเดตเวลาอัตโนมัติ
- ไม่ต้องตั้งเวลาเอง
- ฟรี! ใช้งานได้ทันที
2. NTP คืออะไร?
NTP (Network Time Protocol) เป็นโปรโตคอลสำหรับซิงโครไนซ์เวลาผ่านเครือข่ายคอมพิวเตอร์ โดยจะเชื่อมต่อกับ NTP Server ที่เป็นแหล่งเวลามาตรฐานเพื่อรับเวลาที่แม่นยำ
ข้อดี
- ความแม่นยำสูง (±50ms)
- อัปเดตอัตโนมัติ
- รองรับทั่วโลก
- ใช้งานฟรี
ข้อจำกัด
- ต้องมีอินเทอร์เน็ต
- ใช้พลังงานเมื่อเชื่อมต่อ
- ต้องมีการจัดการ Timezone
3. สิ่งที่ต้องเตรียม
Hardware
- ✅ESP32 Board - รุ่นใดก็ได้ (DevKit, NodeMCU, etc.)
- ✅สาย USB - สำหรับ อัปโหลดโค้ดและจ่ายไฟ
- 📟จอแสดงผล (เลือกได้): OLED 0.96", LCD 16x2, หรือ Serial Monitor
Software & Library
- 💻Arduino IDE - เวอร์ชัน 1.8.x หรือ 2.x
- 📦ESP32 Core - ติดตั้งผ่าน Board Manager
- ⏰NTP Library - ใช้ built-in WiFiUDP & NTP
4. การเตรียม Hardware
ในตัวอย่างนี้เราจะใช้งานพื้นฐานที่สุด คือแสดงเวลาผ่าน Serial Monitor หากคุณต้องการต่อจอแสดงผล สามารถดูเพิ่มเติมได้ในส่วนท้ายๆ
การเชื่อมต่อพื้นฐาน
- • เสียบ USB ต่อกับคอมพิวเตอร์
- • เปิด Serial Monitor (115200 baud)
- • รอให้ ESP32 เชื่อมต่อ WiFi
- • เวลาจะแสดงอัตโนมัติ
5. โค้ดตัวอย่าง
#include <WiFi.h>
// ตั้งค่า WiFi
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// NTP Server Settings
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 25200; // GMT+7 สำหรับประเทศไทย (7 * 3600)
const int daylightOffset_sec = 0; // ไม่มี Daylight Saving Time
void setup() {
Serial.begin(115200);
// เชื่อมต่อ WiFi
Serial.printf("กำลังเชื่อมต่อ WiFi: %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\n✅ เชื่อมต่อ WiFi สำเร็จ!");
// ตั้งค่าเวลาจาก NTP Server
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("⏰ รับเวลาจาก NTP Server เรียบร้อย!");
}
void loop() {
// อ่านเวลาปัจจุบัน
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("❌ ไม่สามารถรับเวลาได้");
return;
}
// แสดงเวลา
Serial.println(&timeinfo, "%A, %d %B %Y %H:%M:%S");
// รอ 1 วินาที
delay(1000);
}อธิบายโค้ดทีละส่วน
1. การเชื่อมต่อ WiFi
เราใช้ WiFi.begin() เพื่อเชื่อมต่อกับเครือข่าย WiFi และรอจนกว่าจะเชื่อมต่อสำเร็จ
2. การตั้งค่า NTP
configTime() เป็นฟังก์ชันที่ใช้ตั้งค่าการรับเวลาจาก NTP Server โดยรับพารามิเตอร์ 3 ตัว:
- GMT offset (วินาที)
- Daylight offset (วินาที)
- NTP server URL
3. การอ่านเวลา
getLocalTime() ใช้รับเวลาปัจจุบันและเก็บไว้ใน struct tm ซึ่งมีข้อมูลวันที่และเวลาครบถ้วน
6. การทดสอบ
ขั้นตอนการทดสอบ
- อัปโหลดโค้ดไปยัง ESP32
- เปิด Serial Monitor ที่ 115200 baud
- รอให้เชื่อมต่อ WiFi (ประมาณ 5-10 วินาที)
- ดูเวลาที่แสดงบน Serial Monitor
- ตรวจสอบว่าเวลาถูกต้อง
✅ ผลลัพธ์ที่คาดหวัง
กำลังเชื่อมต่อ WiFi: MyWiFi . ✅ เชื่อมต่อ WiFi สำเร็จ! ⏰ รับเวลาจาก NTP Server เรียบร้อย! Saturday, 07 March 2026 18:12:45 Saturday, 07 March 2026 18:12:46 Saturday, 07 March 2026 18:12:47
7. การแก้ปัญหา
❌ ปัญหา: เชื่อมต่อ WiFi ไม่ได้
สาเหตุ: ชื่อ WiFi หรือรหัสผ่านผิด
วิธีแก้: ตรวจสอบชื่อและรหัสผ่าน WiFi ให้ถูกต้อง
❌ ปัญหา: เวลาไม่ถูกต้อง
สาเหตุ: GMT offset ไม่ถูกต้อง
วิธีแก้: สำหรับประเทศไทยใช้ 25200 (GMT+7 = 7 × 3600 วินาที)
❌ ปัญหา: ไม่สามารถรับเวลาได้
สาเหตุ: เชื่อมต่ออินเทอร์เน็ตไม่ได้ หรือ NTP server ไม่ตอบสนอง
วิธีแก้: ลองเปลี่ยน NTP server เช่น "time.nist.gov" หรือ "ntp.ku.ac.th"
8. สรุป
ในบทความนี้เราได้เรียนรู้วิธีการใช้งาน NTP กับ ESP32 เพื่อแสดงเวลาที่แม่นยำจากอินเทอร์เน็ต ซึ่งสามารถนำไปประยุกต์ใช้กับโปรเจกต์ต่างๆ ได้มากมาย เช่น:
- นาฬิกาดิจิทัล
- ระบบบันทึกข้อมูลตามเวลา
- ระบบควบคุมอัตโนมัติตามกำหนดการ
- ปฏิทินอัจฉริยะ
หมายเหตุ: หากต้องการให้นาฬิกะทำงานต่อเมื่อไม่มีอินเทอร์เน็ต แนะนำให้เพิ่ม RTC (Real Time Clock) module เข้าไปด้วย เช่น DS3231 หรือ DS1307