วันศุกร์ที่ 29 พฤศจิกายน พ.ศ. 2562

ESP32:Coding:Network:Time

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


ไม่มีความคิดเห็น:

แสดงความคิดเห็น

Module:Control:IFR 520

MOSFET Module  สวิตซ์ปิดเปิดไฟเหมือน Relay แต่เป็น Solid state (ไม่มีส่วนที่เคลื่อนไหว) มันทำงานที่ความถี่สูงได้เหมาะกับเอาไปใช้งาน PWM ...