Tips-ssd1306
ssd1306
VCCとGNDの違いがあるので注意
Arduinoで
https://qiita.com/jakalada/items/8f83d07291d984a31633
micropython で
https://qiita.com/inachi/items/ceb3e8e12022a7cbdf7b
git
https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py
https://github.com/micropython/micropython/tree/master/drivers/display
配線
| SSD1306 | ESP32 | STM32F103 |
|---|---|---|
| GND | GND | GND |
| VCC | 3v3 | 3v3 |
| SCL | IO4 | SCL1(PB6) |
| SDA | IO5 | SDA1(PB7) |
接続の確認
from machine import I2C, Pin, SoftI2C
# i2c=I2C(scl=Pin(5),sda=Pin(4),freq=100000)
i2c=SoftI2C(scl=Pin(5),sda=Pin(4),freq=100000)
print(i2c.scan())
print("END")
micropython サンプル
文字を表示
# SSD1306
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
i2c = I2C(scl=Pin(4), sda=Pin(5))
## i2c = I2C(scl=Pin(34), sda=Pin(33))
oled = SSD1306_I2C(128, 64, i2c)
oled.text('Hello, World 1!', 0, 0)
oled.text('Hello, World 2!', 0, 10)
oled.text('Hello, World 3!', 0, 20)
oled.text('Hello, World 4!', 0, 30)
oled.text('Hello, World 5!', 0, 40)
oled.text('Hello, World 6!', 0, 50)
oled.show()
図形を描く
# SSD1306 from machine import Pin, I2C from ssd1306 import SSD1306_I2C i2c = I2C(scl=Pin(4), sda=Pin(5)) ## i2c = I2C(scl=Pin(34), sda=Pin(33)) oled = SSD1306_I2C(128, 64, i2c) oled.fill(0) oled.hline(0,32,128,1) oled.vline(64,0,64,1) oled.show() oled.line(0,0,127,63,1) oled.rect(72,8,24,16,1) oled.fill_rect(24,48,24,16,1) oled.show()
大きなフォント
https://github.com/peterhinch/micropython-font-to-py/tree/master/writer
https://github.com/peterhinch/micropython-nano-gui
arial10.py courier20.py を使う
時刻を OLED に
QIITA のコードを参考(丸写し?)して大きなフォントで時刻表示https://qiita.com/tshimizu8/items/a7c189612a9ba0a5284b
# ORIGNAL CODE https://qiita.com/tshimizu8/items/a7c189612a9ba0a5284b
# Watch with NTP synchronization
# MicroPython on Lolin ESP32 OLED 128x64 16x6(0..50)
ssid = "yourAPid"; password = "APpassword"
ntp_host = "jp.pool.ntp.org"
# (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
import gc
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, 15,1)
oled.show()
import arial10 # font
import courier20 # FONT
from writer import Writer
wri10 = Writer(oled, arial10, verbose=False)
wri20 = Writer(oled, courier20, verbose=False)
# NTPの時刻取得ルーチン
NTP_QUERY = bytearray(48)
NTP_QUERY[0] = 0x1b
# アドレス取得
addr = socket.getaddrinfo(ntp_host, 123)[0][-1]
# NTPポートを開く
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]
# 時刻 val に9時間分付加してJSTにする
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,35,0) # Clear
nowString = '%s:%s:%s' % (f2(now[3]),f2(now[4]),f2(now[5]))
#print(nowString)
#oled.text(nowString,0,35)
Writer.set_textpos(oled, 30, 8 )
wri20.printstring(nowString)
# oled.text(dayString,0,50,0)
dayString = '%s/%s/%s' % (str(now[0]),f2(now[1]),f2(now[2]))
# oled.text(dayString,0,50)
Writer.set_textpos(oled, 50, 8 )
wri10.printstring(dayString)
oled.show()
time.sleep(1)