レッスン14/31-2:Arduinoコーディング millis() の例2(イベント付き)
このチュートリアルでは、Arduinoのmillis()関数を使用して、指定した時間が経過した後にのみアクションをトリガーする方法を学びます。プログラムの他の部分をブロックすることなく実行できます。これは、LEDの点滅とセンサーの読み取りやボタン押下の監視など、複数のタスクを同時に実行する必要があるレスポンシブなArduinoプロジェクトを作成するための基本的なテクニックです。この具体的な例では、5秒後にイベントをトリガーすることに焦点を当てていますが、このロジックは数え切れないほどの実際のシナリオに適用できます。
このパターンを自分のプロジェクトで使用できる実用的な例をいくつか示します。
- 遅延アクティベーション: システムが設定時間稼働した後にのみ、ファンやポンプをオンにします。
- 安全インターロック: モーターの起動などの危険なアクションを実行する前に、ボタンを一定時間押し続けることを要求します。
- 時間ベースのアラート: センサーの読み取り値が一定時間内に変化しない場合に、アラームや通知をトリガーします。
- ノンブロッキングタイマー: デバイスが応答しなくなった場合にリセットする「ウォッチドッグ」タイマーを作成します。
これが解決する中核的な問題は、delay()関数の制限です。delay(5000)を使用すると、Arduinoはその5秒間、他のコードの実行を停止します。これは単純なスケッチには問題ありませんが、待機中にセンサーを読み取ったり、ディスプレイを更新したり、ボタン押下を監視したりする必要がある複雑なプロジェクトでは大きな問題になります。millis()関数は、ボードの電源がオンになってからのミリ秒数をカウントし、プログラムを一時停止せずに時間を確認できます。
必要なハードウェア
- Arduinoボード(Uno、Nano、Megaなど)
- 押しボタン
- ジャンパーワイヤー
配線ガイド
この例の配線は非常に簡単です。内部プルアップ抵抗を使用するため、ボタン用の外部抵抗は不要です。
- 押しボタンの一方の足をArduinoのGNDピンに接続します。
- 押しボタンのもう一方の足をArduinoのデジタルピン2に接続します。
コードでINPUT_PULLUPを使用しているため、ボタンが押されていないときはピンがHIGHを読み取り、押されているときはLOWを読み取り、ピンがグランドに接続されます。(ビデオの08:29)
コードの理解
このコードは、単純なイベントベースのタイマーを示しています。プログラムは現在のmillis()値をシリアルモニターに継続的に出力します。押しボタンが押され続け、Arduinoが少なくとも5秒間実行されている場合、「Take action」とシリアルモニターに出力されます。重要なのは、millis()チェックが時間の継続的な出力を停止しないことです。
コードのユーザー設定可能な部分を詳しく見てみましょう。
unsigned long event = 5000;// 5秒
これは設定する最も重要な変数です。「イベント」の期間をミリ秒単位で定義します。この例では、5000に設定されており、これは5秒に相当します。遅延を変更するには、この数値を変更するだけです。たとえば、10000に設定すると、アクションは10秒後にトリガーされます。unsigned longデータ型を使用することが重要です。millis()の値は非常に大きくなる可能性があり、最終的には標準のint変数の最大値を超え、比較エラーが発生するためです。(ビデオの05:46)
pinMode(2,INPUT_PULLUP);
この行は、デジタルピン2を入力として設定し、内部プルアップ抵抗を有効にします。これは、外部抵抗なしでボタンを接続できるようにするための重要な設定手順です。ピンはデフォルトでHIGHを読み取り、ボタンが押されてグランドに接続されるとLOWになります。別のピンを使用する場合は、ここおよびループ内のdigitalRead(2)行の番号2を変更します。(ビデオの08:46)
loop()内のロジックは単純です。ボタンの状態を読み取ります。ボタンが押されている場合(pb == LOW)、現在の時間(millis())が定義したevent時間以上かどうかをチェックします。両方の条件が真の場合、アクションメッセージを出力します。ループの残りの部分(時間を出力する部分)は中断されることなく実行され続け、delay()に対するmillis()の利点を示しています。
この例では、Arduinoが起動した瞬間からの時間をチェックしています。ビデオシリーズの3番目の例では、最初のボタン押下の時間を記録し、少なくとも5秒後に2回目の押下が発生した場合にのみアクションをトリガーするという、このロジックをさらに発展させています。そのロジックはレッスン14/31-3:Arduinoコーディング millis() 例3(押しボタン付き)で説明されています。
ライブプロジェクトデモ
コードをアップロードしてシリアルモニター(9600ボー)を開くと、ボードの電源がオンになってからのミリ秒を表す数字の連続ストリームが表示されます。5秒が経過する前に押しボタンを押し続けても、何も起こりません。ただし、5秒経過後にボタンを押し続けると、シリアルモニターに「Take action」というメッセージが表示されます。ボタンが押されている間、アクションは出力され続けます。これは、他のコード(出力)をシームレスに実行できるノンブロッキングタイマーを示しています。(ビデオの10:52)
この動画からの関連プロジェクト
この動画は、Arduinoのタイミングとマッピング関数に関する複数回のシリーズの一部です。同じソース資料から作成された他のチュートリアルもご覧ください:
- レッスン14/31-1:Arduino Millis(delayなし)とmap関数 | SunFounder Robojax
- レッスン14/31-3:Arduinoコーディング millis() 例3 プッシュボタン付き
- レッスン14/31-4:Arduinoコーディング map() 例1
- レッスン14/31-5:Arduinoコーディング map() 例2
チャプター
- [00:00] millis()とSunFounderキットの紹介
- [01:19] millis()とは何か、なぜdelay()の代わりに使うのか?
- [03:06] 実演:millis()の値を表示する
- [05:46] millis()とunsigned longを使ったイベントの作成
- [08:29] INPUT_PULLUPを使ったプッシュボタンの配線とコーディング
- [10:52] プッシュボタンを使ったイベント例の実行
- [12:14] 例3のプレビュー:2回目のボタン押下の検出
- [17:20] map()関数の紹介
- [19:47] LEDを使ったmap()関数のコーディングと実演
/*
Lesson 14/31: Arduino coding millis() example 2 with event
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
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// Robojax.com millis() example 1
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW)
{
if(millis() >= event)
{
Serial.println("Take action");
}// if end
}// if end
}// loop end
必要かもしれないもの
-
アマゾンSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.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