M5Paper S3で電子ペーパー時計を作ってみた

ESP32

M5Paper S3 を使って、シンプルな電子ペーパー時計を作ってみました。
日時を表示して1分ごとに画面を更新するだけの単純な時計ですが、DeepSleep を使わない版DeepSleep を使う版の2種類を作っています。

DeepSleep…マイコンのほとんどの機能を停止することで待機時間中の電力消費を抑える。起き上がるトリガーは時間か、外部入力などで行う。起きた時はSetupから開始され変数の値も大部分がリセットされるので、変数管理が複雑になる。

今回作った時計の仕様

表示内容

  • 日付(年・月・日・曜日)
  • 時刻(時・分)
  • バッテリ残量(右下、100%表示)

画面更新:1分ごと

時刻取得:内蔵クロック。DeepSleep時はRTCも使用

時刻同期:Wi-Fi接続してNTPから取得、初回起動時と一時間ごと(00分)に同期する。

DeepSleepなし版(常時起動)

このプログラムは、M5Paper S3 を常時起動させたまま、1分ごとに画面を更新する時計です。
DeepSleep は使わず、loop() で画面更新まで待機する構成になっています。

プログラム全体の流れ

  1. 起動時に M5Paper S3 を初期化
  2. NTPで内蔵クロックを実時間に同期する
  3. 以下loop()処理
  4. 分が変わったら画面を更新
  5. 時が変わったタイミングで NTP 同期と画面のリフレッシュ
  6. 以後これを繰り返す

プログラム本体

※”YOUR WIFI SSID NAME” “YOUR WIFI PASSWORD” は自宅のWi-Fiに合わせて書き換える必要があります。
参考:https://docs.m5stack.com/ja/arduino/m5paper/rtc

この方式のメリット・デメリット

〇動作が安定しやすい
〇状態管理がシンプル
〇画面更新がスムーズ

×消費電力が大きい

DeepSleepあり版(更新時以外は低消費電力)

このプログラムは、M5Paper S3 の画面を更新したらDeepSleepに入り、1分ごとにDeepSleepから復帰し、画面を更新する時計です。
DeepSleep からの復帰=毎回リセットに近い状態になるため、RTCに保存されている時間から内蔵時計の時間を復元しています。

プログラム全体の流れ

  1. 起床(リセット or DeepSleep復帰)
  2. 起床理由を判定
  3. RTC → 内蔵時計へ時刻コピー
  4. 必要なら NTP 同期(初回起動時と時が変わったタイミング)
  5. 画面描画
  6. 次の1分まで DeepSleep

loop() は一切使わず、setup() が1分に1回だけ実行される構成です。

プログラム本体

※”YOUR WIFI SSID NAME” “YOUR WIFI PASSWORD” は自宅のWi-Fiに合わせて書き換える必要があります。

この方式のメリット・デメリット

〇消費電力が少ない(電子ペーパーなのでDeepSleep時も表示が消えない)
〇電池での長時間駆動ができるので時計の運用として実用的

×画面更新時に画面が点滅する(電子ペーパーの特性)
×実装が複雑(DeepSleep復帰時の変数の保管・復元が必要)
×時間管理が複雑(RTCと内蔵時計の同期、タイムゾーンの扱いが必要)

ちなみに約24時間経過でバッテリ残量が100%→89%になったので、1週間超は充電なしで持ちそうです。NTPの同期間隔を長くすれば(例えば1日に一度とか)、もっと消費電力を抑えられそうです。

Wi-Fiがつながらなかった時の対策版

作った後で気づいたのですが、Wi-Fiがつながらなかった場合、つながるまで延々と待機状態になってしまう仕様になっていました。そのため、Wi-Fiがつながらなかった場合、またはNTPの同期に失敗した場合にはRTCの値をそのまま使い続ける仕様に改良します。また、つながらなかった場合は「!」のアイコンを右上に表示して分かるようにします。

Wi-Fi接続失敗時の表示

コメント

タイトルとURLをコピーしました