miyoshitan’s blog

岐阜発。自動車サービス現場とPython・Flask・Raspberry Pi・M5Stackの実践記録。

AI・IoT・個人開発の実験ログと考察をまとめる技術ブログ

M5Cardputerを活用した実用的なタイマー開発

M5Cardputerでタイマーを自作してみた

M5Cardputerを使ってシンプルなカウントダウンタイマーをArduino環境で自作した。キーボード入力による直感的な操作に加え、音による通知やバッテリー表示も備えた実用的な構成。単体で完結するコンパクトさが魅力で、作業用タイマーやポモドーロ用途にも使える。さらにWi-Fiやセンサーを活用すれば、より実用性の高いガジェットへ発展させられる余地もある。

使用した環境

使用デバイス

使用したのはM5Cardputer本体のみ。ディスプレイ、キーボード、スピーカーが一体化されているため、追加パーツなしで完結するのが特徴。コンパクトで持ち運びしやすく、日常的に使えるガジェットとしても優秀。加えてWi-Fi機能や拡張性も備えており、単なるタイマーに留まらない応用が期待できる。

開発環境(Arduino / UIFlowなど)

開発にはArduino IDEを使用。M5Cardputerライブラリを導入することで、ディスプレイ描画やキーボード入力、スピーカー制御をシンプルに扱える。C++ベースで細かい挙動まで制御できるため、自由度が高く拡張もしやすい。Wi-Fi連携や外部サービスとの接続なども視野に入れた開発が可能。

作ったものの概要

タイマーの基本機能

時・分・秒を自由に設定できるカウントダウンタイマーを実装。時間がゼロになるとブザーで通知し、操作によって停止できる。1秒単位で正確に動作し、状態も画面に表示されるためシンプルながら実用的。今後は外部通知やログ機能と組み合わせることで、さらに活用の幅が広がる。

操作方法(キーボード操作)

キーボード主体の操作設計で、数字入力・カーソル移動・スタート停止・音量調整をすべて完結。マウスやタッチ操作が不要なため、直感的かつスピーディに扱える。物理キーならではの操作感があり、作業中でもストレスなく使える点が強み。

実装した機能一覧

時・分・秒の入力と編集

入力位置を切り替えながら数値を追加していく方式を採用。各値には上限を設けており、誤入力でも破綻しない設計。点滅表示によって現在の入力位置を明確にし、視認性と操作性を両立している。

カウントダウン処理

millis()を利用して1秒ごとに処理を実行。秒・分・時の順に繰り下げることで、軽量かつ安定した動作を実現している。Arduinoらしいシンプルなロジックで構成されているため、理解しやすい。

スタート・ストップ制御

runningフラグで状態を管理し、シンプルに制御。スタート・停止の切り替えに加え、リセット処理もスムーズに行える。拡張しやすい構造を意識した設計。

ブザー通知機能

タイマー終了時に一定間隔で音を鳴らし、ユーザーに確実に通知。Enterキーで停止できるため、扱いやすい。将来的には通知方法を増やすことで、さらに実用性が高まる。

音量調整機能

キーボード操作で音量をリアルタイムに変更可能。環境に応じて柔軟に調整できるため、静かな場所でも屋外でも使いやすい。

点滅カーソル表示

入力位置を点滅させることで、現在の編集対象を明確に表示。シンプルながら効果的なUI表現で、誤操作を防ぐ役割も果たしている。

バッテリー残量表示

残量に応じて色が変化するバッテリー表示を実装。視覚的に状態を把握できるため、外出先でも安心して使用できる。モバイル用途を意識した実装。

コード全体

cpp
#include <M5Cardputer.h> int hours = 0; int minutes = 0; int seconds = 0; enum Position { HH, MM, SEC }; Position currentPos = HH; bool running = false; unsigned long lastUpdate = 0; bool buzzer = false; unsigned long buzzerLast = 0; int volume = 255; bool blink = false; unsigned long blinkLast = 0; void setup() { M5Cardputer.begin(); M5Cardputer.Display.setTextSize(4); M5Cardputer.Speaker.setVolume(volume); updateDisplay(); } void loop() { M5Cardputer.update(); if (M5Cardputer.Keyboard.isChange()) { Keyboard_Class::KeysState status = M5Cardputer.Keyboard.keysState(); handleKey(status); } if (running && millis() - lastUpdate >= 1000) { lastUpdate = millis(); countdown(); } if (buzzer && millis() - buzzerLast > 200) { M5Cardputer.Speaker.tone(1000, 100); buzzerLast = millis(); } if (millis() - blinkLast > 500) { blink = !blink; blinkLast = millis(); updateDisplay(); } }

コード解説

グローバル変数の役割

時間、状態、表示制御を分かりやすく分離して管理。フラグによる状態制御で処理の流れを明確にしている。拡張時にも扱いやすい構造。

setup関数の初期化処理

デバイス初期化と基本設定を実施。起動直後から使えるシンプルな設計。

loop関数のメイン処理

入力・更新・表示を並列的に処理。delayを使わずmillis()で制御することで滑らかな動作を実現している。

キー入力処理(handleKey)

キーごとに役割を割り当て、直感的に操作できる設計。機能追加もしやすい構造。

カウントダウン処理(countdown)

軽量な条件分岐のみで構成されており、安定性が高い。

リセット処理(resetTimer)

状態と出力を確実に初期化し、安全に再利用できる。

画面描画処理(updateDisplay)

表示内容を一括管理し、UIの統一性を確保。変更にも強い設計。

工夫したポイント

キーボード操作の割り当て設計

物理キーの利点を活かし、最小操作で完結する設計にしている。

視認性を上げるUI(点滅・色分け)

限られた画面でも情報が伝わるよう工夫。

シンプルな状態管理

拡張しやすくバグが出にくい構造を意識。

使ってみた感想

実用性について

シンプルながら日常使いできる完成度。キーボード操作の快適さが特に強い。

改善したい点

Wi-Fiやセンサーを活用すれば、通知の強化や自動化などさらに便利にできる余地がある。例えばスマホ通知や環境に応じた動作変更など、単なるタイマー以上の使い方が見えてくる。

今後の拡張アイデア

プリセットタイマー機能

ワンタッチで時間設定できる機能を追加。

アラーム音の変更

用途に応じた通知音の切り替え。

UIの強化(アイコン・バー表示など)

より直感的な表示へ進化。

Wi-Fi連携や通知機能

ネットワーク経由で通知や連携を行い、IoTデバイスとして活用。

まとめ

M5CardputerとArduinoを使えば、コンパクトで実用的なタイマーを簡単に自作できる。シンプルな構成でも十分に使える一方で、Wi-Fiや各種機能を組み合わせればさらに価値の高いデバイスへ発展可能。ガジェット開発の入り口としても、実用ツールとしても楽しめる題材となる。