最近在測試 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 :
沒有留言 :
張貼留言