【Arduino入門】電子工作でLEDを2秒長押しスイッチでON/OFF制御する方法

Arduino

はじめに

今回は、スイッチを2秒間長押しすることで、Arduinoの出力をON/OFFできる回路を作成してみました。

「長押ししたときだけ」状態を切り替えるようにすることで、誤操作を防ぐことができます。
家電製品などでもよく見られますね!

この記事を読んでわかること

  • Arduinoを使ったスイッチ回路の作り方
  • 2秒長押しによるON/OFF制御のプログラム
  • 電子工作の面白さと応用のアイデア

使用パーツ

  • タクトスイッチ ×1
  • Arduino
  • LED(確認用)×1
  • 抵抗×5(100k × 3、39k × 1、1k × 1)
  • Pch FET:2sj681
  • Nch FET:2sk4017
  • トランジスタ:2sc1815
  • ブレッドボードとジャンパワイヤ

回路図と部品構成の解説

今回の回路では、スイッチの長押しで電源ON/OFFを制御できるように、トランジスタとFETを組み合わせた構成になっています。

Arduinoとの接続は以下の通りです。

  • D10ピン:Pch FET(2SJ681)のソースへ接続
  • D11ピン:Nch FET(2SK4017)のゲートへ接続
  • D12ピン:トランジスタ(2SC1815)のベース抵抗を経由して接続

回路図

各部品の役割

部品型番役割
タクトスイッチ押すとHIGHを入力。2秒間長押しで反応
トランジスタ2SC1815 (Q1)Pch FETを駆動するためのスイッチング制御
Pch FET2SJ681 (U2)電源ラインをON/OFFする主スイッチ素子
Nch FET2SK4017 (U1)Pch FETを駆動するためのスイッチング制御
LED + 抵抗D1 + R1(1kΩ)出力状態の確認用(ON状態で点灯)

プログラム

プログラム全体の動作説明

このプログラムは、**2つのスイッチ(ON・OFF)**によって、Arduinoのデジタル出力を制御します。特徴は、スイッチを2秒以上長押しすることでON/OFFを切り替える点です。

主な動作の流れ

  1. 初期状態:Tr_ONピンはLOW(電源OFF状態)
  2. スイッチ(ピン10)を2秒間押し続けると
    • Tr_ONピンHIGH になり、電源ON状態になります。
    • この状態を記録するために trOnState = true となります。
  3. スイッチを離すまで再度ONにできないようにする
    • onReleased フラグを使って、押されたままの状態では再トリガーしないように防止。
  4. OFFスイッチ(ピン11)を2秒間押し続けると
    • Tr_ONピンLOW になり、電源OFF状態になります。
    • trOnState = false に戻ります。
  5. 1秒ごとにスイッチ状態と出力状態をシリアルモニタに出力
    • 動作のデバッグや確認がしやすくなっています。

プログラムコード

// ピンの定義
const int On_Read_pin = 10; // ONスイッチの入力ピン
const int OFF_Read_pin = 11; // OFFスイッチの入力ピン
const int Tr_ON = 12; // トランジスタ制御出力ピン(リレーなどの制御)

// スイッチが押され始めた時間の記録用変数
unsigned long onStartTime = 0;
unsigned long offStartTime = 0;

// 出力状態とスイッチ状態の管理
bool trOnState = false; // 出力の現在状態(true = ON、false = OFF)
bool onReleased = true; // ONスイッチを離した状態かどうか(再トリガー防止)
bool offReleased = true; // OFFスイッチを離した状態かどうか(再トリガー防止)

void setup() {
pinMode(On_Read_pin, INPUT); // ONスイッチを入力に設定
pinMode(OFF_Read_pin, INPUT); // OFFスイッチを入力に設定
pinMode(Tr_ON, OUTPUT); // 出力ピンを出力に設定
digitalWrite(Tr_ON, LOW); // 初期状態ではOFF(LOW)

Serial.begin(9600); // シリアル通信開始(デバッグ用)
}

void loop() {
int onState = digitalRead(On_Read_pin); // ONスイッチの状態を読み取り
int offState = digitalRead(OFF_Read_pin); // OFFスイッチの状態を読み取り
unsigned long currentTime = millis(); // 現在の時間を取得(ms単位)

// —– ONスイッチ処理 —–
if (!trOnState) { // 現在OFFのときだけON動作を処理
if (onState == HIGH && onReleased) {
if (onStartTime == 0) {
onStartTime = currentTime; // 押し始めた時刻を記録
} else if (currentTime – onStartTime >= 2000) {
// 2秒以上押し続けていたらONにする
trOnState = true;
digitalWrite(Tr_ON, HIGH); // 出力ON
onReleased = false; // 押されたままでは再実行しない
onStartTime = 0;
}
} else if (onState == LOW) {
// スイッチを離したのでリセット
onStartTime = 0;
onReleased = true;
}
}

// —– OFFスイッチ処理 —–
if (trOnState) { // 現在ONのときだけOFF動作を処理
if (offState == HIGH && offReleased) {
if (offStartTime == 0) {
offStartTime = currentTime; // 押し始めた時刻を記録
} else if (currentTime – offStartTime >= 2000) {
// 2秒以上押し続けていたらOFFにする
trOnState = false;
digitalWrite(Tr_ON, LOW); // 出力OFF
offReleased = false;
offStartTime = 0;
}
} else if (offState == LOW) {
// スイッチを離したのでリセット
offStartTime = 0;
offReleased = true;
}
}

// —– シリアル出力 —–
static unsigned long lastPrint = 0;
if (currentTime – lastPrint >= 1000) {
// 1秒ごとに状態をシリアル出力(デバッグ表示)
Serial.print(“On_Read_pin: “);
Serial.print(onState);
Serial.print(” | OFF_Read_pin: “);
Serial.print(offState);
Serial.print(” | Tr_ON: “);
Serial.println(trOnState ? “HIGH” : “LOW”);
lastPrint = currentTime;
}
}

実際の動作動画

シリアルモニタでの確認結果

シリアルモニタでトランジスタやスイッチ、LEDの状態を確認できます。

まとめ

今回は、2秒以上の長押しで状態を切り替えるスイッチ制御回路をArduinoで実装してみました。

このような長押し処理は、誤動作を防ぐために家電や電子機器ではよく使われています。Arduinoなら簡単に再現できるので、ぜひ応用してみてください!

コメント

タイトルとURLをコピーしました