บทความนี้นำรายละเอียดของคลาส machine.RTC ของ Micropython มาเรียนรู้กัน โดยหน้าที่หลักของคลาสนี้คือ ออกแบบมาเพื่อเป็น RTC (Real-Time Clock) หรือนาฬิกาฐานเวลาจริง ภายในไมโครคอนโทรลเลอร์สำหรับเก็บวันที่และเวลาจึงทำให้สะดวกมากขึ้นเมื่อใช้งานร่วมกับชิพ ESP8266 หรือ ESP32 เนื่องจากสามารถเข้าถึง NTP เพื่ออ่านวันที่และเวลาจากอินเทอร์เน็ตหลังจากนั้นนำค่ามาเก็บลง RTC ทำให้มีวันที่และเวลาที่ถูกต้องพร้อมทั้งไม่ต้องเข้าถึงอินเทอร์เน็ตบ่อย ๆ เพื่ออ่านค่าดังกล่าวอีกครั้ง ซึ่งประหยัดการใช้วงจร RTC ภายนอกอีกด้วย
machine.RTC
ไมโครคอนโทรลเลอร์ esp8266 รองรับฟังก์ชันการทำงานเพียงบางส่วนของเพียงบางส่วนของ machine.RTC ดังนั้นบทความนี้จึงเน้นที่ส่วนของชิพตัวนี้สนับสนุนเท่านั้น การสร้างวัตถุประเภท RTC เพื่อใช้งาน ทำได้ดังนี้
วัตถุ = machine.RTC( id=0 )
การกำหนดค่าวันที่และเวลาให้กับวัตถุ RTC ต้องจัดข้อมูลในแบบทูเพิลจำนวน 8 สมาชิก ซึ่งเป็นค่าของ ปี, เดือน, วัน, วันในสัปดาห์, ชั่วโมง, นาที, วินาที และส่วนของวินาที โดยรูปแบบของคำสั่งเป็นดังนี้
วัตถุ.datetime( ( ปี, เดือน, วัน, วันในสัปดาห์, ชั่วโมง, นาที, วินาที และส่วนของวินาที ) )
กรณีที่ต้องการอ่านค่าวันที่และเวลาจาก RTC สามารถเรียกใช้ฟังก์ชันดังรูปแบบต่อไปนี้โดยผลลัพธ์ที่ส่งกลับเป็นข้อมูลแบบทูเพิลจำนวน 8 สมาชิก โดยแต่ละตัวมีความหมายเหมือนตอนส่งไปเก็บใน RTC
วันที่และเวลา = วัตถุ.datetime( )
การตั้งการเตือน (Alarm) ตามที่ต้องการทำโดยใช้คำสั่งดังนี้ โดย id คือ หมายเลข RTC ที่สร้างขึ้น ซึ่งในตอนที่สร้างวัตถุถ้าไม่ได้ระบุจะมีค่าเป็น 0 ค่า time คือ จำนวนมิลลิวินาทีถัดไปที่จะให้แจ้งเตือน
วัตถุ.alarm( id, time )
กรณีที่ต้องการทราบจำนวนมิลลิวินาทีก่อนที่จะถึงเวลสที่ตั้งไว้สามารถใช้คำสั่งดังนี้
จำนวนมิลลิวานาที = วัตถุ.alarm_left()
ตัวอย่างการใช้งาน alarm และ alarm_left เป็นดังภาพที่ 1
ดังนั้น การประยุกต์ใช้ alarm และ alarm_left เหมือนการวนรอบเพื่อหน่วงเวลา เช่น ต้องการหน่วงเวลา 2 วินาที หรือ 2000 มิลลิวินาที หลังจากนั้นแสดง ‘ho’ เขียนได้ดังนี้
import machine
rtc = machine.RTC()
rtc.alarm(0, 2000)
while (rtc.alarm_left()>0):
pass
print("Ho")
ส่วนไมโครคอนโทรลเลอร์ esp32 รองรับการใช้ datetime() แต่ไม่รองรับ alarm และ alarm_left ส่วนถ้าต้องการหน่วงเวลาเหมือนตัวอย่างด้านบนให้ใช้ time.sleep_ms( จำนวนวินาที ) แทนการใช้ alarm/alarm_left
ตัวอย่างโปรแกรมการตั้งค่าเวลาโดยโหลดเวลาจาก NTP และอัพเดตเวลาในวัตถุ rtc เป็นดังนี้
import ntptime
import machine
import socket
import network as nw
myESSID = "ชื่อAP"
myPassword = "รหัสผ่าน"
ifSTA = nw.WLAN(nw.STA_IF)
if (ifSTA.active() == False):
rtc = machine.RTC()
print(rtc.datetime())
ifSTA.active(True)
ifSTA.connect(myESSID, myPassword)
while not ifSTA.isconnected():
pass
print("network configuration:\n{}".format(ifSTA.ifconfig()))
ntptime.settime(timezone=7, erver = 'ntp.ntsc.ac.cn') # Bangkok +7
ifSTA.active(False)
print(rtc.datetime())
else:
print("STA active Failed!")
สรุป
จากบทความนี้จะพบว่า การใช้ machine.RTC ในไมโครคอนโทรลเลอร์ esp8266 และ esp32 เน้นที่ใช้สำหรับเก้บวันที่และเวลา ส่วนการตั้งเวลาต่าง ๆ ให้ใช้ machine.Timer แทน โดยเฉพาะ esp32 กรณีที่ต้องการหน่วงเวลาให้ใช้ time.sleep_ms( ) ในบทความ esp8266 time library แทนการวนรอบด้วย alarm/alarm_left สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ
ท่านใดอยากพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ
แหล่งอ้างอิง
- Micropython: Quick reference for the ESP8266.
- Micropython: class RTC (Real-time-clock)
(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-20, 2021-07-21, 2021-07-28