[TH] ESP8266 time Library

บทความนี้เป็นบทความที่เรียบเรียงข้อมูลเกี่ยวกับการใช้งานไลบรารี time ซึ่งเกี่ยวข้องกับการหน่วงเวลาของ ESP8266 พร้อมตัวอย่างการเชื่อมต่อกับ NTP Server เพื่อทำการซิงค์ เวลาให้ตรงกัน

ภาพที่ 1 ตัวอย่างผลลัพธ์ของโปรแกรม code5-1

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