Skip to content

Latest commit

 

History

History
228 lines (168 loc) · 16.3 KB

File metadata and controls

228 lines (168 loc) · 16.3 KB

M5WatchClicker

English version: README.md

手のひらに収まる M5WatchClicker。残り時間・現在時刻・終了予定時刻を一目で確認できる

M5Stack社のStopWatchを使ったプレゼンテーションリモコンです。

円形 AMOLED に残り時間を大きく表示しながら,スワイプでスライドを送り,残り時間が近づくと振動で知らせます。

発表中の困りごとは,たいてい2つ同時にやってきます。「あと何分だろう」と時計を探すこと,そして「次のスライドへ」とクリッカーを握り直すこと。どちらも一瞬ですが,聴衆から視線を外す一瞬です。手のひらに収まる1台でその両方を片づけてしまおう,というのがこのプロジェクトです。持ち替えも,机の上の時計を探すこともいりません。

PC 側の準備はいりません。標準の BLE キーボードとして認識されるので,ドライバもアプリも常駐ソフトも不要。ペアリングして,スライドショーを始めるだけです。

主な機能

  • スワイプでスライド送り — 画面を右になぞれば次へ、左で前へ。矢印キーを送っているので,PowerPoint / Keynote / Google スライド / PDF ビューアなどキーで動くものすべてで使えます(送信キーは変更可)
  • 見なくても分かる残り時間 — 外周の円弧が12時位置から時計回りに減っていきます。数字を読まなくても,残量が「面積」で目に入ります
  • 通知タイミングが色で見える — 残り区間は通知の位置で区切られ,緑 → 琥珀 → 赤と塗り分けられます。色の変わる位置が次の通知なので,「あと少しで合図が来る」が一目で分かります
  • 手のひらに届く合図 — 残り5分・1分などで振動。早い通知から短振動×1,×2……と回数が増え,時間切れは長振動。握っているだけで伝わり,音は立てないので聴衆に気づかれません
  • 持ち方が選べる — 手に握ったままでも,ストラップを通してもかまいません。背面の磁石を使えば胸ポケットの縁にバッジのように留められるので,手をふさがずに,視線を少し落とすだけで残り時間を確認できます
  • 終了予定時刻が出る — NOW 14:32 / END 15:02。残り時間より「何時に終わるか」の方が判断しやすい場面は多く,会場の時計と突き合わせられます
  • 経過と全体を1行で — ELAPSED 12:34 / 30:00。いま何分話したか,持ち時間は何分かが同時に分かります
  • 時間切れ後は超過をカウントアップ — 0で止まらず赤い数字で超過時間を表示。TIME UP と合わせて「何分オーバーしているか」がはっきり分かります
  • 本体だけで設定できる — プレゼン時間と通知タイミングを分:秒で編集し,本体に保存(電源を切っても保持)。外周をなぞるダイヤルは5分ちょうどで軽く引っかかって短く振動するので,15:00 のような値に画面を凝視せず合わせられます
  • 時刻は起動時だけ WiFi — 起動時に NTP で合わせて内蔵RTCへ保存し,すぐ WiFi を切ります。常時接続しないのでバッテリーに優しく,WiFi の無い会場でも時計は動き続けます
  • 省電力と見やすさの両立 — 無操作5秒で自動減光,触れば即復帰。卓上で光らせておきたいときは電球アイコンをタップすれば減光しません(USB をつなぐと自動でオン)。バッテリー残量は本体表示と PC の Bluetooth 設定の両方で確認できます

セットアップ

はじめて使うときの流れです。タイマーとスライド送りだけなら,書き込んでペアリングするだけで使えます(WiFi の設定は時計表示を使いたい場合のみ)。

1. ファームウェアを書き込む

M5Burner を起動し,StopWatch のカテゴリから M5WatchClicker を選んで Burn を押します。

書き込みモードへの入り方: 電源ボタンを約2秒長押しし,緑 LED が点灯したら ダウンロードモードです。この状態で書き込みを開始してください。

自分でビルドして書き込む場合は開発を参照してください。

2. PC とペアリングする

起動すると Bluetooth アイコンが点滅し,ペアリング待ち状態になります。 PC の Bluetooth 設定に表示される M5WatchClicker を選んで接続してください (アイコンが点滅から点灯に変われば接続完了)。一度ペアリングすれば,次回以降は 電源を入れるだけで自動再接続します。

標準のキーボードとして認識されるので,ドライバやアプリのインストールは不要です。 スライドショーを開始して画面を左右になぞれば,ページが動きます。

3. 持ち時間と通知を設定する

上下スワイプで設定画面を開きます(タイマー停止中のみ)。項目は上から TIME(持ち時間)/ ALERT 1 / ALERT 2(通知) の3つです。

  1. 変えたい項目をタップして選ぶ(両ボタン同時短押しでも移動できます)
  2. BtnA(−)/ BtnB(+) で調整。押し続けると刻みが 1秒 → 5秒 → 15秒 → 1分 → 5分 と上がります
  3. 大きく動かすときは外周をぐるりとなぞる(10秒刻み。5分ちょうどで軽く引っかかって振動します)
  4. 通知を使わないときは,その項目の右端にある ON/OFF ボタンをタップ
  5. 上下スワイプで保存してタイマー画面へ戻る

設定は本体に保存されるので,電源を切っても残ります。操作の詳細は設定画面を参照してください。

4. 時計を合わせる(任意)

NOW / END や日付の表示を使いたい場合は WiFi を設定します。タイマーとスライド送りだけなら設定は不要です。

  1. PC とシリアルで通信できる状態にしておきます(115200 baud。M5Burner のシリアルモニタや screen,CoolTerm など何でも構いません)
  2. BtnA を押しながら電源を入れます。画面に WiFi SETUP と表示されます
  3. コンソールに出る SSID> に SSID を入力して Enter,続いて PASSWORD> にパスワードを入力して Enter
  4. 保存されるとそのまま WiFi に接続し,NTP で取得した時刻を内蔵RTCへ書き込みます

入力内容は本体に保存されるので,次回以降は起動時に自動で同期します。設定をやめたいときは BtnB を押せば通常起動します。

同期できたかどうかは画面下の NTP / RTC 表示で分かります(→表示の意味)。

使い方

タイマー画面

一般的なストップウォッチと同じ操作感です。右ボタンで進め,左ボタンで消す。押し間違えて経過時間を失わないよう,リセットだけは長押しにしてあります。

操作 動作
右スワイプ 次のスライドへ
左スワイプ 前のスライドへ
BtnB(右) スタート / ストップ
BtnA(左)を長押し リセット(設定のプレゼン時間を再適用)
両ボタンを長押し リセット(同上)
上下スワイプ 設定画面へ(タイマー走行中は無効)
BtnB(時間切れ後) 超過時間のカウントを停止 / 再開

タイマー走行中に上下スワイプが効かないのは意図的です。ページ送りのつもりの縦方向の誤スワイプで,本番中に設定画面へ飛んでしまうのを防いでいます。

設定画面

上下スワイプで開きます。項目は プレゼン時間 / 通知1 / 通知2 の3つ。

操作 動作
BtnA / BtnB 値を減らす / 増やす(長押しで加速)
項目をタップ その項目を選択
両ボタンを同時に短押し 次の項目へ
外周を指でなぞる(ダイヤル) 時計回りで増,反時計回りで減
右端の ON/OFF ボタンをタップ / 両ボタン長押し 通知の有効・無効を切り替え
上下スワイプ 保存してタイマー画面へ戻る

値の編集に「桁」の概念はありません。 分:秒 で表示されますが,選ぶのは項目だけ。ボタンを押し続けると刻みが 1秒 → 5秒 → 15秒 → 1分 → 5分 と自動で上がり,1秒より大きい刻みでは切りのいい値にスナップします(例: 12:47 で +1分 → 13:00)。適用中の刻みは値の下に小さく表示されます。

大きく動かすときはダイヤル。 円形画面の外周をぐるりとなぞると値が変わり,一周が最大値(プレゼン時間は上限の90分,通知はプレゼン時間)に対応します。外周には現在値の円弧が出ます。動きは10秒刻みで,5分ちょうどに乗ると短い振動とともに一瞬引っかかります。物理のダイヤルのような手応えなので,15:00 のような値に画面を見ずに止められます。そのまま回し続ければ動き出します。1秒単位の微調整は物理ボタン側で行ってください。

画面中央部に [-] [+] のボタンは置いていません(指が触れて意図せず値が変わるのを避けるため,細かい増減は物理ボタンに寄せています)。また,項目枠の外側は広くダイヤルに割り当てられているので,保存して戻る上下スワイプは項目枠の上から行ってください。

設定の整合チェック: 「通知時刻がプレゼン時間以上」「通知2が通知1より早い」といった矛盾がある場合,該当項目が赤枠になり,直すまで設定画面から出られません。値を勝手に書き換えないので,自分が入力した値がそのまま残ります。

表示の意味

  • 円弧リング — 残り時間。12時位置から時計回りに減っていきます。 残り区間は通知タイミングで区切って色分けされます(緑 → 琥珀 → 赤)
  • NOW / END — 現在時刻と終了予定時刻(時刻を取得できていないときは非表示)
  • ELAPSED — 経過時間 / 設定したプレゼン時間
  • 上段の表示 — 開始前は日付,一時停止中は PAUSE,時間切れ後は TIME UP (走行中は何も表示されません)
  • 数字の色とリングの色 — 緑(通常)→ 琥珀(通知1通過)→ 赤(通知2通過)
  • 電池マーク — 緑,残量20%以下で赤。下に残量%を表示。 USB 給電中は雷マーク(⚡)が重なります
  • Bluetooth マーク — 点滅=ペアリング/接続待ち,点灯=接続中
  • WiFi マーク — 点滅=時刻同期中,点灯=同期済み,暗い=未設定, 暗い赤=同期に失敗(WiFi は同期後に切断します)
  • NTP / RTC(WiFi マークの右)— 時刻をどこから得ているかの表示。 NTP 点灯=起動時の同期に成功,RTC 点灯=内蔵RTCの時刻で動作中, 両方グレー=時刻を取得できていない(時計・日付は表示されません)
  • 電球マーク(Bluetooth マークの下)— タップで「減光しない」の切り替え。 点灯(黄)の間は画面が暗くなりません。USB をつなぐと自動で点灯,抜くと消灯に なりますが,そのあとタップすれば手動の選択が優先されます (給電中に消灯にして暗くすることもできます)

設定ファイル (data/config.json)

本体の設定画面で変更した内容は,このファイルとして本体の LittleFS に保存されます。 開発環境があれば pio run -t uploadfs でまとめて書き込むこともできます。

M5Burner で書き込んだ場合,最初はこのファイルがないため既定値で起動します。 持ち時間・通知は設定画面から,WiFi はシリアルコンソールから 設定でき,どちらも本体に保存されるので,このファイルを直接編集する必要はありません。

{
  "presentation_sec": 1800,
  "alerts": [
    { "before_sec": 300, "enabled": true },
    { "before_sec": 60,  "enabled": true }
  ],
  "swipe_keys": { "next": "RIGHT", "prev": "LEFT" },
  "brightness": 80,
  "dim_brightness": 10,
  "wifi": { "ssid": "", "password": "" },
  "ntp": { "server": "pool.ntp.org", "timezone": "JST-9" },
  "date_locale": "ja"
}
キー 説明
presentation_sec プレゼン持ち時間(秒)。10秒〜90分
alerts[].before_sec 残り何秒で振動通知するか。早い順に並べる
alerts[].enabled その通知の有効・無効
swipe_keys.next 右スワイプ(次へ)で送るキー。既定 RIGHT
swipe_keys.prev 左スワイプ(戻る)で送るキー。既定 LEFT
指定できるキー: RIGHT LEFT UP DOWN PAGE_UP PAGE_DOWN SPACE ENTER
brightness 通常時の画面輝度(%)
dim_brightness 無操作5秒後の減光輝度(%)
wifi.ssid / wifi.password 時刻同期に使う WiFi。空なら同期しません
ntp.server NTP サーバー(既定 pool.ntp.org)
ntp.timezone POSIX TZ 形式のタイムゾーン(既定 JST-9)
date_locale 日付表示の言語。ja(既定)=2026/07/29(水) / en=2026-07-29 (Wed)

alerts は3件以上に増やせます。振動回数は早い通知から順に短振動×1,×2,×3……, 時間切れは長振動×(通知数+1)が自動で割り当てられます。

ファイルが無い・壊れている場合は既定値(30分 / 5分前 / 1分前)で自動復旧します。

時刻合わせ(WiFi / NTP)

WiFi は起動時だけ接続し,NTP で取得した時刻を内蔵RTCに書き込んでから切断 します(常時接続しないのでバッテリーへの影響は起動時のみ)。以降は RTC の時刻で 時計表示が動くため,WiFi の無い会場でも表示は継続します。

パスワードを config.json に平文で置きたくない場合は,BtnA を押しながら起動 してください。画面に WiFi SETUP と出て,シリアルコンソール(115200 baud)から SSID とパスワードを入力できます。入力内容は本体側の config.json に保存されます。

pio device monitor    # 別ターミナルで開いた状態で BtnA + 電源投入

⚠️ リポジトリに含まれる data/config.json の wifi は空にしてあります。 ここに自分の資格情報を書いた場合,git commit しないよう注意してください。

開発

自分でビルドする場合の手順です。PlatformIO を使います。

共通のボード設定を submodule (config/) から取り込んでいるため,--recursive 付きで clone してください。

git clone --recursive https://github.com/3110/M5WatchClicker.git
cd M5WatchClicker

--recursive を忘れて clone した場合は,次のコマンドで取得できます。

git submodule update --init --recursive
pio run                  # ビルド
pio run -t upload        # ファームウェア書き込み
pio run -t uploadfs      # data/config.json を LittleFS へ書き込み
pio device monitor       # シリアルモニタ (115200)
./tests/run_tests.sh     # ホストテスト(PC 上でロジックを検証)

書き込みモードへの入り方: 電源ボタンを約2秒長押しし,緑 LED が点灯したら ダウンロードモードです。この状態で upload を実行してください。

タイマー・入力判定・通知のロジックは M5Unified をモックして PC 上で単体テストできます(24シナリオ)。GitHub Actions では,このテストとファームウェアのビルドが毎プッシュで走ります。