วิธีดึงเวลาสากล จาก Internet มาใช้งานกับ ESP8266
สำหรับนักพัฒนา เรื่องของเวลาถือเป็นเรื่องที่น่าเบื่อ และน่ารำคาญ พอสมควร สำหรับงานที่ต้องการเสถียรภาพของเวลา เช่น การตั้งเวลาเพื่อควสบคุมอุปกรณ์ต่างๆ หรือการบันทึกข้อมูลจากฐานเวลา เป็นต้น อุปกรณ์ที่ใช้นับเวลา โดยทั่วไปนั้น คือ โมดูลนาฬิกา (Real Time Clock Module) ซึ่งก็พอมีให้เลือกอยู่หลายชนิดด้วยกัน ตั้งแต่ราคาถูกๆ ซึ่งก็ใช้งานได้ตามสภาพ ไปจนถึงราคาแพงๆ
แต่ทุกวันนี้อุปกรณ์ Microcontroller เข้าสู่ยุคของ Internet of things แล้ว ในเมื่ออุปกรณ์ควบคุมสามารถเชื่อมต่อกับ Internet ได้ เวลาก็ไม่ใช่ปัญหาอีกต่อไป บทความนี้จะเป็นการนำNode MCU หรือ ESP8266 มาตั้งเวลา โดยไม่ต้องใช้โมดูลนาฬิกา แต่จะเป็นการดึงเอาเวลาสากลจาก Server มาใช้งานแทน
เตรียม ESP8266 หรือ Node MCU ของท่านให้พร้อม แล้วมาเริ่มกันเลย..!!
1) สำหรับใครที่ยังไม่ได้ติดตั้ง ESP8266 บน Arduino IDE ก่อนอื่นให้ติดตั้ง Board ESP8266 ก่อน ดูวิธีการติดตั้งได้จาก บทความ
การใช้งาน NodeMCU + Arduino IDE + Blynk App 2) เมื่อติดตั้งเสร็จแล้ว ให้ Copy หรือ เขียน Code ตามตัวอย่าง
| #include <ESP8266WiFi.h> |
| #include <time.h> |
|
|
| const char* ssid = "ssid"; //ใส่ชื่อ SSID Wifi |
| const char* password = "password"; //ใส่รหัสผ่าน |
|
|
| int timezone = 7 * 3600; //ตั้งค่า TimeZone ตามเวลาประเทศไทย |
| int dst = 0; //กำหนดค่า Date Swing Time |
|
|
| void setup() |
| { |
| Serial.begin(115200); |
| Serial.setDebugOutput(true); |
|
|
| WiFi.mode(WIFI_STA); //เชื่อมต่อ Wifi |
| WiFi.begin(ssid, password); |
| Serial.println("\nConnecting to WiFi"); |
| while (WiFi.status() != WL_CONNECTED) { |
| Serial.print(","); |
| delay(1000); |
| } |
| configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดึงเวลาจาก Server |
| Serial.println("\nWaiting for time"); |
| while (!time(nullptr)) { |
| Serial.print("."); |
| delay(1000); |
| } |
| Serial.println(""); |
| } |
| |
| void loop() |
| { |
| configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //ดีงเวลาปัจจุบันจาก Server อีกครั้ง |
| time_t now = time(nullptr); |
| struct tm* p_tm = localtime(&now); |
| delay(1000); |
| } |
3) ทำการ Upload Program ให้เรียบร้อย แล้วเปิด Serial Monitor
โปรแกรมก็จะแสดง วัน และเวลาปัจจุบัน ออกทาง Serial Monitor เพียงเท่านี้เราก็จะได้เวลาปัจจุบันโดยไม่ต้องต่อ RTC แล้ว
แล้วเราจะ ดึงค่าเวลา ต่างๆ มาใช้ยังไง ????? ง่ายมากครับ ให้สังเกตุที่บรรทัด struct tm* p_tm = localtime(&now) ซึ่งเป็น Struct เก็บค่าตัวแปรต่างๆไว้ ดังนี้
struct tm {
int tm_sec; /* วินาที, range 0 to 59 */
int tm_min; /* นาที, range 0 to 59 */
int tm_hour; /* ชั่วโมง, range 0 to 23 */
int tm_mday; /* วันที่, range 1 to 31 */
int tm_mon; /* เดือน, range 0 to 11 */
int tm_year; /* ปีคริสศักราช ตั้งแต่ 1900 */
int tm_wday; /* วัน, range 0 to 6 */
int tm_yday; /* วันใน 1 ปี, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};
เราสามารถนำค่า Parameter ต่างๆ ไปใช้งานได้เลย โดยใช้ตัวแปร p_tm->tm_hour (ตัวแปรเก็บค่าชั่วโมง) คราวนี้ ผมจะลองดึงเฉพาะ วินาที แสดงออกทาง Serial Monitor โดยเพิ่มโค้ด
Serial.Print (p_tm -> tm_sec) เข้าไป ตามตัวอย่าง
void loop()
{
//configTime(timezone, dst, "pool.ntp.org", "time.nist.gov"); //แสดงเวลาปัจจุบัน
time_t now = time(nullptr);
struct tm* p_tm = localtime(&now);
Serial.print("Sec = ");
Serial.print(p_tm->tm_sec);
Serial.println("");
delay(1000);
}
ทดสอบการทำงาน
เพียงเท่านี้เราก็สามารถเลือกค่าเวลาต่างๆ ไปใช้ในการ แสเงเวลา หรือตั้งเวลา ได้เลย โดยไม่ต้องเสียเงินซื้อ RTC Module อีกต่อไป.....
*********************************************************************************
Montien Ngamkaew
*********************************************************************************