บทความ: สร้างนาฬิกา IoT แม่นยำด้วย ESP32 และ NTP Server

เรียนรู้วิธีการใช้งาน NTP (Network Time Protocol) กับ ESP32 เพื่อแสดงเวลาที่แม่นยำจากอินเทอร์เน็ต พร้อมโค้ดตัวอย่างและคำอธิบายภาษาไทย

📅 7 มีนาคม 2026⏱️ 15 นาที🎯 ระดับ: เริ่มต้น - กลาง
±50ms
ความแม่นยำ
WiFi
การเชื่อมต่อ
GMT+7
โซนเวลาไทย
Auto
อัปเดตอัตโนมัติ

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. การทดสอบ

ขั้นตอนการทดสอบ

  1. อัปโหลดโค้ดไปยัง ESP32
  2. เปิด Serial Monitor ที่ 115200 baud
  3. รอให้เชื่อมต่อ WiFi (ประมาณ 5-10 วินาที)
  4. ดูเวลาที่แสดงบน Serial Monitor
  5. ตรวจสอบว่าเวลาถูกต้อง

✅ ผลลัพธ์ที่คาดหวัง

กำลังเชื่อมต่อ 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