2024年10月20日 星期日

MicroPython 學習筆記 : xtools 函式庫改版 (二)

最近在測試 SSD1306 顯示器時發現 xtools 函式庫中的自訂函式 tw_now() 寫法有 bug, 當查詢 NTP 伺服器失敗時會顯示 UTC 時間而非預期的台灣時間, 這兩天仔細研究後將其改寫如下 : 

def tw_now():
    try: # 從 NTP 取得 UTC 時戳加 8 為台灣時間, 若成功設定 RTC
        print('Querying NTP server and set RTC time ... ', end='')
        utc=ntptime.time() # 取得 UTC 時戳
        print('OK.')
        t=time.localtime(utc + 28800) # 傳回台灣時間的元組
        rtc=RTC() # RTC 物件
        rtc.datetime(t[0:3] + (0,) + t[3:6] + (0,)) # 設定 RTC
    except:  # 查詢 NTP 失敗不設定 RTC 
        print('Failed.')
    return strftime()  # 傳回目前之日期時間字串 YYYY-mm-dd HH:MM:SS

經測試若 NTP 查詢失敗, 會從 RTC 時鐘讀取上一次同步以來的時間, 參考 :


另外, 原 tw_now() 函式會呼叫 pad_zero() 與 format_datetime() 來產生格式為 YYYY-mm-dd HH:DD:SS 的日期時間字串, 也因為改用新的自訂函式 strftime() 而用不到了, 因此從 xtools 中移除 : 

def pad_zero(v):
    if v < 10:
        return '0' + str(v)
    else:
        return str(v)
     
def format_datetime(local_time):
    Y,M,D,H,m,S,W,ds = local_time
    t = str(Y) + '-'
    t += pad_zero(M)
    t += '-'
    t += pad_zero(D)
    t += ' '
    t += pad_zero(H)
    t += ':'
    t += pad_zero(m)
    t += ':'
    t += pad_zero(S)
    return t

另外修改了 get_id() 函式, 原本是匯入 machine 模組後呼叫 machine.unique_id(), 改為從 machine 匯入 unique_id 後呼叫 unique_id() :

from machine import Pin, RTC, unique_id   

def get_id():
    return ubinascii.hexlify(unique_id()).decode('utf8')

已上傳更新 GitHub 上的 xtools.py :


沒有留言 :