OLED用にマイクロ秒(μs)の画像を作ってみました。

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

 

ひらがな変換した μ を使用すると文字化けするので、これまでは代わりに小文字の u を使用していました。しかしどうにも気になっていたので、画像の扱い方の勉強がてら作ったのが次の画像です。サイズは12×7ピクセルのグレースケール、PNG形式。GIMPで作成。↓

 

↓ 実際に使用したのがこれです。(μsは画像)

draw.bitmap((116, 4), Image.open('us.png'), fill=1)

 

↓ μ の代わりに小文字のユーの字 u を使用すると。(usは文字)

draw.text((116, 0), 'us', fill=1)

今度が本命のグラフ作りです。自作中のGPS時計に追加予定で、ntpdのオフセット値をグラフにします。

loopstats を元にグラフを描画するのですが、GPSユニットから1PPSが出力されないと、このログファイルは更新されないようです。なので、衛星をロストして外のNTPサーバーに同期している時は、グラフを描画出来ません。取り敢えず、こんな時は画面中央に「GPS LOST」と表示する事にしました。でもまぁ〜、同じディレクトリにある peerstats ならNTPサーバー同期中のオフセット値もあるんですけど。

ブレッドボード上でGPS時計が動作中のRadpberry Piで開発しています。使用OLED Displayは秋月電子で購入の0.96インチ128×64ドット有機ELディスプレイです。秋月通販コードP-12031

 

↓ 実際どんな物かと、タイムラプス動画にして見れるようにしました。この動画は150倍速です。実際のグラフ更新間隔は16秒なので、本当はアニメーションのように表示されません。

 

↓ グラフエリアは118×49ドット(黄色エリア)で、この中に点描画します。三角や四角に上下のラインは含みません。

 

ntpdのログファイル loopstats を最終行から118行を元にオフセット値を点描画します。グラフの更新間隔は16秒。ログファイルも私の環境では16秒間隔で記録されています。118行×16秒=1888秒なので、このグラフの横軸幅は31分28秒くらいです。最新の変化を確認するだけなら十分でしょう。

↑ 【5.0】は縦軸の倍率のようなもので、横軸に影響はありません。これはプロットが枠内に収まるように調整する時の数値で、5.0から0.1の範囲で変化します。
5.0 → 1ドット = 0.2μ秒
1.0 → 1ドット = 1μ秒
0.1 → 1ドット = 10μ秒

5.0を上限に設定、下限は0.1に設定。5.0の時が一番拡大された表示。0.1の場合は一番縮小されて表示されます。0.1でも収まらない場合は、断念して Out of rengeと画面中央に表示する仕掛けです。

↑ 【PPS】はGPSの1PPSに同期している印です。勝手に表示させているのでは無く、ntpq -crvのコマンドで得たものにsync_ppsの文字列がある場合に表示させています。

↑ 【0.772us】はオフセット値です。グラフ表示の為に /var/log/ntpstats/loopstats を読み込みます。その時、最終行(最新)のオフセット値を表示させています。同時に【三角マーク】はこの値を示します。

↑ 右端の【白四角】はグラフのゼロの位置を意味します。あの白四角より上ならプラス。下ならマイナスです。

今夢中のOLED-Displayに温度記号の°Cを表示させる時、違いがあったので備忘録。画像内の赤四角部分を見比べて下さい。

今までアスキー文字以外の、ひらがな変換した記号は文字化けしてしまうと思い込んでいたのですが、普通に表示されました。

↓ 最初の例は、私が見て形が良いものからです。° だけ全角で変換して C は半角アルファベットにしました。

 

↓ 次は、形が悪い(私の美意識では)と思うものです。°もCも同時に変換出来たものを使用すると、こうなりました。

 

ん〜。パッと見、違いが分からないですね。

今、私も「あれ。同じ?」と2秒ほど思ってしまいました。

でも、気を取り直して良く見ると、特に ° の丸さが違います。下段のものは丸みが無く四角になっています。それに、C の形も違うのです。実物を見ると分かりやすいのですが。

頑張って、温度と湿度もグラフ表示出来るようにしました。

表示時間は、温度12秒、湿度12秒、気圧36秒。この順番で表示を繰り返します。

↑ 表示されている気圧値1000.3hPaは、海面気圧では無く現地気圧です。現地標高194m。

↓ 海面気圧は、1024.5hPaだそうです。

今夢中の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の簡易グラフとか」