บทความนี้เป็นบทความที่เรียบเรียงข้อมูลเกี่ยวกับการใช้งานไลบรารี time ซึ่งเกี่ยวข้องกับการหน่วงเวลาของ ESP8266 พร้อมตัวอย่างการเชื่อมต่อกับ NTP Server เพื่อทำการซิงค์ เวลาให้ตรงกัน
time
ไลบรารี time เป็นไลบรารีจัดการเกี่ยวกับวันและเวลา ทำให้สามารถใช้ ESP8266 เป็นตัวจัดเก็บวันและเวลาสำหรับใช้ในการตั้งค่าต่าง ๆ ได้ เช่น กำหนดให้ทุกวันที่ 10 ทำการเตือนด้วยเสียงเพลง หรือ ปิดไฟเมื่อถึงเวลา 7.00 น. เป็นต้น โดยการเรียกใช้ไลบรารี time ต้องนำเข้าไลบรารีด้วยคำสั่งต่อไปนี้ก่อนใช้งาน
import time
อ่านค่าเวลาปัจจุบันจาก ESP8266 ใช้คำสั่งตามรูปแบบต่อไปนี้
ผลลัพธ์ = time.localtime( )
โดยผลลัพธ์ที่ได้ถูกจัดเก็บในรูปแบบของข้อมูลทูเพิล (tuple) จำนวน 8 สมาชิก ซึ่งสมาชิกแต่ละตัวจัดเก็บข้อมูลแตกต่างกันเรียงลำดับได้ดังนี้
ผลลัพธ์[0] จัดเก็บปี ค.ศ.
ผลลัพธ์[1] จัดเก็บเดือนที่ มีค่าอยู่ในช่วง 1 ถึง 12
ผลลัพธ์[2] จัดเก็บวันที่ มีค่าอยู่ในช่วง 1 ถึง 31
ผลลัพธ์[3] จัดเก็บชั่วโมง มีค่าอยู่ในช่วง 0 ถึง 23
ผลลัพธ์[4] จัดเก็บนาที มีค่าอยู่ในช่วง 0 ถึง 59
ผลลัพธ์[5] จัดเก็บวินาที มีค่าอยู่ในช่วง 0 ถึง 59
ผลลัพธ์[6] จัดเก็บวันในสัปดาห์ มีค่าอยู่ในช่วง 0 ถึง 6
ผลลัพธ์[7] จัดเก็บวันในปี มีค่าอยู่ในช่วง 1 ถึง 366
สำหรับกรณีการตั้งค่าเวลาเพื่อจัดเก็บใน ESP8266 จะต้องมีรูปแบบการเก็บข้อมูลดังนี้
(year, month, mday, hour, minute, second, weekday, yearday)
คำสั่งสำหรับการตั้งวันที่และเวลามีรูปแบบดังนี้
time.mktime( ตัวแปรเก็บวันที่และเวลา )
หรือ
time.mktime( ( ปีค.ศ. , เดือน, วัน, วันในสัปดาห์, ชั่วโมง, นาที, วินาที, เศษวินาที ) )
สำหรับการหน่วงเวลาในหลักวินาที มิลลิวินาที และไมโครวินาทีสามารถสั่งงานได้ด้วยคำสั่งดังต่อไปนี้
time.sleep(จำนวนวินาทีที่ต้องการหน่วงเวลา)
time.sleep_ms(จำนวนมิลลิวินาทีที่ต้องการหน่วงเวลา)
time.sleep_us(จำนวนไมโครวินาทีที่ต้องการหน่วงเวลา)
ตัวอย่างการใช้คำสั่งเพื่อหน่วงเวลา 3 วินาที สามารถเขียนได้ดังนี้
time.sleep(3)
หรือ
time.sleep_ms( 3000 )
หรือ
time.sleep_us( 30000000 )
กลุ่มคำสั่งที่ทำหน้าที่อ่านค่าเวลาปัจจุบันในหน่วยของมิลลิวินาที ไมโครวินาที หรือไซเคิลของ CPU เป็นตามรูปแบบของคำสั่งต่อไปนี้
จำนวนมิลลิวินาที = time.ticks_ms( )
จำนวนไมโครวินาที = time.ticks_us( )
จำนวนเวลา = time.ticks_cpu()
นอกจากนี้แล้วผู้เขียนโปรแกรมสามารถนำค่าเวลาที่อ่านมาทำการหาผลรวมหรือผลต่างได้ด้วยคำสั่งต่อไปนี้
ผลลัพธ์การบวก = time.ticks_add( จำนวน, ค่าที่นำไปบวก )
ผลลัพธ์ของผลต่าง = time.ticks_diff( จำนวน1, จำนวน2 )
ตัวอย่างการหาค่าเวลาในอีก 2 วินาทีข้างหน้าเขียนได้ดังนี้
t0 = time.ticks_ms()
t1 = time.ticks_add( t0, 2000 )
ตัวอย่างการแสดงข้อความ JarutEx ในอีก 2 วินาทีเขียนได้ดังนี้
t0 = time.ticks_ms()
while (time.ticks_diff( time.ticks_ms( ), t0) < 2000):
pass
print("JarutEx")
1 ชั่วโมง = 60 นาที
1 นาที = 60 วินาที
1 วินาที = 1,000 มิลลิวินาที
1 มิลลิวินาที = 1,000 ไมโครวินาที
ตัวอย่างการซิงค์เวลาจาก NTP Server
ตัวอย่างการตั้งเวลาจากการอ่านค่าจากเครื่องให้บริการโพรโทคอลเวลาบนระบบเครือข่ายอินเทอร์เน็ต หรือ NTP (Network Time Protocol) เป็นตามโปรแกรม code5-1
หลักการทำงานของ code5-1 คือ อาศัยคลาส RTC เป็นตัวเชื่อมกับคลาส ntptime เนื่องจากเมื่อเรียก ntptime.settime( ) ตัวคลาส ntptime จะทำการอ่านวันที่และเวลาจากเครือข่ายอินเทอร์เน็ต หลังจากนั้นดำเนินการตั้งค่าวันที่และเวลาให้กับคลาส RTC ซึ่งเมื่อตั้งค่ากับคลาส RTC ทำให้ส่งผลกับข้อมูลวันที่และเวลาถูกเปลี่ยนไป และข้อมูลวันที่และเวลาที่คลาส time ใช้งานก็เปลี่ยนไปด้วยเช่นกัน เนื่องจากถูกออกแบบให้ใช้หน่วยความจำร่วมกัน ดังนั้น เมื่อทำการ settime( ) จึงทำให้วันและเวลาของระบบเปลี่ยนเป็นเวลามาตรฐานโลก
# code5-1
import network as nw
import ntptime
from machine import RTC
import time
print("Before : {}".format(time.localtime()))
myESSID = "ชื่อAP"
myPassword = "รหัสผ่านของAP"
ifSTA = nw.WLAN(nw.STA_IF)
if (ifSTA.active() == False):
ifSTA.active(True)
ifSTA.connect(myESSID, myPassword)
while not ifSTA.isconnected():
pass
print("network configuration:\n{}".format(ifSTA.ifconfig()))
rtc = RTC()
ntptime.settime()
print("After : {}".format(time.localtime()))
ifSTA.active(False)
สรุป
จากบทความนี้จะพบว่าไลบรารี time มีหน้าที่หลัก 4 อย่าง คือ อ่าน/ตั้งค่าวันที่เวลา หน่วงเวลา อ่านค่าเวลา และทำการหาผลรวมหรือผลต่างของเวลา ซึ่งมีความสำคัญสำหรับการเขียนโปรแกรมที่ต้องการความแม่นยำในเรื่องของจังหวะเวลา เนื่องจากภาษาไพธอนเป็นภาษาระดับสูงที่ทำงานเป็นแบบอินเทอร์พรีเตอร์ (interpreter) ทำให้ควบคุมเรื่องความแม่นยำในการทำงานได้ยาก จึงต้องอาศัยการวนรอบจากการอ่าน ticks และหาผลต่างเพื่อรอให้ครบช่วงเวลาที่ต้องการ และนอกจากนี้จะพบว่าไลบรารี time ใช้พื้นที่หน่วยความจำสำหรับเก็บวันที่และเวลาเป็นหน่วยความจำเดียวกับไลบรารี RTC ทำให้การตั้งค่าเวลาจาก NTP ส่งผลให้เวลาของ ESP8266 เป็นเวลาตามมาตรฐานโลก
เวลาจาก NTP เป็นเวลามาตรฐานโลก ดังนั้น เมื่อใช้กับประเทศไทย ผู้เขียนโปรแกรมจะต้องนำค่าชั่วโมงที่อ่านมา บวกด้วย 7 เพื่อเปลี่ยนเวลาให้เป็นเวลาของประเทศไทยด้วยเสมอ และกรณีที่ต้องการเปลี่ยนปีจาก ค.ศ. ให้เป็น พ.ศ. จะต้องนำค่าปีบวกด้วย 543 เพื่อแปลงค่าจาก ค.ศ. ให้เป็น พ.ศ.
สุดท้ายนี้ทีม JarutEx หวังว่าบทความนี้คงเป็นประโยชน์แก่ผู้อ่าน และพอเป็นแนวทางสำหรับการนำไปใช้ต่อไปครับ ขอให้สนุกกับการเขียนโปรแกรมครับผม
(C) 2020, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุง 2020-10-05