タッチレスミュージカル手洗いタイマー
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 |
アプリとオンラインサービス
> ![]() |
|
このプロジェクトについて
手洗いは、病気の予防と全体的な健康において常に重要な武器でしたが、COVID-19パンデミックの蔓延を抑えるための予防策として新たな注目を集めました。
手洗いを適切に行うためのCDCガイドラインでは、理想的には20秒間手をこすり洗いする必要があるとされています。 https://www.cdc.gov/handwashing/when-how-handwashing.html
🤓📚 **追加のもの** 🤓📚興味があれば、手洗いの背後にある科学のいくつかを紹介します! -https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html
このハンドウォッシュタイマーのリダックスでは、超音波センサーの前で手を振ることでミュージカルハンドウォッシュタイマーが作動し、7セグメントディスプレイにカウントダウンが表示されます。さらに面白くするために、事前にプログラムされたジングルのリストから20秒のジングルを順番に選択して再生します。お持ちの楽譜を書き写すことで、自分の音楽を簡単に追加できます!
タッチレスミュージカルをご覧ください。 手洗いタイマー 動作中、私がプログラムした4つのジングルすべてを表示
- お誕生日おめでとう
- Do-Re-Mi(サウンドオブミュージック)
- ウィ・ウィル・ロック・ユー(クイーン)
- ジェパディのテーマ音楽
少年、私の手は super-duper それの終わりまでにきれいに! 😊
🤓📚 **追加のもの** 🤓📚今では、「ハッピーバースデートゥーユー」を2回歌うのに、約20秒かかることは誰もが知っています。これは、カナダのジャスティントルドー首相によってさえ歌われる、手洗いのタイミングの事実上の標準になっています。カナダの公衆衛生局長であるテレサタム博士は、 私たちはあなたを洗いますのような彼女自身のお気に入りを持っています ! 😊CBCキッズニュースの寄稿者であるArjunRamによるこの魅力的なインタビューを以下でご覧ください。
タッチレスミュージカル手洗いタイマーで両方の曲を特集しています 、さらにいくつか! 😊
ステップ1-回路図
このプロジェクトでは、Arduino Uno、7セグメントLEDバックパック(I2C)、HC-SR04超音波センサーおよびピエゾブザーを使用します。以下の回路図を参照してください。
<図>
ステップ2-計画と設定
回路図面とプログラミングだけでなく、「完成品」とそれを使用可能にする方法についても考えたかったので、それをエンクロージャーに入れて計画しました。
私はProtoStaxEnclosuresを使用しました-それらは積み重ね可能で、Arduino、Raspberry Pi、Breadboardをサポートしています。ブレッドボード回路を備えたArduinoを使用したので、ArduinoにはProtoStax Enclosureを、ブレッドボード/カスタムボードにはProtoStaxEnclosureを選択しました。また、超音波センサーに外部からアクセスできるようにして、エンクロージャーに固定したかったのです。超音波センサーHC-SR04用のProtoStaxキットを使用しました。
プロトタイプ作成を容易にするために、水平スタッキングコネクタを使用してArduinoおよびBreadboardベースプラットフォームを水平スタッキングすることから始めました。
<図>
プロトタイピングプラットフォームを入手したら、回路図に従ってコンポーネントの作成を開始できます。 HC-SR04超音波センサーをProtoStaxKit for Ultrasonic Sensor HC-SR04の側壁に取り付けて、プロトタイプの完成後にエンクロージャーを組み立てたらアクセスできるようにしました。図のように、センサーのある側壁がベースプラットフォームのスロットに入ります。
<図>

ステップ3-プログラミングとテスト
実用的なプロトタイピングプラットフォームができたので、そのためのコードの開発に取り掛かることができました。以下の別のセクションで、コードの機能とレイアウトについて詳しく説明します。これがテストのビデオです。私がビデオの録画に使用したiPhone11が、超音波センサーの明確なソナーpingを実際に拾ったのはクレイジーです。これは、下のビデオで非常にはっきりと聞こえます(ただし、超音波パルスは、無害なクリックでほとんど登録できません。クリック-クリック)! 😊
すべてが機能していることを確認したら、先に進み、側壁と残りのコネクタと上部を追加して、エンクロージャを完成させました。
<図>
上部のビデオは、使用中の最終的な「製品」を示しています。 😊
<図>
コードを理解する
コンポーネントの初期化:
LEDバックパックライブラリのAdafruit_7segmentクラスを使用して、7セグメントディスプレイを初期化し、通信します。
Adafruit_7segment matrix =Adafruit_7segment();
また、HC-SR04のトリガーピンとエコーピンをそれぞれ出力と入力として初期化します
pinMode(trigPin、OUTPUT); pinMode(echoPin、INPUT); matrix.begin(0x70);
メインループでは、これが高レベルで行われることです:
1)超音波センサーの距離の読み取り値をチェックして、手洗いタイマーがトリガーされているかどうかを確認します。
2)「はい」の場合は、現在の時刻をメモし、カウントダウンタイマーを初期化し(20秒間20に設定します)、次に再生する音楽のジングルを選択します。最初にrandom()を使用してランダムなメロディーを選択しましたが、メロディーの配列全体で「ラウンドロビン」に変更し(最初に戻って循環)、startMusicを1に設定しました(カウントダウンと音楽の再生を設定します) 。
if(distance <10 &&!startMusic){startMusic =1; // initializeTimer1(); countDown =20; currentTime =millis(); melodyNum =(melodyNum + 1)%(NUM_MELODIES(melodies)); }
見てください遅延なし()!
ここでは、2つのことを同時に行っています。カウントダウンクロックを定期的に更新して、手洗いの残り秒数を示します。また、ジングルを処理して、適切なタイミングで再生したいと考えています。
できません したがって、delay()を使用してください。
音楽を再生する典型的な例では、Toneライブラリのtone()関数を使用し、適切な遅延を待ってから次の音符に移動して再生します。カウントダウンクロックを更新したいので、それは機能しません!
tone()は非ブロッキング呼び出しです。 Timer2を使用して、指定された時間だけ信号を送信します。つまり、その間、他の処理を自由に行うことができます。
delay()を使用する代わりに、millis()とローカル変数を使用して経過時間を把握し、その間に他のチェックや他の操作を実行できます。正確なコードをもう少し下で見ていきます。
音楽を簡単に書き写す-全音符、四分音符など
与えられたメロディーを演奏し、より多くのメロディーを簡単に書き写せるようにしたいのです。 Arduinoの音楽の例では、通常、2つの異なる配列が格納されます。1つは音符用で、もう1つは音符の長さ(ミリ秒単位)用です。
簡単にするために、音符とその指定された長さを関連付ける構造体を作成しました。また、絶対期間を使用する代わりに、#defines for
を作成した相対期間を使用しました。 typedef struct Note {int周波数;フロート期間; }注; #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)
お誕生日おめでとうを例にとってみましょう。
<図>
これは次のように書き写すことができます。楽譜が読めない場合は、実際に使用する音符を見つけてください。 🤓📚しかし、楽譜を読むことを学ぶことは常に持っている優れたスキルであり、あなたはそれがあまり得意である必要はありません-音符が何であるかを知るだけで、音楽をあなたに移調するために必要なことをすることができますArduino! 🤓📚
// Happy BirthdayNote melody [] ={{NOTE_G6、DOTTED(NOTE_EIGHTH)}、{NOTE_G6、NOTE_SIXTEENTH}、{NOTE_A6、NOTE_QUARTER}、{NOTE_G6、NOTE_QUARTER}、{NOTE_C7、NOTE_QUARTER}、{NOTE_C7、NOTE_QUARTER}、 、NOTE_HALF}、{NOTE_G6、DOTTED(NOTE_EIGHTH)}、{NOTE_G6、NOTE_SIXTEENTH}、{NOTE_A6、NOTE_QUARTER}、{NOTE_G6、NOTE_QUARTER}、{NOTE_D7、NOTE_QUARTER}、{NOTE_C7、NOTE_HA }、{NOTE_G6、NOTE_SIXTEENTH}、{NOTE_E7、NOTE_QUARTER}、{NOTE_D7、NOTE_QUARTER}、{NOTE_C7、NOTE_QUARTER}、{NOTE_B6、NOTE_QUARTER}、{NOTE_A6、NOTE_HALF}、{NOTE_F7、{NOTE_F7、DOT NOTE_SIXTEENTH}、{NOTE_E7、NOTE_QUARTER}、{NOTE_C7、NOTE_QUARTER}、{NOTE_D7、NOTE_QUARTER}、{NOTE_C7、NOTE_HALF}、};
ここでは実際の長さは使用していません。音符の相対的な長さを四分音符、8分音符、16分音符などとして指定しました。点線の音符を表すDOTTED()マクロもあります。 (1.5 xその前にある音符の長さ)。
メロディー自体は、この配列と、全音符が表す必要のある長さに関する追加情報で構成されます。
typedef struct Melody {注*注; int numNotes; intwholeNoteDurationMs; }メロディー;
C配列は、配列へのポインターを使用してサイズを変更できないため、Note配列のサイズとしてnumNotesを追加します。これは、MELODY_LENGTHマクロを使用して簡単に初期化できます。したがって、お気に入りの曲を書き写したときに、ノート配列に作成したノートの数を気にする必要はありません。
次に、プログラムで使用するそのようなメロディの配列を定義します。
Melody melodies [] ={{melody、MELODY_LENGTH(melody)、1250}、{melody3、MELODY_LENGTH(melody3)、1000}、{melody4、MELODY_LENGTH(melody4)、1000}};
ループでは、カウントダウンタイマーと音楽を開始するときに、上記の音符の情報、相対的な長さ、および全音符の実際の長さを使用して、音楽の再生方法を理解します。音楽を再生する間に、カウントダウンタイマーをチェックして更新し、7セグメントディスプレイに数値を表示します。
ジングル全体を聴き終えたいと思っているので、20秒経過してもジングルが終わるまで演奏を続けます(曲が終わるまでカウントダウンがマイナスになります)。ジングルが終了すると、超音波センサーの前でもう一度手を振ってさらにトリガーされるまで停止します。ジングルが短すぎると、20秒が経過して音楽の再生が終了するまで、もう一度再生されます。単純。
if(startMusic){//再生するメロディを選択するMelody mel =melodies [melodyNum];注* m =mel.notes; int mSize =mel.numNotes; // speedUpは、ノートの再生を高速化する簡単な方法です。最善の方法は、//全体のNoteDurationMsを適切に設定することです。 int speedUp =1; noTone(TONE_PIN); //(int thisNote =0; thisNote
コード全体はGitHubにあり、リポジトリへのリンクが含まれています。ここからコードをコピーして貼り付けるのではなく、そこからコードを取得することをお勧めします。
プロジェクトをさらに進める
コードサンプルをいじってコードを理解することに慣れたら、もっと多くのことをして学習を拡張しようとするのはいつでもいいことです。
このプロジェクトを前進させる方法に関するいくつかの提案を次に示します。
1) お気に入りの曲を見つけて、 注を使用して書き写すことができます および 注 期間 上で説明したマクロ。メモリ使用量を抑えるために、すでに定義されている他のジングルの1つ以上をコメントアウトすることを忘れないでください(以下で説明するように、Note配列とMelody配列をPROGMEMに正常に移動した場合を除きます!😊)
2) メロディはSRAMのスペースを占有し、使用可能なメモリをすぐに使い果たしてしまう可能性があります。たとえば、4つのメロディー(お誕生日おめでとう、Do-Re-Mi、We Will Rock You、Jeopardy!)を書き起こしました。しかし、これらはSRAMの使用率を96%に押し上げ、7セグメントディスプレイライブラリの機能に十分な余地がなく、適切に更新されていませんでした。すべてが正常に機能するためには、メロディーアレイからメロディーの1つを除外する必要がありました。
Arduino Unoには2kのSRAMが付属していますが、32kのフラッシュメモリ(プログラムが存在する場所)が付属しています。グローバル変数の一部をフラッシュメモリに移動できる場合は、プログラムの残りの部分のためにSRAMを解放できるだけでなく、さらに多くの曲を保存するためのスペースもあります。 Note配列とMelody配列をPROGMEMとして定義して、Flashに移動してみてください。 [注:これは高度な取り組みであり、重要です。あなた 予定 be 委任 配列 of 構造体 から プログラム および 次に 持っている から 読む progmem から アクセス データ。]
違いを理解するために、このプログラム(3つのメロディーを含む)は、Unoのプログラムストレージの31%と動的メモリの76%を占めていました。 PROGMEMで定義された上記の変数を使用すると、プログラムスペースの32%(フラッシュメモリの使用量がわずかに増加し、さらに多くの空き容量があります)と動的メモリの22%(76%から減少)を占有しました。つまり、 たっぷりを簡単に追加できます この タッチレスミュージカル手洗いタイマーへの曲の PROGMEMに移動したら! 😊
このプロジェクトを拡張する他の方法を考えられますか?以下で共有してください! 😊
ハッピーメイキング! 😊
コード
ProtoStaxタッチレスミュージカルハンドウォッシュタイマーのデモ
ProtoStaxタッチレスミュージカルハンドウォッシュタイマーデモhttps://github.com/protostax/ProtoStax_Touchless_Musical_Handwash_Timer 回路図
これは、タッチレスミュージカル手洗いカウントダウンタイマーで使用される回路の回路図を示しています 
製造プロセス