今夢中のOLED-Displayに気圧簡易グラフを描画するコードを与えました。

簡易グラフと言う理由は、あの四角の中は41×48(横x縦)ドットしか無いので、縦軸用気圧データの小数点以下は四捨五入(五入又は五捨)して丸めています。横軸のスパンは約24時間なのですが、48ドットしか無いので35分間隔のデータで描画しています。ちなみに、2つ目の画像、Ambientのグラフは5分間隔のデータで描画しています。

簡易の理由はまだあって横軸は時間ですが、描画するデータに時間のデータは含まれていません。横軸のデータは35分間隔であると信じて描画しているのです。横軸、縦軸共にレンジ固定で、データに応じてレンジの変化無しです。本当に簡単なグラフ描画コードなのです。

色々な事をさせたいのは山々ですが、考えようとすると私の頭は1秒待たずに、フリーズしてしまいます。

 

↓ 右側の四角の中にグラフらしきものが見えると思うのですが、どうでしょう?

上の画像右側のグラフと、下画像の赤四角の中にあるグラフは、同時間帯のデータを元に描画されています。上下比べて似ていますよね。

 

とりあえず、簡易ながら念願のグラフ描画が出来るようになりました。

縦軸は出来るだけ固定して、気圧変化の大小が分かるようにさせるのが、良いと思うのですが。

出来れば、横軸は取得データ時刻に応じさせたり、再起動させても記録データを読み込んで再描画するコードを書きたいです。

...と思うのですが、フリーズの回数が増えるだけなのかも知れません。

 

↓ その後

↑ 横軸を日時(UNIX TIME)に合わせて描画するコードを追加。右側には最新の気圧データの位置が分かるように、三角マークを描画する仕様に変更しました。

↑ 右側四角内のグラフ更新は35分間隔ですが、左側の数値(気温、湿度、気圧)は1分間隔で更新されるので、グラフと数値が必ずしも一致しません。なので数値の位置が分かるように三角でマークするのです。

また、グラフ用データファイルの読み書きが出来るコードも追加しました。それに合わせて過去のデータを適当に(大雑把に)csvファイルを作り直したのですが、時間間隔がバラバラだったようでグラフが乱れています。たぶん。

ちなみに、気圧値の996.2(海面気圧では1019.8hPaくらい)は平均値です。60秒間に5秒間隔で12回サンプリングした値の移動平均を1分間の値としています。この効果として、PCのモニターで見るグラフは、ややなだらか曲線になりギザギザ感(ノイズ成分みたいな)は少なくなりました。このOLEDでは、その違いが分かりませんが。

 

↑ 上記画像の黄色矢印を見ていたら
↓ 三角マークを矢印にしてみました。

↑ 同時間帯(24時間)のデータをAmbientで表示させたグラフとの比較です。

 

↓ 私、頑張って簡易グラフが進化しました。
「OLED-Displayの簡易グラフとか」

OLED(有機EL)って焼き付くんですね。今知りました。

↑ 全画面を白く塗りつぶすと、焼き付きが良く分かります。

昔、ブラウン管モニターの時代にはスクリーンセーバーが流行りましたね。当時かなり高価なMacintoshを購入した時、フライングトースターが嬉しくて良く見てました。

OLEDのクリア方法を代えてパラパラを無くしました。

環境はこちらの別サイトに習い整えました。
Raspberry Pi: OLED-Display 128×64 mit Python ansteuern (I2C)

 

ここでは、上記環境下での画面クリアの違いを動画で見比べます。

動画前半(改善前)→ oled.cls()
動画後半(改善後)→ draw.rectangle((0, 0, 127, 63), outline=0, fill=0)

 

↓ 動画前半がパラパラした(瞬きする様な)表示になってしまっています。後半からはパラパラせず普通に見やすい表示器です。

 

↓ 動画後半の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()で表示させます。

この記事は「 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です。

この記事は「 OLED-Display 128×64とPython 」からの続きです。

 

右寄せに嬉しいフォントが足元にありました。

フォントを 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と反転文字 」です。