[TH] machine.RTC

บทความนี้นำรายละเอียดของคลาส 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

ภาพที่ 1 ตัวอย่างการใช้ alarm และ alarm_left

ดังนั้น การประยุกต์ใช้ 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 สุดท้ายนี้ขอให้สนุกกับการเขียนโปรแกรมครับ

ท่านใดอยากพูดคุยสามารถคอมเมนท์ไว้ได้เลยครับ

แหล่งอ้างอิง

  1. Micropython: Quick reference for the ESP8266.
  2. Micropython: class RTC (Real-time-clock)

(C) 2020-2021, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2021-07-20, 2021-07-21, 2021-07-28