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) 起点のようです。
# 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