4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MicroPythonAdvent Calendar 2017

Day 21

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

Last updated at Posted at 2017-12-20

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

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?