見出し画像

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行が残っていますが、不要なものは削除して参考にして下さい。

宜しくお願いいたします。


出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。