はじめに
試験勉強でモチベーションが上がらず集中力が続かないという子供のために学習タイマーを作成してみました。試験時間に合わせて勉強時間を設定し休憩をはさむなどタイマーで時間管理を行って学習に集中できれば良いですね。沢山の市販品もありますが「作る意味あるの?」「買ったほうが安い!」は無しでお願いします。
今回の記事以外にプロトペディアのサイトにも登録しています。本記事とは異なった目線で内容を書いていますのでよろしければこちらも覗いてみて下さい。本作品でDigiKey Make ONE Challenge 2026に応募してみました。
ハードウェア構成
メインマイコンにArduino Uno Mini LEを使用してプロトタイプ製作の見方Groveモジュールを使用して構成しています。
システムイメージ図に記載しているSeeed社が発売しているGroveモジュールを使用しています。これらのGroveモジュールのうちでGPSモジュールはDigiKeyでは取り扱い終了しているようですが、DigiKeyのmylistに部品リストを登録していますので品番などを参考にして頂き、ご興味ありましたら購入して手元に持っておくと、いざという時に使い道があるかもしれませんよ。

学習タイマーの心臓部、Uno Mini LEはGroveコネクタを備えておらず直接Groveモジュールを接続する事ができないのでUno Mini LEのコネクタに接続して使用するオリジナルのシールド基板を作成しました。下の写真のように8個のGroveコネクタを実装できる基板です.

この基板に1.27㎜ピッチのピンヘッダとGroveコネクタ(HY2.0-4P)を半田付けします。1.27㎜ピッチは意外と端子間隔が狭いので横の端子とのショートが気になりますが、上の写真のように、半田付けランドパターンを細長い形状にしておけば、半田付けが容易で、かつ、隣接する端子とのショートも避けることができます。
なお、今回の学習タイマーではGroveモジュールを5V駆動で使用していますが、何か別の用途に使う場合ことができるように、ジャンパで3.3V駆動との切り替えができるようにしてみました。
内部実態写真
3Dプリントで作製した筐体の内側側面にGroveモジュールをタッピングネジでねじ止めしています。Groveモジュールのサイズは20㎜角や20×40㎜といったサイズで大きいものでは無いのですが、手のひらサイズの筐体に収めるにはそれなりの大きさが必要となっており、内部はケーブルの配線もあり結構パンパンです。

ソフトウェア構成
今回のプログラムはMicrosoftのCopilotを使って作成しました。Seeed社のGroveシステムはWEBサイトやGithubに公開されているサンプルプログラムが充実しているおかげて、AIへは比較的簡単な指示で生成することができました。ちなみに、上の「接続イメージ図」もCopilotで生成していて、下のフローチャートもCopilotで生成しています。完成したプログラムを読み込ませて生成させていますが、間違えた出力がされているかもしれませんよ(笑)
モノづくり好きにとっては、自分で作製した達成感が少なく味気ない気もしますが、ちょっとしたドキュメント類はAI生成で十分かもしれません。AIが進化すると本当に人間の介在する作業がなくなってくるのかもしれませんね。ただし、AIが生成した成果物が正しいのか、間違えているのかを見極める力量・判断能力はこれからも必要となりますよね。AIは便利な反面ネガティブな考え方をすると、自分が理解できないものを鵜呑みにして使用してしまうと、こっそりとトラップを仕掛けられていることに気が付かず大変なことになるかもしれません。
プログラム全体の長さはコメント文が少し入った状態で1200行ぐらいのプログラムになっています。具体的な完全版Arduino SketchはGitHubにアップしていますのでこちらをご参照下さい。
メインループ
キー入力の状態変化を検出 → 長押し or 短押しを判定 → モードごとの処理を実行
- キーの状態を読む
- 押した瞬間を検出して記録
- 押し続けている間は 2 秒を超えたら長押し処理
- 離した瞬間は短押し処理(2 秒未満の場合)
- 最後にモードごとの処理を実行して画面やLEDを更新
flowchart TD L_START([loop 開始]) --> L_READ L_READ[メカニカルキー読み取り] --> L_EDGE %% 押した瞬間 L_EDGE[押下状態の変化] -->|押した| L_PRESS_START L_EDGE -->|変化なし| L_PRESS_HOLD L_PRESS_START[押した瞬間 pressTime記録 longPressHandled=false] --> L_NEXT %% 押し続け L_PRESS_HOLD --> L_HOLDCHK L_HOLDCHK[押し続けか] -->|YES| L_HOLDTIME L_HOLDCHK -->|NO| L_RELEASECHK L_HOLDTIME[長押し時間計算] --> L_LONG L_LONG[2秒以上か] -->|YES| L_MODECHANGE L_LONG -->|NO| L_NEXT L_MODECHANGE[モード切替 LED更新 ビープ] --> L_NEXT %% 離した瞬間 L_RELEASECHK[離したか] -->|YES| L_RELEASE L_RELEASECHK -->|NO| L_NEXT L_RELEASE[離した瞬間処理] --> L_SHORTCHK L_SHORTCHK[短押しか] -->|YES| L_SHORTPRESS L_SHORTCHK -->|NO| L_NEXT %% 短押し処理(モード別) L_SHORTPRESS --> L_MODEBRANCH L_MODEBRANCH[現在のモード判定] -->|CLOCK| L_CLOCK_SHORT L_MODEBRANCH -->|STOPWATCH| L_SW_SHORT L_MODEBRANCH -->|TIMER| L_TM_SHORT L_CLOCK_SHORT[時計モード短押し処理] --> L_NEXT L_SW_SHORT[ストップウォッチ短押し処理] --> L_NEXT L_TM_SHORT[タイマー短押し処理] --> L_NEXT %% モード別処理 L_NEXT --> L_MODELOOP L_MODELOOP[モード別処理へ] -->|CLOCK| L_CLOCK L_MODELOOP -->|STOPWATCH| L_SW L_MODELOOP -->|TIMER| L_TM L_CLOCK[loopClockMode 実行] --> L_START L_SW[loopStopwatchMode 実行] --> L_START L_TM[loopTimerMode 実行] --> L_START
クロックモード
時刻を更新 → 表示を更新 → 必要なら情報サイクル → 必要なら設定モード処理
- GPS/RTC から時刻を読む
- 短押しがあれば情報サイクルを進める
- 現在の情報状態に応じて表示を描画する
- 長押しがあれば時刻設定モードへ入る
- 設定モード中は専用 UI を処理する
- ループに戻って繰り返す
フローチャート
flowchart TD C_START([CLOCK MODE 開始]) --> C_READ C_READ[5方向スイッチ読み取り] --> C_MUTE C_MUTE[ミュート長押し判定] --> C_CENTER %% CENTER 判定 C_CENTER[CENTER シングル/ダブル判定] --> C_DBL C_CENTER --> C_SGL C_DBL[ダブルクリック?] -->|YES| C_SET_START C_DBL -->|NO| C_SGL C_SGL[シングルクリック?] -->|YES| C_INFO_START C_SGL -->|NO| C_MAIN %% 設定モード C_SET_START[設定モード開始] --> C_SET C_SET[設定モード] --> C_PAGE_MOVE C_PAGE_MOVE[LEFT/RIGHT ダブル→ページ移動] --> C_CURSOR C_CURSOR[LEFT/RIGHT 短押し→桁移動] --> C_EDIT C_EDIT[UP/DOWN→数値変更] --> C_SET_DONE C_SET_DONE[CENTER→設定完了] --> C_MAIN %% 情報サイクル C_INFO_START[情報サイクル開始] --> C_INFO C_INFO[年→月日→曜日] --> C_MAIN %% 通常時計表示 C_MAIN[GPS/RTC 同期→HH:MM or MM:SS 表示] --> C_START
タイマーモード
入力処理 → 設定中か実行中か停止中かを判断 → 表示更新 → 終了判定
1.現在の状態(SETTING / RUNNING / STOPPED / END)を確認
2.5‑way 入力を読み取る(150ms クールダウン)
3.SETTING
- 桁移動・数字変更
- ダブルクリックで MM:SS ↔ HH:MM
- CENTER で RUNNING
4.RUNNING
- 1 秒ごとに残り時間を減らす
- 0 になったら END
5.STOPPED
- メカニカルキー短押しで再開
6.END
- 白高速点滅
- メカニカルキー短押しでリセットして SETTING
7.状態に応じた LED/表示を更新してループ終了
フローチャート
flowchart TD TM_START([タイマー開始]) --> TM_READ TM_READ[5方向スイッチ読み取り] --> TM_MUTE TM_MUTE[ミュート長押し判定] --> TM_SETTING %% 設定モード TM_SETTING[設定モードか] -->|YES| TM_LED TM_SETTING -->|NO| TM_RUN TM_LED[LED青点滅] --> TM_CURSOR TM_CURSOR[左右でカーソル移動] --> TM_EDIT TM_EDIT[上下で数値変更] --> TM_CLAMP TM_CLAMP[MM:SSクランプ] --> TM_BLINK TM_BLINK[桁点滅表示] --> TM_SET_DONE TM_SET_DONE[CENTER短押し] -->|YES| TM_APPLY TM_SET_DONE -->|NO| TM_END TM_APPLY[設定完了 残り時間再構築 LED青] --> TM_END %% 動作モード TM_RUN[動作中か] -->|YES| TM_DEC TM_RUN -->|NO| TM_STOPPED TM_DEC[残り時間減算] --> TM_ZERO TM_ZERO[残り時間ゼロか] -->|YES| TM_FINISH TM_ZERO -->|NO| TM_SHOW TM_FINISH[終了状態 LED高速点滅 ビープ3回] --> TM_END TM_SHOW[残り時間表示] --> TM_END %% 停止モード TM_STOPPED[終了状態か] -->|YES| TM_FIN_BLINK TM_STOPPED -->|NO| TM_IDLE TM_FIN_BLINK[終了点滅表示] --> TM_END TM_IDLE[待機 LED青] --> TM_END TM_END([END])
ストップウォッチモード
入力処理 → 経過時間の更新 → 表示更新 → 上限判定
- 状態(STOPPED / RUNNING / LIMIT_BLINK)を確認
- キー入力を処理(短押し・長押し)
- RUNNING 中は millis() から経過時間を計算
- 99:59 を超えたら LIMIT_BLINK へ
- STOPPED は白固定表示
- LIMIT_BLINK は緑点滅
- 状態に応じて表示を更新してループ終了
フローチャート
flowchart TD SW_START([ストップウォッチ開始]) --> SW_READ SW_READ[5方向スイッチ読み取り] --> SW_MUTE SW_MUTE[ミュート長押し判定] --> SW_TIME SW_TIME[経過時間計算] --> SW_LIMIT SW_LIMIT[99分59秒に到達したか] -->|YES| SW_LIMIT_HIT SW_LIMIT -->|NO| SW_NORMAL SW_LIMIT_HIT[上限到達 停止 LED緑 ビープ3回 点滅開始] --> SW_END SW_NORMAL[通常表示処理] --> SW_BLINK SW_BLINK[上限点滅中か] -->|YES| SW_BLINKING SW_BLINK -->|NO| SW_SHOW SW_BLINKING[500ms点滅表示] --> SW_END SW_SHOW[時間表示] --> SW_END SW_END([END])
基本操作方法
学習タイマーに実装した機能をボタンや方向キーの操作と合わせてマニュアル的に列記してみました。
モード切替
- メカニカルキー長押し(2 秒) → CLOCK → STOPWATCH → TIMER → CLOCK … と循環
- モード切替時は LED が 落ち着いた緑 に変化し、状態がわかるようになっています。
表示色の意味
- 白:動作中(時計表示・計測中・カウント中)
- 青:タイマー MM:SS 設定
- 橙:タイマー HH:MM 設定
- 緑:ストップウォッチ上限到達(99:59)
CLOCK モード(時計)
5-Wayキー 短押し
表示情報を切り替えます。
- 通常表示(HH:MM)
- 年(YYYY)
- 月日(MM/DD)
- 曜日(MON/TUE…) 一定時間で自動的に通常表示へ戻ります。
5-Wayキー 長押し(2 秒)
時刻設定モードへ入ります。
時刻設定モード
- LEFT / RIGHT:桁移動
- UP / DOWN:数字変更
- CENTER:設定完了
- 選択中の桁は点滅します。
STOPWATCH モード(ストップウォッチ)
メカニカルキー(短押し)
- 停止中 → 計測開始
- 計測中 → 停止
メカニカルキー(1 秒長押し)
- リセット(00:00)
メカニカルキー(2 秒長押し)
- CLOCK モードへ戻る
特殊動作
- 99:59 に到達すると
- 計測停止
- 表示が 緑点滅
- LED も緑
- CENTER 短押しで停止状態へ戻る
- CENTER 長押しでリセット
TIMER モード(タイマー)
状態一覧
- SETTING(時間設定)
- RUNNING(カウント中)
- STOPPED(一時停止)
- END(終了 → 白高速点滅)
SETTING(時間設定)
操作
- UP / DOWN:数字変更
- LEFT / RIGHT:桁移動
- CENTER(短押し):設定完了 → RUNNING
表示
- 選択中の桁が 青/橙でゆっくり点滅
サウンド仕様(ブザー)
- ミュート切替時: → 3 段階 × 3 ビープ(固定パターン)
- タイマー終了時: → 白高速点滅 + 3 段 × 3 ビープ
LED の色と点滅まとめ
| 状態 | 色 | 点滅 |
|---|---|---|
| CLOCK 通常 | 落ち着いた緑 | なし |
| STOPWATCH RUNNING | 白 | なし |
| STOPWATCH LIMIT | 緑 | ゆっくり点滅 |
| TIMER SETTING | 青/橙 | ゆっくり点滅 |
| TIMER RUNNING | 白 | なし |
| TIMER STOPPED | 青/橙 | なし |
| TIMER END | 白 | 高速点滅 |
おわりに
7セグメント、LED付きメカニカルキー、5-way Switchを使用することで「見やすい表示」「直感的な操作」「色と点滅による状態把握」を出来るだけ重視して設計しています。
ハードウェアはGroveモジュールを使用することで手っ取り早く作成することができ、ソフトウェアはAIの力で手っ取り早く作成できる世の中になりましたね。AI コーディングに頼り切ってはいけないですが、1つの道具として便利に活用していきたいと思います。


コメント