ESP32 microPythonでRTC設定
ESP32の使い始めのころ、RTCの設定(時刻合わせ)で少し苦労しました。
それ以来使いまわしているコードを紹介します。
先の記事「network.WLAN 使い方」で紹介したclass に関数を追加するコードと、簡単な説明を書いてみます。
お気付きの点などありましたら教えて下さい。宜しくお願いします。
私が使っているコード
いきなりですが、実際のコードを紹介します。
先の記事「network.WLAN 使い方」で紹介したsub1.py について、
先頭に以下のimport文を追加します。
import time
import socket
import struct
class 末尾に以下を追加します。
def set_rtc(self): # set RTC
#ntp_host = "ntp.nict.jp"
#ntp_host = "jp.pool.ntp.org"
ntp_host = "ntp1.jst.mfeed.ad.jp"
#ntp_host = "ntp2.jst.mfeed.ad.jp"
#ntp_host = "ntp3.jst.mfeed.ad.jp"
# (datetime.date(2000, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 60 * 60
NTP_DELTA = 3155673600
errf = 0
try:
NTP_QUERY = bytearray(48)
NTP_QUERY[0] = 0x1b
addr = socket.getaddrinfo(ntp_host, 123)[0][-1]
except:
errf = 1
if errf == 0:
#print(addr)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(NTP_QUERY, addr)
msg = s.recv(48)
s.close()
val = struct.unpack("!I", msg[40:44])[0]
#print(val)
ntpSec = val - NTP_DELTA + (9*60*60)
tlt = time.localtime(ntpSec)
tlini = (tlt[0], tlt[1], tlt[2], tlt[6], tlt[3], tlt[4], tlt[5], tlt[7]) # format 変換
# tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday=179
# ↓
# tm_year, tm_mon, tm_mday, tm_wday, tm_hour, tm_min, tm_sec, tm_yday=179(usec?)
self.rtc = RTC()
self.rtc.init(tlini)
print(self.rtc.datetime())
return errf
main.py から次のように使います。
import sub1
wifi = sub1.wifi()
wifi.connect_wlan()
chkrtc = wifi.set_rtc()
wifi.stop_wlan()
chkrtc = の行以外は「network.WLAN 使い方」と同じです。
chkrtc の値は正常=0、エラー=1です。起動時にエラーが出るのは何らかの対処が必要だと思いますが、定刻更新(一日1回など)は無視して次回の正常終了を待つのも一つの方法だと思います。
ちょっと解説
どこに苦労したのか詳しく覚えていないのですが、Redminを見ると以下の2点が記録されていました。
1.ファームウェアを公式ページからダウンロードして改善した。
uPyCraftにお任せでダウンロードしていたものを、
公式からダウンロードしたものに差し替えています。
2.日付、時刻の並びが異なっていたので入れ替え処理を追加した。
ソースコードのコメントに残している通りです。
その他、当時いろいろ試したので、コメントアウトされたNTPホストのアドレスやprint行が残っていますが、不要なものは削除して参考にして下さい。
宜しくお願いいたします。
いいなと思ったら応援しよう!
出来ればサポート頂けると、嬉しいです。
新しい基板や造形品を作る資金等に使いたいと思います。