!! 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