非接触ハンドウォッシュタイマー:音楽アラート付きで20秒を楽しく
部品と材料
| 部品名 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| ProtoStax Arduino用エンクロージャー | 1 | |
| ProtoStax ブレッドボード/カスタムボード用エンクロージャー | 1 | |
| ProtoStax 水平スタッキングキット | 1 | |
| 超音波距離センサー HC-SR04 | 1 | |
| ProtoStax HC-SR04用キット | 1 | |
| Adafruit 0.56インチ 4桁7セグメントディスプレイ I2Cバックパック付き(青) | 1 | |
| Adafruit ピエゾブザー PS1240 | 1 | |
| ハンダレスブレッドボード ハーフサイズ | 1 |
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
手洗いは感染症予防の基本ですが、COVID-19パンデミック以降、その重要性が一層高まりました。CDC(米国疾病予防管理センター)のガイドラインでは、石鹸で最低20秒間こすり洗いすることが推奨されています。
この「非接触ミュージカルハンドウォッシュタイマー」は、超音波センサーに手をかざすと起動し、7セグメントディスプレイでカウントダウンを表示しながら、20秒間のジングルを再生します。プリロードされた4曲(ハッピーバースデー、ドレミの歌、We Will Rock You、ジェパディテーマ)が順番に流れ、飽きずに手洗いを続けられます。楽譜があれば独自の曲も簡単に追加可能です。

ステップ1:回路図
Arduino Uno、I2C接続の7セグメントLEDバックパック、HC-SR04超音波センサー、ピエゾブザーを使用します。上図の回路図を参照してください。
ステップ2:企画とセットアップ
動作確認だけでなく「完成品として使いやすくする」ことを意識し、ProtoStaxのスタッカブルエンクロージャーで筐体化しました。Arduino用とブレッドボード用のベースを水平スタッキングコネクターで連結し、プロトタイピングプラットフォームを構築。超音波センサーは側面壁に取り付け、筐体完成後も外部からアクセスできるようにしました。


ステップ3:プログラミングとテスト
プロトタイプが完成したらコード開発へ。動作テストの動画では、iPhone 11が超音波センサーの「カチカチ」という動作音まで拾っていました。全機能確認後、側面パネルとトップカバーを取り付けて筐体を完成させました。


コードの理解
コンポーネントの初期化
Adafruit_7segmentクラス(LEDバックパックライブラリ)で7セグメントディスプレイを初期化。HC-SR04のTrigピンを出力、Echoピンを入力に設定。
Adafruit_7segment matrix = Adafruit_7segment();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
matrix.begin(0x70);
メインループの概要
- 超音波センサーの距離読み取りで起動を判定
- 起動したら現在時刻を記録し、カウントダウン(20秒)を初期化、次のジングルを選択(ラウンドロビン方式)
if (distance < 10 && !startMusic) {
startMusic = 1;
countDown = 20;
currentTime = millis();
melodyNum = (melodyNum + 1) % NUM_MELODIES;
}
delay()を使わない同時処理
カウントダウン表示の更新とジングル再生を同時に行うため、delay()は使いません。tone()関数は非ブロッキング(Timer2を使用)なので、音が鳴っている間も他の処理が可能です。millis()で経過時間を管理し、カウントダウン表示を更新しながら次の音符へ進みます。
楽譜からの簡単な音楽データ化
音符と長さを別配列で持つ従来方式ではなく、音符と相対的な長さをセットにした構造体を定義。全音符を1として、2分音符=0.5、4分音符=0.25、8分音符=0.125…とマクロで定義し、付点音符はDOTTED(X) = X * 1.5で表現します。
typedef struct Note { int frequency; float duration; } Note;
#define NOTE_WHOLE 1
#define NOTE_HALF 0.5f
#define NOTE_QUARTER 0.25f
#define NOTE_EIGHTH 0.125f
#define NOTE_SIXTEENTH 0.0625f
#define DOTTED(X) (X * 1.5f)
例えば「ハッピーバースデー」は以下のようにほぼ音符通りに記述できます。楽譜が読めなくても、音名さえわかれば移植可能です。
Note melody[] = {
{NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH},
{NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER},
{NOTE_C7, NOTE_QUARTER}, {NOTE_B6, NOTE_HALF},
// ... 以下同様
};
メロディ構造体には音符配列、音符数、全音符の実ミリ秒長を含めます。
typedef struct Melody {
Note *notes;
int numNotes;
int wholeNoteDurationMs;
} Melody;
ループ内では、選択されたメロディの音符を順に再生しつつ、millis()でカウントダウンを並行更新。20秒経過後も曲が終わるまで再生し、曲が短ければ繰り返して20秒以上再生します。
プロジェクトの発展アイデア
- お気に入りの曲を上記マクロで移植・追加(メモリ節約のため既存曲をコメントアウトするか、PROGMEM化)
- メロディデータをSRAMからFlash(PROGMEM)へ移動。Arduino UnoはSRAM 2KB、Flash 32KB。PROGMEM化で動的メモリ使用量を76%→22%に削減可能、大量の曲を格納できる
他にもアイデアがあれば共有してください。Happy Making!
コード
ProtoStax 非接触ミュージカルハンドウォッシュタイマー デモ
GitHubリポジトリから全コードを取得できます。
回路図

製造プロセス
- 手洗いステーション点検の実証済みベストプラクティス
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- ウォッチドッグタイマーを理解する:マイコンのハングアップを防ぐ仕組み
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー