WioTerminalで天気予報電光掲示板を作った

はじめに

相鉄の沿線にお住まいのみなさんは、以下のようなものに見覚えがあると思います。

f:id:kyuuzyuu9yen:20110210200822j:plain

ウェザーサイン

電球のドットマトリクスで天気予報を表示する電光掲示板で、正式には屋外天気予報表示装置(ウェザーサイン)と呼ぶそうです。昔は相鉄以外の駅にも設置されていたようです。

hamarepo.com

www.youtube.com

最初の写真のものは横浜駅にあったもので、少し前までは稼働していたのですが、最近行ったら表示面がカラー液晶に変わってしまっていました。ランプがすぐ切れるのでメンテナンスが大変らしいのでやむを得ませんが、残念です…。現在でもさがみ野駅では稼働しているそうです。

非常に特徴的で、ノスタルジックで気に入っているので、自作しようと表示面の写真を収集してLEDマトリクスで自作しようと思っていたのですが、手間と費用面で断念して7年も放置してしまいました。

今回はWioTerminalを使って(ミニ)ウェザーサインを作ってみたのでご紹介します。

システム構成

天気予報の情報はLivedoor天気情報のWeather Hacksを使用します。

weather.livedoor.com実物には「情報提供 (財)日本気象協会」と書かれていますが、こちらのAPIも情報元は日本気象協会だそうなので予報は同じであろうと思われます。データはJSONで取得できます。

WiFi経由でこのAPIへ定期的にアクセスし、WioTerminalの液晶へ表示します。

WioTerminal

ATSAMD51にWiFiモジュール(RTL8720)、液晶、その他センサーがついたプロトタイピング用キットで、3700円くらいで売っています。M5Stackとの大きな違いは、5GHzのWiFiに対応していること、バッテリーレスなことと、液晶がすこし大きいことです。

Arduinoで開発しますので、開発wikiの通りにセットアップすれば使用できます。(MicroPythonはセットアップ方法がよくわかりませんでした…)

いくつか注意点はあるものの、基本的なライブラリは整備されておりすぐ使用できます。まずは公式情報のとおりにセットアップします。

wiki.seeedstudio.com

使用ライブラリ

WiFi接続、液晶描画については公式ライブラリをそのまま使用します。

天気予報のデータはJSONになっているので、パースするためにArduinoJSONライブラリを使用します。WioTerminalへの対応は特に謳われていませんが、問題なく使用できました。

arduinojson.org

ライブラリの問題点

現在のWioTerminal公式ライブラリの最大の問題点は、液晶とWiFiを同時に使用した場合、液晶の描画速度が著しく遅くなることです。この現象はAtWiFi.hをincludeしただけで発生します。

これはWiFiモジュールとの通信用のスレッドの優先順位が高いことに原因がありますが、他のスレッドとの兼ね合いから単にこのスレッドの優先順位を落とすと通信ができなくなるので、一時的な解決策として、液晶の描画時だけ通信用スレッドの優先順位を落とすようにします。

この処理を行うため、Arduinoディレクトリ(デフォルトではドキュメント内に存在)のlibraries/esp-at-lib-develop/src/esp_ll_arduino.cppをテキストエディタで開き、90行目を以下のように変更します。(staticを消します)

esp_sys_thread_t usart_ll_thread_id;

ソースコード

以下からcloneするかzipでダウンロードしてください。

github.com

ビルドする前に、以下の定数を環境に合わせて変更してください。

  • WIFI_SSID 接続先APのSSID
  • WIFI_PASSWORD 接続先APのパスワード
  • API_RESOURCE city=以降を取得したい地域IDに変更する。デフォルトは東京(130010)
  • UPDATE_PERIOD_MS 更新間隔をmsで指定。デフォルトは60分

 動作画面

こんな感じで動きます(以下の動画ではWiFiへの接続画面などはありません)

 ケース付きでショートの心配などなく手軽に使えて非常に便利です。みなさんもぜひ!