rtc??utc??esp8266??nodeMCU
閑言碎語
nodeMCU的模塊中,能吹的差不多沒了妙痹,其他一些傳感器的手上沒有铸史,估計(jì)也沒機(jī)會(huì)介紹了。這回來說說nodeMCU的時(shí)間细诸,涉及了2個(gè)模塊sntp和rtctime。雖然需要兩個(gè)模塊陋守,不過內(nèi)容還是比較簡(jiǎn)單的震贵。一起來看看。
sntp是一個(gè)可以用來獲取網(wǎng)絡(luò)時(shí)間的模塊水评,也就是通過網(wǎng)絡(luò)進(jìn)行授時(shí)猩系。
nodeMCU總共有三個(gè)和RTC有關(guān)的模塊,分別是rtcmem中燥、rtcfifo和rtctime寇甸。其中rtctime才是和時(shí)間相關(guān)的模塊。
模塊函數(shù)
序號(hào) | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | sntp.sync() | [server_ip], [callback], [errcallback] | 空 |
sntp就一個(gè)函數(shù)疗涉,用法也是很簡(jiǎn)單拿霉。指定一個(gè)授時(shí)服務(wù)器的IP地址,比如上海交通大學(xué)網(wǎng)絡(luò)中心202.120.2.101咱扣。也可以不傳入任何參數(shù)绽淘,這時(shí)候會(huì)使用上一次授時(shí)過的IP。
當(dāng)然了闹伪,使用這個(gè)函數(shù)的前提條件是要連入網(wǎng)絡(luò)沪铭!如果打算在設(shè)備上電后校準(zhǔn)時(shí)間壮池,那需要連入WIFI后在使用這個(gè)函數(shù)。否則杀怠,不能正確授時(shí)椰憋。授時(shí)失敗主要有下面4種情況:
- 1: DNS lookup failed
- 2: Memory allocation failure
- 3: UDP send failed
- 4: Timeout, no NTP response received
接著,來看看rtctime的函數(shù)赔退,函數(shù)也不多橙依。就5個(gè),其中2個(gè)是睡眠相關(guān)的函數(shù)离钝。
序號(hào) | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | rtctime.dsleep() | microseconds [, option] | |
2 | rtctime.dsleep_aligned() | aligned_us, minsleep_us [, option] | |
3 | rtctime.epoch2cal() | timestamp | table |
4 | rtctime.get() | 空 | sec, usec |
5 | rtctime.set() | seconds, microseconds | 空 |
.get()函數(shù)返回從1970/01/01到使用get函數(shù)那時(shí)的秒和微秒(時(shí)間戳)票编。對(duì)應(yīng)的set函數(shù)就不用多說了。如果使用了.sync()并授時(shí)成功卵渴,rct的時(shí)間也會(huì)被更新慧域,可以認(rèn)為是調(diào)用了.set()函數(shù)。
get函數(shù)得到的時(shí)間是秒浪读,我想沒有多少人可以知道這個(gè)秒對(duì)應(yīng)的年月日時(shí)分秒吧昔榴。這個(gè)時(shí)候就需要.epoch2cal()函數(shù)了,這個(gè)函數(shù)可以把時(shí)間戳變成時(shí)間碘橘。需要注意的是互订,這個(gè)時(shí)間沒有時(shí)區(qū)和夏令時(shí)的概念,是個(gè)UTC時(shí)間痘拆。如果要換成北京時(shí)間仰禽,需要+8小時(shí)。
實(shí)踐一下
例子只有一個(gè)纺蛆,不過代碼也不少吐葵,分開來看。首先是判斷是否連上了wifi桥氏,判斷依據(jù)是有沒有IP地址温峭。這部分寫成獨(dú)立的函數(shù)。
function isConnect()
ip, _, _ = wifi.sta.getip()
if ip ~= nil then
print(ip)
return true
else
print("without ip")
return false
end
end
接著是一個(gè)打印時(shí)間的函數(shù)字支,也是本文的主要內(nèi)容啦 O(∩_∩)O
function refreshTime()
time = rtctime.epoch2cal(rtctime.get())
print(string.format("%04d/%02d/%02d %02d:%02d:%02d",
time["year"],
time["mon"],
time["day"],
time["hour"] + 8,
time["min"],
time["sec"]))
end
使用.get()函數(shù)獲取時(shí)間戳凤藏。不過這個(gè)時(shí)間戳是秒,還需要使用..epoch2cal()把這個(gè)時(shí)間戳變成UTC堕伪。咱們這里是東8區(qū)揖庄,所以在小時(shí)time["hour"]這地方加8,變成北京時(shí)間欠雌。
這里的做法有誤, 詳見評(píng)論區(qū)!!!
tmr.alarm(0, 1000, tmr.ALARM_AUTO, function()
if isConnect() == true then
tmr.stop(0)
sntp.sync("202.120.2.101",
function()
print("sync succeeded")
tmr.alarm(0, 1000, tmr.ALARM_AUTO, refreshTime)
end,
function(index)
print("failed : "..index)
end
)
end
end)
設(shè)置一個(gè)定時(shí)器以1秒的頻率調(diào)用第一個(gè)函數(shù)抠艾,當(dāng)連上wifi的時(shí)候,使用.sync()函數(shù)桨昙,同步一下時(shí)間检号。接著腌歉,設(shè)置一個(gè)定時(shí)器以1秒的頻率調(diào)用第二個(gè)函數(shù),打印出時(shí)間齐苛。
把代碼save到nodeMCU翘盖,你就可以看到上面的效果了。建議把文件名寫成init.lua凹蜂。
別忘記了配置連入wifi的密碼和SSID要用wifi.sta.config()函數(shù)馍驯!
更多內(nèi)容
↑ 點(diǎn)擊上面的標(biāo)題可用查看同文集的其它文章。
簡(jiǎn)書評(píng)論不能貼圖, 如有需要可以到我的GitHub上提issues