OLED(有機EL)って焼き付くんですね。今知りました。
↑ 全画面を白く塗りつぶすと、焼き付きが良く分かります。
昔、ブラウン管モニターの時代にはスクリーンセーバーが流行りましたね。当時かなり高価なMacintoshを購入した時、フライングトースターが嬉しくて良く見てました。
OLEDのクリア方法を代えてパラパラを無くしました。
環境はこちらの別サイトに習い整えました。
Raspberry Pi: OLED-Display 128×64 mit Python ansteuern (I2C)
ここでは、上記環境下での画面クリアの違いを動画で見比べます。
↓ 動画前半がパラパラした(瞬きする様な)表示になってしまっています。後半からはパラパラせず普通に見やすい表示器です。
↓ 動画後半のPythonコードで、無限ループする描画に関した部分です。
#oled.cls()
draw.rectangle((0, 0, 127, 63), outline=0, fill=0)
# ↑ oled.cls()の代わりに画面全体を黒色の四角で塗りつぶす。
draw.text((0, 0), data1, fill=1)
draw.text((0, 17), f'{data2:>6.1f}', font=DejaVuSansMono14, fill=1)
draw.text((0, 34), f'{data3:>6.1f}', font=DejaVuSansMono14, fill=1)
draw.text((0, 51), f'{press:>6.1f}', font=DejaVuSansMono14, fill=1)
draw.text((55, 17), "C", font=FreeSerif14, fill=1)
draw.text((55, 34), "%", font=FreeSerif14, fill=1)
draw.text((55, 51), "hPa", font=FreeSerif14, fill=1)
oled.display()
time.sleep(1)
oled.cls()の代わりにdraw.rectangleで画面全体を黒色の四角で塗りつぶし、それから必要な描画設定をして最後にoled.display()で表示させます。
文字を反転させてハイライト表示にして、〇〇である事を強調するようにしてみました。
反転文字と書きましたが「反転したように見える」が正しいかも。
↓ Ambient(ambidata.io)へデータ送信した時だけに、OLED-Displayの四角内を反転させます。四角内の数値の単位は分でありカウントダウンします。表示の更新は1分毎ですが、送信は5分毎にしています。
↓ データ送信しない表示更新時は反転させません。
私が凄く参考にしているサイトです。
Raspberry Pi: OLED-Display 128×64 mit Python ansteuern (I2C)
↑ このサイトのソースコード “Beispiel 3” を参考にしています。↓
↑ A、B、Cの四角を描くソースコード(Python)です。↓
#!/usr/bin/env python
# coding=utf-8
# Bibliotheken importieren
from lib_oled96 import ssd1306
from smbus import SMBus
from PIL import ImageFont
# Display einrichten
i2cbus = SMBus(1) # 0 = Raspberry Pi 1, 1 = Raspberry Pi > 1
oled = ssd1306(i2cbus)
# Ein paar Abkürzungen, um den Code zu entschlacken
draw = oled.canvas
DejaVuSerifBold14 = ImageFont.truetype('DejaVuSerif-Bold.ttf', 14)
# Display zum Start löschen
oled.cls()
oled.display()
# Formen zeichnen
draw.rectangle((80, 10, 127, 63), outline=1, fill=0) # A
draw.rectangle((10, 20, 100, 50), outline=1, fill=1) # B
draw.rectangle((0, 0, 20, 30), outline=1, fill=0) # C
draw.text((110, 20), "A", font=DejaVuSerifBold14, fill=1)
draw.text((50, 25), "B", font=DejaVuSerifBold14, fill=0)
draw.text((4, 5), "C", font=DejaVuSerifBold14, fill=1)
oled.display()
outline や fill の値を1又は0にする事で、縁取りの線や塗りつぶしの色が白や黒になるようです。
ただ、outline を0した場合などは、四角の重ね位置により意図しない描画になる事がありました。
使用OLED-Displayは秋月電子通商の製品で通販コードP-12031です。
右寄せに嬉しいフォントが足元にありました。
フォントを FreeSans.ttf から DejaVuSansMono.ttf に変えました。
その足元とは、ラズパイの中です。Raspberry Pi OS Liteなのですが最初から入っていたのでしょうか? 等幅フォントで右寄せに良い感じのフォントです。
↓ その等幅フォントで表示させると温度、湿度、気圧の数値を右寄せに、小数点を揃える事が出来ました。それに、見やすいフォントなのでちょっと満足。因みに、日時のフォントは別のフォントです。
↓ こちらも右寄せなのですが、使用した FreeSans.ttf が等幅フォントでは無いせいか小数点の位置が不揃いです。気圧値がズレています。当初は、この状態で気持ち悪かったのですが、解決してスッキリです。
その等幅フォントは、DejaVuSansMono.ttf
/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf
↓ ラズパイの中をfindコマンドで
$ sudo find / -name "*.ttf"
この検索に複数ヒットして、その中にありました。
↓ FreeSans.ttf から DejaVuSansMono.ttf に変えた所のコード(Python)は
#FreeSans14 = ImageFont.truetype('FreeSans.ttf', 14)
DejaVuSansMono14 = ImageFont.truetype('DejaVuSansMono.ttf', 14)
oled.cls()
draw.text((10, 0), data1, fill=1) #日時
draw.text((10, 17), f'{data2:>6.1f}', font=DejaVuSansMono14, fill=1)#温度
draw.text((10, 34), f'{data3:>6.1f}', font=DejaVuSansMono14, fill=1)#湿度
draw.text((10, 51), f'{press:>6.1f}', font=DejaVuSansMono14, fill=1)#気圧
draw.text((65, 17), "C", font=DejaVuSansMono14, fill=1)
draw.text((65, 34), "%", font=DejaVuSansMono14, fill=1)
draw.text((65, 51), "hPa", font=DejaVuSansMono14, fill=1)
oled.display()
この記事の続きは「 OLED-Displayと反転文字 」です。
長い時間と過労(長時間のGoogle検索)を経て、表示させたい値をSSD1306使用0.96インチ128×64ドット有機ELディスプレイ(以下OLEDディスプレイ)に表示させる事が出来ました。
↑ Raspberry Pi 4のI2Cで各センサーから得た値をOLEDディスプレイに表示させている。データは5分毎にAmbient(ambidata.io)へ送り蓄積させています。↓
OLEDの表示に関して、凄く参考になったサイト
Raspberry Pi: OLED-Display 128×64 mit Python ansteuern (I2C)
↑ 凄く参考になったサイト(横文字でドイツ語?のサイトなので、私はコードを眺めるだけですが)の″Beispiel2″のコードを参考にしてフォントサイズを変えてみると。↓
↑ 日時のフォントサイズはデフォルト?で、温度、湿度、気圧のフォントサイズを14にしてみました。
フォントサイズに関するコード(Python)の一部です。
from lib_oled96 import ssd1306
from smbus import SMBus
from PIL import ImageFont
FreeSans14 = ImageFont.truetype('FreeSans.ttf', 14)
oled.cls()
draw.text((10, 0), data1, fill=1) # 日時
draw.text((10, 20), f'{data2:>8.1f}', font=FreeSans14, fill=1) # 温度値
draw.text((10, 35), f'{data3:>8.1f}', font=FreeSans14, fill=1) # 湿度値
draw.text((60, 20), "C", font=FreeSans14, fill=1) # 温度の単位
draw.text((60, 35), "%", font=FreeSans14, fill=1) # 湿度の単位
oled.display()
温度値と湿度値の表示は、桁数指定と右寄せをしています。気圧値の表示も右寄せをさせてますが、現時点で1000hPa未満の5桁(小数点を含む)にならないので確認出来ておらず恥ずかしいので気圧のコードは載せていません。
この記事の続きは「 OLED-Displayと等幅フォント 」です。