文系忘備録

どこにでもいる文系大学生の忘備録です

MENU

【ラズパイ】SSD1306で大きく数字を表示する【Python】【入門】

みなさんこんにちは。
SSD1306って使いやすいですけど標準の関数のみで数字を表示したら小さくて遠くから見ずらいですよね?
今回はmicropythonで画面いっぱいに数字を表示できるようにしてみようと思います!

使用例

下記の動画で使用しています!
このように画面全体に表示します。
youtu.be

数字を表示してみる

コード

def WriteDigitalNumber(i,wh,oled):
    #width space
    wi_s = 5
    #height space
    hi_s = 8
    
    #width
    wi = 19
    #height
    hi = 48
    
    w = 0
    if wh == 1:
        w = 5
    elif wh == 2:
        w = 34
    elif wh == 3:
        w = 61
    elif wh == 4:
        w = 75
    elif wh == 5:
        w = 104
    else :
        print('number is out of index')
    
    if i == 0:
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 1:
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 2:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int((hi/2)),wi,1)
        oled.vline(w,hi_s+int((hi/2)),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 3:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 4:
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 5:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 6:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 7:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 8:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 9:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)

解説

oledにある描画関数の
vline(縦線)とhline(横線)を使用しています。

使い方

下のようにした場合0が1番目の位置に表示されます

#0を一番目に表示
WriteDigitalNumber(0,1,oled) # 引数1:表示する数字、引数2:表示する位置(1から5まで)、引数3:oled

下の画像のように、真ん中のスペースが足りていないので3番目の位置は各々小数点とか描画したらいいと思います。

#0を一番目に表示
WriteDigitalNumber(0,1,oled) 
#0を2番目に表示
WriteDigitalNumber(0,2,oled) 
#3を4番目に表示
WriteDigitalNumber(3,4,oled) 
#9を5番目に表示
WriteDigitalNumber(9,5,oled) 


サンプル

ラズパイピコにて超音波センサーの測定結果を表示するために使用しました。

import machine
import utime
import ssd1306

# 超音波センサー
trigger = machine.Pin(14, machine.Pin.OUT)
echo = machine.Pin(15, machine.Pin.IN)

# ssd1306
sda = machine.Pin(6)
scl = machine.Pin(7)
i2c = machine.I2C(1,sda=sda, scl=scl, freq=400000)
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)

def read_distance():
    trigger.low()
    utime.sleep_us(2)
    trigger.high()
    utime.sleep(0.00001)
    trigger.low()
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
    timepassed = signalon - signaloff
    distance = (timepassed * 0.0343) / 2
    return distance

def WriteDigitalNumber(i,wh):
    #width space
    wi_s = 5
    #height space
    hi_s = 8
    
    #width
    wi = 19
    #height
    hi = 48
    
    w = 0
    if wh == 1:
        w = 5
    elif wh == 2:
        w = 34
    elif wh == 3:
        w = 61
    elif wh == 4:
        w = 75
    elif wh == 5:
        w = 104
    else :
        print('number is out of index')
    
    if i == 0:
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 1:
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 2:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int((hi/2)),wi,1)
        oled.vline(w,hi_s+int((hi/2)),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 3:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 4:
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 5:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 6:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s+int(hi/2),int(hi/2),1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 7:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w+wi,hi_s,hi,1)
    elif i == 8:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,hi,1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 9:
        oled.hline(w,hi_s,wi,1)
        oled.vline(w,hi_s,int(hi/2),1)
        oled.hline(w,hi_s+int(hi/2),wi,1)
        oled.vline(w+wi,hi_s,hi,1)
        oled.hline(w,hi_s+hi,wi,1)
    elif i == 10 and wh == 3:
        oled.vline(w+3,hi_s+3,42,1)
        oled.vline(w+3,hi_s+18,14,0)
        
def WriteDigitalDot(position):
    wh = position
    
    #print(wh)
    
    #width space
    wi_s = 5
    #height space
    hi_s = 8
    
    #width
    wi = 19
    #height
    hi = 48
    
    w = 0
    if wh == 1:
        w = 5
    elif wh == 2:
        w = 34
    elif wh == 3:
        w = 61
    elif wh == 4:
        w = 75
    elif wh == 5:
        w = 104
    else :
        print('number is out of index')
        
    #oled.hline(w,hi_s+hi,wi,1)
    oled.fill_rect(w,hi,5,5,1)
    

if __name__ == "__main__":
    while True:
        oled.fill(0)  
        oled.rect(0,0,128,64,1)
        d = read_distance()
        d = round(d, 2) 
        
        if d < 100:
            n=0
            if d < 10:
                n=1
                WriteDigitalNumber(0,1)
        
            for i in str(d):
                n+=1
                if i == ".":
                    WriteDigitalDot(3)
                    continue
                WriteDigitalNumber(int(i),n)
        print(d)
    
        oled.show()
        utime.sleep(0.3)