LOLIN ESP32 OLED ボードの MicroPython で NTP時刻表示


WEMOS社の LOLIN ESP32 OLED ボード上の MicroPython で NTP (Network Time Protocol) 接続して時刻をあわせ、OLEDに時計を表示してみました。

このボードの特徴は、

  • ESP32と小さなOLED (Organic Light-Emitting Diode) ディスプレイがコンパクトに一体化されていて、配線なしでOLED表示ができます。
  • US $8.9と安価です。
  • 購入時の注意としては、リチウムバッテリー用のコネクタの有無でボードサイズが異なります。 リチウムバッテリー用のコネクタが無いボードは、FRISKケースに組み込めるようです。

NTPで時刻を合わせてから、1秒毎に日時を更新中です。


WEMOS社の LOLIN ESP32 OLED ボードの裏側


時計プログラム (NTP時刻同期付き)

Wi-Fi経由でNTPサーバに接続して時刻を合わせ、OLEDに日時を表示する時計プログラムを作ってみました。掲載した1枚目の写真が実行時のOLED表示です。
MicroPython の time.localtime(), time.mktime() は、2000年1月1日 0時0分0秒 (UTC) 起点のようです。

main.py
# Watch with NTP synchronization
# MicroPython on Lolin ESP32 OLED 128x64 16x6(0..50)

ssid = "777"; password =  "7777777777"
ntp_host = "ntp.nict.jp"
# (datetime.date(2000, 1, 1) - datetime.date(1900, 1, 1)).days * 24 * 60 * 60
NTP_DELTA = 3155673600

import machine, time, ssd1306
import network, socket, struct

i2c = machine.I2C(scl=machine.Pin(4), sda=machine.Pin(5))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

oled.fill(0)
#         '1234567890123456'
oled.text('Python NtpClient', 0, 0)
oled.text('SSD1306 128x64  ', 0, 10)

station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False: pass
oled.text(station.ifconfig()[0], 0, 20,1)
oled.show()

NTP_QUERY = bytearray(48)
NTP_QUERY[0] = 0x1b
addr = socket.getaddrinfo(ntp_host, 123)[0][-1]
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
res = s.sendto(NTP_QUERY, addr)
msg = s.recv(48)
s.close()
val = struct.unpack("!I", msg[40:44])[0]
ntpSec = val - NTP_DELTA  + (9*60*60)
deltaSec = ntpSec - time.time() 

def f2(i): return '{:0>2}'.format(i)    
nowString = dayString = ""
while True:
        nowSec = time.time() + deltaSec
        now = time.localtime(nowSec)

        oled.text(nowString,0,40,0)
        nowString = '%s:%s:%s' % (f2(now[3]),f2(now[4]),f2(now[5]))
        #print(nowString)
        oled.text(nowString,0,40)

        oled.text(dayString,0,50,0)
        dayString = '%s/%s/%s' % (str(now[0]),f2(now[1]),f2(now[2]))
        oled.text(dayString,0,50)

        oled.show()
        time.sleep(1)

その他

シリアルコンソールからプログラムを削除するには、つぎの手順が利用できます。

import os
os.listdir()
os.remove('main.py')
os.listdir()

付録1 ピン配置

参考情報

MicroPython on an ESP32 Board With Integrated SSD1306 OLED Display (WEMOS/Lolin)
https://www.instructables.com/id/MicroPython-on-an-ESP32-Board-With-Integrated-SSD1/

micropython on ESP32 でNTPサーバから時刻取得
http://ippei8jp.hatenablog.jp/entry/2017/08/18/135755

Lolin ESP32 OLED wemosにスケッチを書き込んでみた  (フリスクケースに格納)
https://geeknavi.net/iot/lolin-esp32-test