fuji-yan

電子ペーパーで天気予報ダッシュボードを作る

最近、スマホを見る時間を減らすために色々と工夫している。

大学一年生の春にお母さんがiPhoneを買ってくれた時は、なんて便利なんでしょう!と感動 したものだ。 ところが最近のスマホアプリやコンテンツの作り手は、なるべくユーザーを中毒にしてなるべくたくさん広告を見てもらうべく躍起になっている(としか思えない)ため、気を抜くとやりたいことをやらずに一日を終えてしまう。 (そういえば、キル・ビルに出てくる寿司屋に「酔生夢死」って書いてあったよね)

良い一日を過ごすコツは、朝に「出来ればやりたかったことが出来た」という実績を積んで、 心の中でボーナスを稼ぐことにあると思う。 朝起きて家を出るまでにやることはなんだろう。自分の場合は:

  • Have to:天気予報を確認する、朝食を作る、歯を磨く、服を着替える
  • Want to:コーヒーを淹れる、シャワーを浴びる、走る、本を読む

Have toをスムーズにこなしてWant toに遅滞無く進みたいのだが、自分の場合は天気予報の確認が 曲者である。 うちにはテレビがないため、天気予報はスマホで確認している。 スマホを触ると通知を見てしまい、リンクを踏んでしまい、彼らの思う壺に嵌まるのである。

これでは斬りたいネズミを斬れないので、壁掛けの電子ペーパーに天気予報を表示しておいて、 チラと見たら済むようにしたい。

システム概要

インターネットに繋がったRaspberry Pi上でPythonを定期実行し、下記を行う:

  • 天気予報をインターネットから取得
  • ダッシュボードの画像を生成
  • 電子ペーパーに書き込む

用意するもの

  • Raspberry Pi 3B+ (Raspberry Pi Zero Wで十分だが、手元にあったため)
  • Waveshare 7.5inch E-paper HAT (B) (黒・赤・白の3色。(B)が名称に付かないモデルはモノクロだが4段階グレースケール。そっちを買えばよかった。)
  • 良い感じの額縁(まだ用意してない)

やったこと

環境構築

GUIは要らないので、Raspberry Pi OS LiteをRaspberry Piにインストールする。 メインのマシンからSSHでログインする。 Pythonの仮想環境はuvが好きなのでuvをインストールする。

コーディング

自分の場合、表示したいデータは、1時間ごとの降水量・気温・天気だ。 どこかから、どうにかして手に入れる。

次に、生成する画像の仕様の確認もかねて、電子ペーパーに画像を表示する部分を試した。 といっても、公式のサンプルコード(GitHub) を真似するだけでよい。

電子ペーパーに書き込む部分はライブラリとしてRaspberryPi_Jetsonnano/python/libに切り出されているので、そのコードは丸々コピーする。

画像を作って書き込む部分RaspberryPi_Jetsonnano/python/examplesはマニュアルと合わせて読んでおいたほうがよいだろう。

  • 長時間通電し続けると電子ペーパーが壊れるので、書き込みを終えたらsleepする
  • 画面のリフレッシュの間隔は180秒以上にしたほうがよい
  • 24時間に最低1回はリフレッシュしたほうがよい

今回は1時間に1回画面を更新するので、その度に初期化→リフレッシュ→描画→スリープすればよい。

ダッシュボードのデザインはClaudeに考えてもらい、それをPILでお絵かきするように作った。 描画上の工夫としては、

  • 折れ線グラフを普通に描画すると線が不均一に見えるので、実際の4倍のサイズのImageに 描画してから、Lanczos法でリサイズすると滑らかになる(と、Claudeが教えてくれた。 そういえば、学生の時に解析力学が好きで、Lanczosの書いた教科書を読んで面白いと思った 記憶があるが、どう面白かったのかは忘れた)
  • 天気のアイコンはGoogle Fontsのiconを使うと良い感じ
  • 気温のラベルと折れ線グラフが重なると見苦しいので、法線方向にオフセットする
  • フォントは太めがよい。自分はCommeを使った

いざ実行!

Raspberry Piにコードを置いて実行すると、だいたい10秒くらいかけて表示される。 テンション上がる。 見た目を一通り調整して満足したら、cronで定期実行させる。

天気予報を電子ペーパーに表示

化粧

額に入れるまでがプロジェクトです。 良い感じのフレームを探し中。。