- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!! ssd1306
[aliexpress|https://ja.aliexpress.com/item/32896971385.html?spm=a2g0s.9042311.0.0.3ca04c4dXjH14t]
[amazon|https://amzn.to/38Zc9x1]
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)
----
! STM32F103