Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

このボードの特徴は、

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

20171217_163607.jpg

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


20171217_163757.jpg

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 ピン配置

image.png

参考情報

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

tshimizu8
電子工作、機械学習、脳、人工知能、哲学、ロボットなどをテーマに研究、Makeしています。
https://groups.google.com/forum/?hl=ja#!forum/robot-android-group-japan-akb
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away