レッスン14/31-3:Arduinoコーディング millis() 例3 プッシュボタン付き
Arduinoに、いつ何かが起こったか(ボタン押下など)を記憶させ、その後正確な時間が経過したらアクションを実行しつつ、プログラムの他の部分をスムーズに動かし続ける必要があったことはありますか?これはArduinoプログラミングにおける古典的な課題であり、その解決策がmillis()関数です。このチュートリアルは、Robojax Arduinoコースの一部で、実用的な例を示しています:押しボタンが最初に押されてから5秒の遅延が経過した後に、2回目に押されたかどうかを検出します。この技術は、タイミングが重要で、応答性が高く、ブロッキングしないプロジェクトを作成するための基礎となります。
プログラムを停止させずに時間を追跡するためのmillis()を使用するこのパターンは、幅広い実世界のアプリケーションに不可欠です。ここに、独自のプロジェクトのアイデアをいくつか紹介します:
- デバウンスされたボタンインターフェース:デバイスの電源を入れるために、ボタンを特定の時間(例:3秒間)押し続ける必要があるシステムを実装し、誤った押下を防ぎます。
- シーケンシャルアクション:モーションセンサーのトリガーなどの1つのイベントが、特定の時間枠内に別のイベントが発生した場合にのみ発生する二次アクションを有効にするシステムを作成します。
- ユーザーインタラクションタイマー:コマンド送信やモーター起動などの重要な機能を実行するために、設定時間内に「確認」入力(2回目のボタン押下など)を必要とするプロジェクトを構築します。
- センサーゲーティング:センサーからの最初の信号を使用してタイミングウィンドウを開始し、その間に2番目の異なるセンサーの読み取りが有効と見なされるか、無視されるようにします。
必要なハードウェア
このプロジェクトでは、学習に最適なリソースであるSunFounder 3-in-1 Arduinoキットのコンポーネントを使用します。必要なものは次のとおりです:
- Arduinoボード(Uno、Nanoなど)
- モーメンタリ押しボタン
- ジャンパーワイヤー
配線ガイド
この例の配線は、Arduinoの内部プルアップ抵抗のおかげで非常に簡単で、外部抵抗が不要になります。(ビデオの08:29で)
- 押しボタンの一方の足をArduinoのGNDピンに接続します。
- 押しボタンのもう一方の足をArduinoのデジタルピン2に接続します。
INPUT_PULLUPを使用することで、ピンは内部的に5Vに接続され、通常はHIGHを読み取ります。ボタンが押されると、ピンがGNDに接続され、LOWを読み取ります。これがコードで使用するロジックです。
コードの説明
このプロジェクトの核心は、最初のボタン押下を追跡し、特定の時間間隔後に2回目の押下をチェックするロジックです。コードはブロッキングしないように設計されており、loop()内の他のタスクの実行を一時停止しません。
スケッチの先頭には、タイミング動作を制御する主要なユーザー設定可能な変数があります:
unsigned long event = 5000;// 5秒
unsigned long buttonPushed =0;
event:これは重要なタイミング変数です。遅延時間をミリ秒単位で設定します。この例では、5000に設定されており、5秒に相当します。この値をプロジェクトのニーズに合わせて他の任意の時間に変更できます。buttonPushed:この変数はフラグとタイムスタンプとして使用されます。最初は0で、ボタンが最初に押されたときにmillis()の値に更新されます。この保存された時間は、2回目の押下チェックの差を計算するために使用されます。
loop()関数内のロジックは2段階で動作します。まず、ボタンの状態を読み取り、最初の押下の場合(pb == LOW && buttonPushed == 0)、millis()を介して現在の時間をbuttonPushed変数に記録します。2番目の段階では、ボタンがまだ押されているかどうか、および最初の押下が記録されているかどうかをチェックします。その場合、現在の時間と最初の押下時間の差を計算します。この差がevent時間以上の場合、アクションを実行します—この場合は、シリアルモニターにメッセージを出力します。
ライブプロジェクトデモンストレーション
ビデオでは、コードがArduinoにアップロードされ、シリアルモニターが開かれて動作が観察されます。(ビデオの16:03で)millis()の値が継続的に出力され、プログラム開始からの経過時間が表示されます。ボタンを最初に押すと、First push at:5019のようなメッセージが出力されます。最初の押下から5秒以上経過した後にボタンを再度押し続けると、Action after 5 seconds of first pushというメッセージが出力されます。これは、指定された遅延が経過した後に2回目の押下が発生した場合にのみアクションがトリガーされることを示しています。
このアプローチの利点は、ループの先頭にあるSerial.println(millis())行が中断なく実行され続けることで、タイミングロジックが他のコードの実行をブロックしないことを証明しています。これは、delay()関数ではなくmillis()を使用する根本的な利点です。
このビデオからの関連プロジェクト
- レッスン14/31-1: Arduino Millis(delayなし)とmap関数 | SunFounder Robojax
- レッスン14/31-2: Arduinoコーディング millis() 例2 イベント付き
- レッスン14/31-4: Arduinoコーディング map() 例1
- レッスン14/31-5: Arduinoコーディング map() 例2
チャプター
- [00:00] millis()とコースの紹介
- [01:19] millis()とは何か、なぜ使うのか?
- [03:06] 最初の実践例:millis()の出力
- [05:46] millis()を使って5秒後にイベントをトリガーする
- [08:29] 例2:5秒の遅延付きプッシュボタン操作
- [12:14] 例3:遅延後の2回目のボタン押下を検出する
- [17:20] map()関数の紹介
- [19:47] LED輝度パーセンテージのマッピングの実践例
/*
Lesson 14/31: Arduino coding millis() example 3 with push button
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
unsigned long event = 5000;// 5 seconds
unsigned long buttonPushed =0;
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// ilmoFan.com example-2 millis()
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW && buttonPushed ==0)
{
buttonPushed =millis();
Serial.print("First push at:");
Serial.println(buttonPushed);
}
if( pb ==LOW && buttonPushed >0 )
{
unsigned long difference = millis()- buttonPushed;
if( difference >= event)
{
Serial.println("Action after 5 seconds of first push");
}
}
}
必要かもしれないもの
-
アマゾンSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
アマゾン
-
アマゾン
-
アマゾン
リソースと参考文献
-
ドキュメンテーションSunFounder 3 in 1 IoT/スマートカー/学習キットのドキュメントdocs.sunfounder.com
-
外部SunFounderの3-in-1スマートカー学習キットを購入するsunfounder.com
ファイル📁
ユーザーマニュアル
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB