ESP32S3と電子ペーパーで天気ステーションを作る

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

ESP32S3と電子ペーパーで天気ステーションを作る
難易度 ★★☆
ハードウェアはElecrowから発売されている既製品を利用するので、はんだ付けや電子工作の手間がかからず初心者にも十分にできます。独自機能の追加などの改造はプログラミングの知識が必要になってきますが、予報時間の変更などのカスタマイズは設定ファイルの変更だけで可能です。
5.7インチ電子ペーパー
電子ペーパーは紙のような質感のモニターです。テレビやPCのモニターと異なり視野角も広く、表示が非常にくっきりしています。通常のモニターに比べ画面の更新速度が遅いというデメリットもありますが、更新時しか電力を消費しないため天気予報などの表示に向いています。
開発環境 Arduino IDE
この製品に採用されているESP32-S3はIoTデバイス等に利用されているマイコンで、WiFiやBluetoothなどのワイヤレス接続に対応しています。この記事では Arduino IDE を利用しますが、他の開発ツールなども利用できます。M5 StackでもESP32が採用されていたりと様々な所で利用されているマイコンの代表格です。
自由にカスタマイズ
この天気予報ステーションのプログラムはGitHub上でMITライセンスとして公開しています。そのため、アイコンやフォント、表示する内容をカスタマイズしたい場合はフォークして自由に改造していただいて構いません。電子ペーパーでフォントや画像を扱うために少し便利なツールも一緒に入れておきました。
GitHub - kotamorishi/weather-crow5.7: Weather station using CrowPanel ESP32-S3 E-Paper HMI 5.79-inch Display
Weather station using CrowPanel ESP32-S3 E-Paper HMI 5.79-inch Display - kotamorishi/weather-crow5.7

ハードウェア

今回使うハードウェアは既製品なので特にはんだ付けや別途パーツを用意する必要がありません

横長の電子ペーパーで、視野角も広いので机の片隅や棚などに置いて使えそうです。

デスクトップに置くのに良いサイズ感
ボタンや外部インターフェースなど

スイッチ類やボタン、MicroSDカードスロットや、さらにはGPIOへのアクセスもあるのでセンサーを追加したりすることもできます

さらに電源供給用のコネクタもついているので乾電池やLiPoバッテリーで動作もさせられそうです。天気予報ステーションとしては自動的に更新する仕組みのため、ボタン類を使わないのはちょっと勿体ないかなという感じがします。

ちなみにこの電子ペーパーはこのリンクから購入できます。

MEMO

基本的にTFカードもSDカードもハードウェア的には同じですが、SDカードスロットと言えないのは大人の事情があります。その分安いのでまぁ妥当かも・・・。

完成品か・・・と、何か物足りなさを感じるあなたは素質があります。

こだわりの画面表示

電子ペーパーならではのパキっとした表示となるように 0か1のみのデータで構成されたバイナリー形式に変換したフォントデータを表示しています。

フォントサイズは 8, 16, 36, 38(細め), 92 ピクセルを同梱しています。

Poppinsフォントを利用しています。

この製品のサンプルコードにも当然ながら表示用のフォントが含まれていたのでそれを使えば良かったのですが、なぜそれを採用したのか好みではないフォントしか入っていなかったため、PCで利用されているTTF/OTFフォントから電子ペーパーで使えるように変換するツールを作っておきました。是非ご利用ください。

またこの手の表示では等幅フォントが採用されがちですが、各文字ごとの幅が同じで表示してみたところ格好悪かったいまいちしっくりこないので文字によって幅が異なる表示にしました。いわゆるプロポーショナルフォントです。

サンプルをちょっとだけ改造するつもりがツールまで作ることになって面倒だった!

ツールとは?

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

変換ツールで違うフォントを変換して表示した例

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

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

ここからは天気予報ステーションの作り方をやっていきます

開発環境のセットアップ

ではまずはPC側にデバイスにプログラムを転送するための開発環境を構築していきます。いくつか方法がありますが、この記事では Arduino IDE を利用します。

Software
Open-source electronic prototyping platform enabling users to create interactive electronic objects.

Arduino IDE のダウンロードはこちらから、(記事執筆時点でのバージョンは2.3.4)

公式サイトからご利用のパソコン用のアプリをダウンロードしてインストールします。

有料アプリですか?
Arduino IDEは無料で利用することができます。しかしダウンロード画面ではドネーション(寄付)しますかと聞いてきます、アプリを使わせてもらう立場なのでもちろん寄付したほうが良いですが懐事情もありますので余裕がある方はどうぞ!

天気予報プログラム

次は天気予報を表示するためのプログラムをダウンロードします。このプロジェクトはGitHubで公開しています。

リポジトリ・プロジェクト

厳密に言えば細かい違いがありますが、「とりあえず動かしてみよっかな〜」という際に意識するような違いではありません。Gitで管理する単位がリポジトリで、プロジェクトにはいくつもリポジトリが含まれる場合があったりします。しかし、場合によってはその逆となることもあります。

zip ファイルとしてダウンロードしていただくのが簡単です。

Zip圧縮されたファイルとしてダウンロードする

もちろんGitHubやGit使ったことあるぜ!知ってるぜ!という方はZipでダウンロードする必要はないのでここは都合の良いよいにやっちゃってください。

git clone https://github.com/kotamorishi/weather-crow5.7.git

cloneコマンドの例

ダウンロードしたファイルを展開すると以下のようなファイル構成になっています。

GitHubのファイルを解凍した状態

いくつかフォルダがありますが、weatherCrow5.7 フォルダが重要です。その中にArduino IDE で開くことができるプログラムが入っています。

Arduino IDE から電子ペーパーデバイスを使えるようにする

ESP32-S3

この電子ペーパーはArduino製品ではなく、ESP32というマイコンを利用した製品のため、Arduino IDE で ESP32シリーズを使えるようにする設定が必要になります。

まずはweatherCrow5.7.inoをダブルクリックで開きます。

このファイルは weatherCrow5.7 フォルダ内にあります。

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キーを用意する

Weather API - OpenWeatherMap
Explore OpenWeather’s vast range of weather APIs including the versatile One Call API 3.0. Ideal for both beginners and professionals, our APIs offer current weather, minute-by-minute forecasts, historical data archives, and future predictions. Access weather data starting from 01-01-1979, global weather maps, solar irradiance predictions, air pollution data, and more. Our APIs support various formats like JSON, XML, and are ideal for middle-sized projects to enterprise-level solutions.

この天気予報ステーションでは https://openweathermap.org/ から提供されているOne Call API 3.0を元に表示を行っていますので利用登録を行います​。

APIとは

なんらかのサービスを提供することを意味します。
この天気予報ステーションではその気象データを提供している事が「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の利用方法などが入っていますので機能追加を考えている方は是非参考にしてみてください。

CrowPanel ESP32 E-Paper HMI 5.79-inch Display - Elecrow Wiki

フォント

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

MEMO

TTF(TrueType Font)やOTF(OpenType Font)などに代表される、現在一般的に利用されているフォントはベクターデータと呼ばれる曲線情報の組み合わせで形を定義したものが利用されています。しかし電子ペーパーで使うには少し大掛かりすぎるのであらかじめサイズを指定してビットマップとしてプログラム内に書き込んでいます。

デフォルトではPoppinsフォントを3サイズ用意しています。

アイコン

天気の状態や予報アイコンは洗練された見た目のWether-iconsを利用しています。デフォルトでは小さめと大きめのサイズを組み込んでいますが、同梱の変換ツールで画像の追加も簡単にできるようにしています。

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

カスタマイズする前に

カスタマイズする上のでトラブルはつきものです。基本的にソフトウェアの開発をするということは、作ってみてエラーが無いか確認することの繰り返しであると思って頂いてかまいません。

エラーメッセージはどのような問題が起きているかを教えてくれるものなので、しっかり見ていくのが基本になります。

カスタマイズする際は、細かく一つづつ変更と動作確認をしていきましょう。大きく変更するともし問題が合った場合に確認範囲が大きくなりすぎ、問題点を把握できなくなります。

そのためにテストコードってのがあってだな・・・

再起動を繰り返している

電子ペーパーが再起動を繰り返している場合は、何らかの致命的な問題が発生してしまったため連続して再起動を繰り返す場合があります。

その場合、エラー情報がシリアルモニターに表示されていることがありますが、ほとんどがコアダンプと呼ばれるほとんどの人類には理解できない内容しか表示されません。

シリアルモニター

そのため、再起動を繰り替えすような状態になってしまったら直前に行った修正や変更が影響していると考えるのが妥当なのでまずはその変更点を確認しましょう。

良くある原因
Arduinoは基本的にC++なので、コードで範囲外のメモリアクセスなどをしてしまうと致命的なエラーとして再起動ループに突入することが多いです。
  • 配列の範囲外の値を参照している
  • レイアウト変更したがはみ出している
  • 画像やフォントのサイズを変更した
  • 電源ケーブルを変更した(本当にたまにある)

コード変更したら動かなくなった

何か変更しビルドが通らなくなってしまった場合は、動いていたバージョンとの差分を確認しましょう。なんらかの変更点やスペルミスなどでもエラーとなります。

間違えて関数名の間にスペースを入れてしまった例

何もしてないのに壊れた

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

エラー画面

ケースやスタンド

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

STPファイルを開いた例

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

CrowPanel 5.79”-ESP32 E-paper Display 272*792 E-Paper HMI Screen Black/White with SPI Interface
With a resolution of 272*792, this 5.79-inch E Paper display uses ESP32-S3 as the main control. It has the features of a wide viewing angle, high contrast, ultra-low power consumption, and high reflectivity, can present clear images outdoors.

バッテリーで動作させる

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

電池かバッテリーか
動作電圧は 2.2v ~ 4.2v なので乾電池x2(3v)か、LiPo(3.7v)バッテリーで動作させることができます。

さすがに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 です。

E-paper Weather station - Weather Crow
Weather Crow is an ESP32-S3 based weather station featuring an E-paper display that shows current weather conditions and forecasts. This initial release provides a complete solution for monitoring local weather with minimal power consumption through efficient deep sleep cycles. the project is under the MIT license, so you can modify or chage as you want!!

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

記事の内容は間違いが無いように気をつけていますが、私の認識違いや、ミスなどにより間違っている可能性もあります。もし発見された場合はお問い合わせフォームよりご連絡頂けると幸いです。