ESP32S3と電子ペーパーで天気ステーションを作る
ESP32-S3と電子ペーパーデバイス利用し天気予報ステーションを作成します。開発環境はArduino IDEです。

ハードウェア
今回使うハードウェアは既製品なので特にはんだ付けや別途パーツを用意する必要がありません。
横長の電子ペーパーで、視野角も広いので机の片隅や棚などに置いて使えそうです。


スイッチ類やボタン、MicroSDカードスロットや、さらにはGPIOへのアクセスもあるのでセンサーを追加したりすることもできます。
さらに電源供給用のコネクタもついているので乾電池やLiPoバッテリーで動作もさせられそうです。天気予報ステーションとしては自動的に更新する仕組みのため、ボタン類を使わないのはちょっと勿体ないかなという感じがします。
ちなみにこの電子ペーパーはこのリンクから購入できます。
基本的にTFカードもSDカードもハードウェア的には同じですが、SDカードスロットと言えないのは大人の事情があります。その分安いのでまぁ妥当かも・・・。

完成品か・・・と、何か物足りなさを感じるあなたは素質があります。
こだわりの画面表示
電子ペーパーならではのパキっとした表示となるように 0か1のみのデータで構成されたバイナリー形式に変換したフォントデータを表示しています。
フォントサイズは 8, 16, 36, 38(細め), 92 ピクセルを同梱しています。

この製品のサンプルコードにも当然ながら表示用のフォントが含まれていたのでそれを使えば良かったのですが、なぜそれを採用したのか好みではないフォントしか入っていなかったため、PCで利用されているTTF/OTFフォントから電子ペーパーで使えるように変換するツールを作っておきました。是非ご利用ください。
またこの手の表示では等幅フォントが採用されがちですが、各文字ごとの幅が同じで表示してみたところ格好悪かったいまいちしっくりこないので文字によって幅が異なる表示にしました。いわゆるプロポーショナルフォントです。

サンプルをちょっとだけ改造するつもりがツールまで作ることになって面倒だった!
小さなプログラムの事で、メインとなる天気予報ステーションで利用する画像やフォントを変換するプログラムです。今回はあまりにも面倒すぎたのでPythonでAIを使って適当に作ってもらいました。

また、アイコンもいくつか候補を挙げてデザインを作り、Weather Iconsを利用することにしました。

天気予報ステーションを作る

ここからは天気予報ステーションの作り方をやっていきます
開発環境のセットアップ
ではまずはPC側にデバイスにプログラムを転送するための開発環境を構築していきます。いくつか方法がありますが、この記事では Arduino IDE を利用します。

Arduino IDE のダウンロードはこちらから、(記事執筆時点でのバージョンは2.3.4)
公式サイトからご利用のパソコン用のアプリをダウンロードしてインストールします。

天気予報プログラム
次は天気予報を表示するためのプログラムをダウンロードします。このプロジェクトはGitHubで公開しています。
厳密に言えば細かい違いがありますが、「とりあえず動かしてみよっかな〜」という際に意識するような違いではありません。Gitで管理する単位がリポジトリで、プロジェクトにはいくつもリポジトリが含まれる場合があったりします。しかし、場合によってはその逆となることもあります。
zip ファイルとしてダウンロードしていただくのが簡単です。

もちろんGitHubやGit使ったことあるぜ!知ってるぜ!という方はZipでダウンロードする必要はないのでここは都合の良いよいにやっちゃってください。
git clone https://github.com/kotamorishi/weather-crow5.7.git
cloneコマンドの例
ダウンロードしたファイルを展開すると以下のようなファイル構成になっています。

いくつかフォルダがありますが、weatherCrow5.7 フォルダが重要です。その中にArduino IDE で開くことができるプログラムが入っています。
Arduino IDE から電子ペーパーデバイスを使えるようにする
この電子ペーパーはArduino製品ではなく、ESP32というマイコンを利用した製品のため、Arduino IDE で ESP32シリーズを使えるようにする設定が必要になります。
まずはweatherCrow5.7.inoをダブルクリックで開きます。

2.ファイル > 基本設定 に移動します。
追加のボードマネージャの URL フィールドに以下の URL を追加します。
https://dl.espressif.com/dl/package_esp32_index.json

最後にOKボタンを押して設定完了です。
Arduino IDEの設定
次は以下の設定をツールメニューから変更していきます。これはどんなデバイスが接続されていて、どのように書き込むという設定です。
項目 | 設定する値 |
---|---|
ボード | ESP32 S3 Dev Module |
Partition Scheme | Huge APP (3MB No OTA/1MB SPIFFS) |
PSRAM | OPI PSRAM |
Upload Speed | 460800 |

天気予報を取得するためのAPIキーを用意する

この天気予報ステーションでは https://openweathermap.org/ から提供されているOne Call API 3.0を元に表示を行っていますので利用登録を行います。
なんらかのサービスを提供することを意味します。
この天気予報ステーションではその気象データを提供している事が「APIとしてデータ提供」となり、インターネットを介してデータを取得する一連の流れを「APIでデータを取得する」という表現になります。APIとは概念的な部分が大きく話の流れでは意味合いが変わる単語のひとつでもあります。
このページから利用登録ができます。これは有料のAPIでサブスクが必要ですが、記事執筆時点では1日1000回までのAPI利用は無料となっているのでこの天気予報ステーションでは1台あたり24回/日のため利用料金は発生しません。


何年か前はクレカ登録いらなかったのに!
設定ファイルを作る
config.example.hというファイルがあるので、そのファイルをコピーして同じフォルダ内に config.h というファイルを作成します。このファイルに記述された内容で天気予報ステーションは動作します。

この設定ファイルが無いと動かないぞ!
// Configuration file for weatherCrow5.7
// 無線LAN WiFi 接続設定
#define WIFI_SSID "Your WiFi SSID"
#define WIFI_PASSWORD "Your WiFi Password"
// OpenWeatherMapのキー
#define OPEN_WEATHER_MAP_API_KEY "b0123456789012345678901234567890" // Enter your OpenWeatherMap API key here
// 単位(metric/imperial) 日本は metric
#define UNITS "metric"
// 天気予報で表示する位置情報
#define LATITUDE "20.4255911"
#define LONGITUDE "136.0809294"
// (例)京都の場合この値
// #define LATITUDE "35.09"
// #define LONGITUDE "135.55"
// 画面の更新間隔 (分)
#define REFRESH_MINUITES 60
// location name (これは使っていない・・)
#define LOCATION_NAME "Toronto"
// Warning for the high UV index
#define UVI_THRESHOLD 3
// 予報エリアに表示する時間間隔
#define HOUR_INTERVAL 3
// バッテリー利用時の省電力設定
#define LOW_POWER_MODE false
ちなみに位置情報はGoogleMaps等で、ピンを置くとURLに記載されているのでその値を参考にしてください。
プログラムを転送する
では電子ペーパーとPCをUSB-Cケーブルで接続し、転送ボタンを押します。

これで実機にプログラムが転送され、天気予報ステーションの完成です。

完成したので、ここからはカスタマイズ方法とかやっていきます!
カスタマイズ
オープンソースとして公開していますので、気に入らない箇所がある、こんな情報も表示されてほしい、センサーを追加したい、SDカードに情報を保存したいなど・・・欲望の赴くままに自由に変更することができます。
オープンソースとは、ソースコードが公開され、誰でも自由に利用・改変・再配布できるソフトウェアのこと。GPLやMITなどのライセンスの下で提供され、利用や再配布のルールが定められている。このプロジェクトはMITライセンスとして公開を行っています。
また、Elecrowからも公式サンプルが公開されています。この中にはSDカードの扱い方や、ボタン、Bluetoothの利用方法などが入っていますので機能追加を考えている方は是非参考にしてみてください。

フォント
印象に大きく影響するフォントはカスタマズしやすいようにttf/otfから変換できるツールを作っておきました。

TTF(TrueType Font)やOTF(OpenType Font)などに代表される、現在一般的に利用されているフォントはベクターデータと呼ばれる曲線情報の組み合わせで形を定義したものが利用されています。しかし電子ペーパーで使うには少し大掛かりすぎるのであらかじめサイズを指定してビットマップとしてプログラム内に書き込んでいます。
デフォルトではPoppinsフォントを3サイズ用意しています。
アイコン
天気の状態や予報アイコンは洗練された見た目のWether-iconsを利用しています。デフォルトでは小さめと大きめのサイズを組み込んでいますが、同梱の変換ツールで画像の追加も簡単にできるようにしています。

もちろんサイズも変更できるよ!

カスタマイズする前に
カスタマイズする上のでトラブルはつきものです。基本的にソフトウェアの開発をするということは、作ってみてエラーが無いか確認することの繰り返しであると思って頂いてかまいません。
エラーメッセージはどのような問題が起きているかを教えてくれるものなので、しっかり見ていくのが基本になります。
カスタマイズする際は、細かく一つづつ変更と動作確認をしていきましょう。大きく変更するともし問題が合った場合に確認範囲が大きくなりすぎ、問題点を把握できなくなります。

そのためにテストコードってのがあってだな・・・
再起動を繰り返している
電子ペーパーが再起動を繰り返している場合は、何らかの致命的な問題が発生してしまったため連続して再起動を繰り返す場合があります。
その場合、エラー情報がシリアルモニターに表示されていることがありますが、ほとんどがコアダンプと呼ばれるほとんどの人類には理解できない内容しか表示されません。

そのため、再起動を繰り替えすような状態になってしまったら直前に行った修正や変更が影響していると考えるのが妥当なのでまずはその変更点を確認しましょう。
- 配列の範囲外の値を参照している
- レイアウト変更したがはみ出している
- 画像やフォントのサイズを変更した
- 電源ケーブルを変更した(本当にたまにある)
コード変更したら動かなくなった
何か変更しビルドが通らなくなってしまった場合は、動いていたバージョンとの差分を確認しましょう。なんらかの変更点やスペルミスなどでもエラーとなります。

何もしてないのに壊れた
何も問題なく動いていたのにエラーが発生した場合は以下のような画面が表示されます。ほとんどの場合の原因はAPIキーが無効になったり、WiFi接続ができなくなった、インターネット接続ができないといった外部要因が原因となっていることがあります。その場合、しばらく待つと復旧したりしますが、もし待っても復旧しない場合は設定や接続を確認してみてください。

ケースやスタンド
この製品の公式サイトににはSTPファイルが用意されていますので、ケースやスタンドを3Dプリンターなどで作る際には参考になります。特に寸法はネジ位置あわせなどが地味に面倒なので、データを公開してもらえるとカスタマイズしたいユーザーにとってすごく助かります。

とりあえずスタンドを作ってみました。



バッテリーで動作させる
この製品はUSB-Cのケーブル一本で動作させることができますが、バッテリーコネクタもついているのでバッテリー動作させることも可能です。

さすがにUSBケーブルをつなげておくのは辛いっ・・
プログラムは1時間に1回、10秒程度動作する仕様としています。動作中も電子ペーパーの更新中は明示的にクロックを落としたり、処理終了次第ディープスリープにしたりと省電力仕様に設定できます。
省電力モードは設定ファイルを以下の通りに変更してください。
config.h
#define LOW_POWER_MODE true // true とすると省電力モード
設定ファイルの省電力設定
計算上では単3乾電池2本で最大7ヶ月ほど持つハズですが、WiFiがキャッチできるまでの時間が掛かったり、APIリトライなどを考慮すると3〜4ヶ月程度動作させられるかなといった感じになると思われます。ホントにそんなに持つのかな・・・と思っています。
電源 | 総エネルギー (Wh) | 自己放電考慮後の実効エネルギー/日 (Wh) | 1日の消費量 (Wh) | 計算上の持続日数 |
---|---|---|---|---|
アルカリ乾電池 (単3x2) | 7.5 | 7.5 | 0.033 | 227日 (約7.5か月) |
ニッケル水素 (単3x2本) | 4.56 | 3.19 (1か月後) | 0.033 | 96日 (約3か月) |
リチウムポリマー 1000mAh | 3.7 | 3.33 (1か月後) | 0.033 | 101日 (約3.3か月) |
リチウムポリマー 2000mAh | 7.4 | 6.66 (1か月後) | 0.033 | 202日 (約6.7か月) |
リチウムポリマー 3000mAh | 11.1 | 9.99 (1か月後) | 0.033 | 303日 (約10か月) |

本当はソーラーパネルで動作させたかった!
技適もちゃんとあります
おそらく一部の方にはすごく気になるポイントの技術基準適合証明ですが、このデバイスはESP32-S3を利用しているので本体に刻印されていて安心です。ちなみに番号は 201-220052 です。


この電子ペーパーの購入はコチラ